La estrategia de cruce de promedios móviles es una estrategia de negociación cuantitativa simple pero efectiva basada en promedios móviles. Utiliza el cruce de una línea de promedio móvil rápido y una línea de promedio móvil lento para generar señales de compra y venta. Cuando la línea rápida atraviesa la línea lenta desde abajo, se genera una señal de compra. Cuando la línea rápida atraviesa la línea lenta desde arriba, se genera una señal de venta.
La lógica central de esta estrategia radica en el uso de promedios móviles para juzgar las tendencias del mercado. Los promedios móviles tienen la funcionalidad de filtrar el ruido aleatorio del mercado. El promedio móvil rápido puede responder a los cambios de precios más rápido y reflejar las últimas tendencias, mientras que el promedio móvil lento responde más lentamente a los últimos cambios de precios y representa tendencias de mediano a largo plazo.
Específicamente, esta estrategia primero define la media móvil rápida sig1 y la media móvil lenta sig2. Luego, los puntos de compra y venta se determinan de acuerdo con las relaciones cruzadas entre sig1 y sig2. Cuando sig1 rompe sig2 desde abajo, se genera una condición larga longCondition. Cuando sig1 rompe sig2 desde arriba, se genera una condición corta shortCondition. La estrategia luego coloca órdenes cuando se cumplen las condiciones largas y cortas, y establece órdenes de stop loss y take profit para salir.
Las ventajas de esta estrategia son significativas:
También hay algunos riesgos con esta estrategia:
Medidas de optimización:
En general, la estrategia de cruce de promedios móviles es una estrategia cuántica con lógica simple, gran practicidad y estabilidad. Con ajuste de parámetros y optimizaciones adecuadas, puede generar ganancias constantes en varios entornos de mercado. Vale la pena centrarse y aplicar para los operadores cuantitativos.
/*backtest start: 2023-11-14 00:00:00 end: 2023-11-16 04:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 // Simple yet effective MA cross strategy. // You'll have to tune the parameters to get an optimal win ratio. // If JPY or XAU or any other currency with pips defined as the // second decimal digit are involved, do not forget to set the respective flag on. // // Created by vitelot/yanez/Vts, who's the same fellow with different user names // December 2018 -- Merry Xmas // strategy("MA cross strategy Vts", overlay=true, initial_capital=1000, currency="EUR", pyramiding=0) yr = input(2016, title="Starting year to analyse") src = input(close, title="Source") maType = input( defval="EMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA"]) // isJPY = input(false, title="Is JPY or XAU involved?") // JPY and Gold have the pips defined as the 2 decimal digit maPar1 = input(26, minval=1, title="MA fast period") maPar2 = input(51, minval=2, title="MA slow period") atrPar = input(14,minval=1, title="ATR period") atrMulSL = input(1.5, title="SL ATR multiplicator") atrMulTP = input(1.0, title="TP ATR multiplicator") hma(sig, n) => // Hull moving average definition wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n))) mcg(sig,length) => // Mc Ginley MA definition mg = 0.0 mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4)) ma(t,sig,len) => if t =="SMA" sma(sig,len) else if t == "EMA" ema(sig,len) else if t == "HMA" hma(sig,len) else if t == "McG" // Mc Ginley mcg(sig,len) else wma(sig,len) sig1 = ma(maType, src, maPar1) sig2 = ma(maType, src, maPar2) tickFactor = isJPY? 1e3: 1e5 sl = atrMulSL*atr(atrPar)*tickFactor tp = atrMulTP*atr(atrPar)*tickFactor plot(sig1, color=aqua, title="MA1", linewidth=2) plot(sig2, color=orange, title="MA2", linewidth=2) longCondition = crossunder(sig2, sig1) and year>=yr // change the >= to == if you like exact years not a range if (longCondition) strategy.entry("Long", strategy.long, qty=1) // exit trade when SL and TP are hit strategy.exit("Exit Long", "Long", loss=sl, profit=tp) if (crossunder(sig1, sig2)) // or when the short condition is met strategy.close("Long") shortCondition = crossover(sig2,sig1) and year>=yr // change the >= to == if you like exact years not a range if (shortCondition) strategy.entry("Short", strategy.short, qty=1) strategy.exit("Exit Short", "Short", loss=sl, profit=tp) if (crossover(sig1,sig2)) strategy.close("Short")