Esta estrategia se basa en el principio de cruce de los promedios móviles para el comercio. Utiliza dos promedios móviles, generando señales de compra cuando el promedio móvil a corto plazo cruza por encima del promedio móvil a largo plazo desde abajo. Las señales de venta se generan cuando el precio se rompe por debajo de otro promedio móvil. Esta estrategia es adecuada para los mercados de tendencia, capaz de filtrar efectivamente algunas operaciones de ruido y capturar la tendencia principal.
Esta estrategia utiliza períodos de promedio móvil a corto y largo plazo personalizables por el usuario, período de media móvil de salida y métodos de cálculo de promedio móvil.
Cuando la media móvil a corto plazo cruza por encima de la media móvil a largo plazo desde abajo, se genera una señal de compra. Esto indica que la tendencia a corto plazo ha cambiado a una tendencia alcista, y podemos comprar.
Cuando el precio de cierre se rompe por debajo de la media móvil de salida, se genera una señal de venta. Esto indica una inversión de tendencia, por lo que debemos salir de la posición.
Por lo tanto, las señales de negociación de la estrategia provienen del cruce de las medias móviles a corto y largo plazo y la relación entre el precio de cierre y la media móvil de salida.
Las ventajas de esta estrategia son:
Simple y fácil de implementar.
Los parámetros personalizables se adaptan a las diferentes condiciones del mercado.
Las medias móviles filtran el ruido y capturan la tendencia principal.
Puede incorporar otros indicadores técnicos como tendencia, soporte / resistencia para optimizar aún más.
Relación riesgo-recompensa controlada, tiene un mecanismo de stop loss.
Los riesgos son:
Es propenso a señales falsas en mercados de consolidación que no están en tendencia.
La configuración incorrecta de los parámetros puede causar tendencias faltantes o demasiadas operaciones no válidas.
La colocación incorrecta de un stop loss podría aumentar las pérdidas.
Las fugas fallidas pueden causar pérdidas.
Los parámetros deben ajustarse oportunamente para adaptarse a los cambios del mercado.
Las soluciones incluyen la optimización de parámetros, la incorporación de otros filtros, el ajuste de paradas, la espera de la confirmación de la tendencia antes de negociar, etc.
Esta estrategia puede mejorarse mediante:
Desarrollo de mecanismos de determinación de tendencias y negociación únicamente después de la confirmación de tendencias.
Añadir filtros como volumen o volatilidad a las señales de filtro.
Optimización dinámica de los períodos de media móvil.
Optimizando el mecanismo de stop loss para utilizar un trailing stop.
Incorporación de soporte/resistencia y otros indicadores para confirmar aún más las señales.
Ajuste de parámetros basados en diferentes productos y plazos.
En general, esta estrategia de cruce de promedios móviles es un sistema de seguimiento de tendencias simple y práctico. Se puede ajustar a las condiciones del mercado ajustando los parámetros y capturando la dirección de la tendencia principal en los mercados de tendencia. Pero se deben tener en cuenta riesgos como la identificación errónea de la tendencia y se necesita una optimización constante para adaptarse a los mercados cambiantes. En general, esta estrategia tiene una buena viabilidad.
/*backtest start: 2022-10-30 00:00:00 end: 2023-11-05 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TwoChiefs //@version=4 strategy("John EMA Crossover Strategy", overlay=true) //////////////////////////////////////////////////////////////////////////////// // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2021, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true //////////////////////////////////////////////////////////////////////////////// //CREATE USER-INPUT VARIABLES periodShort = input(13, minval=1, title="Enter Period for Short Moving Average") smoothingShort = input(title="Choose Smoothing Type for Short Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodLong = input(48, minval=1, title="Enter Period for Long Moving Average") smoothingLong = input(title="Choose Smoothing Type for Long Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodExit = input(30, minval=1, title="Enter Period for Exit Moving Average") smoothingExit = input(title="Choose Smoothing Type for Exit Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) src1 = close pivot = (high + low + close) / 3 //MA CALCULATION FUNCTION ma(smoothing, src, length) => if smoothing == "RMA" rma(src, length) else if smoothing == "SMA" sma(src, length) else if smoothing == "EMA" ema(src, length) else if smoothing == "WMA" wma(src, length) else if smoothing == "VWMA" vwma(src, length) else if smoothing == "SMMA" na(src[1]) ? sma(src, length) : (src[1] * (length - 1) + src) / length else if smoothing == "HullMA" wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length))) //ASSIGN A MOVING AVERAGE RESULT TO A VARIABLE shortMA=ma(smoothingShort, pivot, periodShort) longMA=ma(smoothingLong, pivot, periodLong) exitMA=ma(smoothingExit, pivot, periodExit) //PLOT THOSE VARIABLES plot(shortMA, linewidth=4, color=color.yellow,title="The Short Moving Average") plot(longMA, linewidth=4, color=color.blue,title="The Long Moving Average") plot(exitMA, linewidth=1, color=color.red,title="The Exit CrossUnder Moving Average") //BUY STRATEGY buy = crossover(shortMA,longMA) ? true : na exit = crossunder(close,exitMA) ? true : na strategy.entry("long",true,when=buy and time_cond) strategy.close("long",when=exit and time_cond) if (not time_cond) strategy.close_all()