La estrategia de cruce de la EMA doble es una estrategia típica de seguimiento de tendencias. Utiliza dos líneas de EMA de períodos diferentes y genera señales de negociación basadas en su cruce. Cuando la EMA más rápida cruza por encima de la EMA más lenta, se genera una señal de compra. Cuando la EMA más rápida cruza por debajo de la EMA más lenta, se genera una señal de venta. Esta estrategia puede rastrear las tendencias a medio y largo plazo y capturar oportunidades de negociación en las etapas de inicio de la tendencia.
Los componentes clave de esta estrategia son:
Establezca longitudes para la EMA más rápida y la EMA más lenta.
Calcula la EMA más rápida y la EMA más lenta.
Determinar situaciones de cruce de la EMA para generar señales comerciales. Cuando la EMA más rápida cruza por encima de la EMA más lenta, se genera una señal de compra. Cuando la EMA más rápida cruza por debajo de la EMA más lenta, se genera una señal de venta.
Cuando se va largo, las posiciones cortas existentes se cierran primero antes de abrir posiciones largas.
Establecer puntos de stop loss. Cuando se va largo, el stop loss se activa si el precio cae por debajo del mínimo anterior por un porcentaje establecido.
Las posiciones largas se cierran cuando la EMA más rápida cruza por debajo de la EMA más lenta. Las posiciones cortas se cierran cuando la EMA más rápida cruza por encima de la EMA más lenta.
La lógica es simple e intuitiva. El cruce de las dos líneas es una forma clásica de detectar cambios de tendencia.
Las ventajas de esta estrategia son:
Concepto sencillo, fácil de entender e implementar.
Puede rastrear de manera efectiva las tendencias a medio y largo plazo y aprovechar las oportunidades a tiempo.
La configuración de EMA dual evita el ruido de las fluctuaciones del mercado a corto plazo.
Tiene reglas claras de entrada, reglas de salida y reglas de stop loss.
Sólo necesita unos pocos parámetros, no es propenso a la sobreajuste.
Los resultados de las pruebas de retroceso son buenos, son viables para el comercio en vivo y pueden utilizarse de forma independiente o combinadas con otras estrategias.
Algunos riesgos de esta estrategia:
Los parámetros deben ajustarse para filtrar las señales no válidas.
No puede manejar bien situaciones de variación y reversión de tendencia, necesita confirmación de otros indicadores.
La estrategia de doble EMA tiende a perseguir máximos y vender mínimos.
Los resultados de las pruebas de retroceso pueden estar sobreajustados en cierta medida.
No hay un stop loss oportuno puede conducir a grandes pérdidas.
Los costes de transacción pueden afectar a la rentabilidad real.
Algunas maneras de mejorar la estrategia:
Optimice los parámetros del período EMA para encontrar la mejor combinación, utilizando la optimización avanzada y el aprendizaje automático.
Añadir indicadores de filtro de tendencia como ADX, CCI, etc. para evitar el comercio en tendencias inciertas.
Añadir indicadores de volumen como el volumen de negociación, en el volumen de balance para asegurar que el comercio real está impulsando las señales.
Implementar un stop loss dinámico para ajustar automáticamente las paradas en función de la volatilidad del mercado.
Combinar productos correlacionados para utilizar la correlación para la gestión del riesgo.
Introducir el aprendizaje automático para la optimización de parámetros, ingeniería de características, filtrado de señales, etc.
Tenga en cuenta los costos de transacción, ajuste las paradas y el tamaño para reducir la frecuencia comercial.
Personalizar los parámetros en función de las características del producto para mejorar la adaptabilidad.
Diseñar un marco estratégico compuesto, combinado con otras estrategias para mejorar la robustez.
Estas mejoras pueden hacer que la estrategia sea más robusta y rentable para el comercio en vivo.
Esta estrategia utiliza un doble cruce de EMA para generar señales comerciales y puede rastrear efectivamente las tendencias a mediano y largo plazo. Las ventajas se encuentran en su simplicidad y buenos resultados de backtest, lo que hace que sea fácil de usar para los principiantes. Pero los riesgos existen y deben gestionarse a través de la optimización de parámetros, la adición de indicadores, paradas dinámicas, optimización de los costos comerciales, etc. La estrategia se puede usar de forma independiente o combinada con otros para mayor practicidad.
/*backtest start: 2022-10-23 00:00:00 end: 2023-10-29 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title = "EMA Cross Strategy", shorttitle = "EMA Cross",calc_on_order_fills=true,calc_on_every_tick =true, initial_capital=21000,commission_value=.25,overlay = true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100) StartYear = input(2018, "Backtest Start Year") StartMonth = input(1, "Backtest Start Month") StartDay = input(1, "Backtest Start Day") UseStopLoss = input(true,"UseStopLoss") window() => time >= timestamp(StartYear, StartMonth, StartDay,00,00) ? true : false stopLoss = input(20, title = "Stop loss percentage(0.1%)") maFastSource = input(defval = open, title = "Fast MA Source") maFastLength = input(defval = 12, title = "Fast MA Period", minval = 1) // long ma maSlowSource = input(defval = open, title = "Slow MA Source") maSlowLength = input(defval = 26, title = "Slow MA Period", minval = 1) maFast = ema(maFastSource, maFastLength) maSlow = ema(maSlowSource, maSlowLength) fast = plot(maFast, title = "Fast MA", color = #7a8598, linewidth = 2, style = line, transp = 50) slow = plot(maSlow, title = "Slow MA", color = #e08937, linewidth = 2, style = line, transp = 50) longEMA = crossover(maFast, maSlow) exitLong = crossunder(maFast, maSlow) shortEMA = crossover(maSlow, maFast) exitShort = crossover(maFast, maSlow) if (longEMA) strategy.entry("LongId", strategy.long, when=window()) if (shortEMA) strategy.entry("ShortId", strategy.short, when=window()) if (UseStopLoss) strategy.exit("StopLoss", "LongId", loss = close * stopLoss / 1000 / syminfo.mintick) strategy.exit("StopLoss", "ShortId", loss = close * stopLoss / 1000 / syminfo.mintick)