Esta estrategia es una típica estrategia de cruce de promedios móviles que utiliza dos conjuntos de promedios móviles, uno rápido y otro lento. Cuando el promedio móvil rápido cruza el promedio móvil lento, se genera una señal de compra. Cuando el rápido cruza por debajo del lento, se genera una señal de venta. La estrategia utiliza tanto EMA como SMA para los promedios móviles, con EMA como las líneas rápidas y SMA como las líneas lentas.
La lógica central se basa en los cruces entre las líneas de promedio móvil rápido y lento para determinar entradas y salidas.
Específicamente, se calculan dos conjuntos de medias móviles rápidas y lentas:
Luego se comprueban los cruces entre las EMA rápidas y las SMA lentas:
Para filtrar las señales falsas, se requiere un segundo cruce EMA/SMA para la confirmación:
Al requerir dos cruces MA rápidos / lentos, se pueden filtrar muchas señales falsas y mejorar la confiabilidad.
Cuando compras activadores de señal, ve largo. Cuando vendes activadores de señal, ve corto.
La estrategia también establece la toma de ganancias y el stop loss basados en el porcentaje de entrada del precio de entrada una vez en una posición.
Las ventajas de esta estrategia incluyen:
Riesgos de la estrategia:
Para controlar los riesgos:
La estrategia se puede optimizar aún más mediante:
En resumen, la doble estrategia de cruce de MA genera señales con cruces de MA rápidos / lentos, conjuntos toman ganancias y stop loss para controlar riesgos, y es simple, intuitiva y fácil de implementar.
/*backtest start: 2023-02-20 00:00:00 end: 2024-02-26 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/ // © JMLSlop //@version=4 src = close strategy("Crossover moving averages", shorttitle="Cross MA-EMA", overlay=true, calc_on_order_fills=false) // first fast EMA len = input(8, "Length", type=input.integer, minval=1) doma1 = input(true, title="EMA") out1 = ema(src, len) //Second fast EMA len2 = input(21, minval=1, title="Length") doma2 = input(true, title="EMA") out2 = ema(src, len2) //First slow MA len3 = input(50, minval=1, title="Length") doma3 = input(true, title="SMA") out3 = sma(src, len3) //Second slow MA len4 = input(200, minval=1, title="Length") doma4 = input(true, title="SMA") out4 = sma(src, len4) // Profit profit = input(8, "Profit/lost %", type=input.float, minval=1) * 0.01 plot(doma1 and out1 ? out1: na, color=color.blue, linewidth=1, title="1st EMA") plot(doma2 and out2 ? out2: na, color=color.red, linewidth=1, title="2nd EMA") plot(doma3 and out3 ? out3: na, color=color.green, linewidth=2, title="1st MA") plot(doma4 and out4 ? out4: na, color=color.orange, linewidth=3, title="2nd MA") // Orders config takeProfitPrice = (strategy.position_size > 0) ? strategy.position_avg_price + open*profit : (strategy.position_size < 0) ? strategy.position_avg_price - (open*profit) : na longStopPrice = strategy.position_avg_price * (1 - profit) shortStopPrice = strategy.position_avg_price * (1 + profit) longCondition2 = (out2>out3 and (crossover(out1, out4) or crossover(out1[1], out4[1]) or crossover(out1[2], out4[2]) or (crossover(out1[3], out4[3]))) or (out2>out3 and (crossover(out1, out3) or crossover(out1[1], out3[1]) or crossover(out1[2], out3[2]) or crossover(out1[3], out3[3])))) if (longCondition2) strategy.entry("Enter L", strategy.long) shortCondition2 = (out2<out3 and (crossunder(out1, out4) or crossunder(out1[1], out4[1]) or crossunder(out1[2], out4[2]) or crossunder(out1[3], out4[3]))) or (out2<out3 and (crossunder(out1, out3) or crossunder(out1[1], out3[1]) or crossunder(out1[2], out3[2]) or crossunder(out1[3], out3[3]))) if (shortCondition2) strategy.entry("Enter S", strategy.short) if (strategy.position_size > 0) strategy.exit("Exit L", limit=takeProfitPrice, stop=longStopPrice) if (strategy.position_size < 0) strategy.exit("Exit S", limit=takeProfitPrice, stop=shortStopPrice)