La estrategia de toma de ganancias y parada de pérdidas de la media móvil exponencial triple es una estrategia de seguimiento de tendencias basada en tres promedios móviles exponenciales con diferentes períodos para la entrada y salida del mercado.
La estrategia utiliza tres promedios móviles exponenciales: línea rápida, línea media y línea lenta. Va largo cuando la línea media cruza por encima de la línea lenta, y cierra la posición cuando la línea rápida cruza por debajo de la línea media. Esta es una estrategia típica de seguimiento de tendencias que determina la direccionalidad de la tendencia a través del cruce de los tres promedios móviles.
Al mismo tiempo, la estrategia aprovecha el indicador Average True Range para calcular los niveles de toma de ganancias y stop-loss. Específicamente, la toma de ganancias para posiciones largas es el precio de entrada + Average True Range * factor de ganancia, y para posiciones cortas es el precio de entrada - Average True Range * factor de ganancia. La lógica de stop loss es similar. Esto limita efectivamente el riesgo de grandes pérdidas.
Las medidas de mitigación del riesgo incluyen: acortar los períodos de media móvil, optimizar el factor de ganancia/detención y añadir indicadores auxiliares.
En general, esta es una estrategia de seguimiento de tendencias efectiva con un rendimiento estable y una implementación fácil a través de parámetros simples. La toma de ganancias dinámica y el stop loss basado en el Rango Verdadero Medio limita el riesgo por lado. Pero la optimización de parámetros y las combinaciones de indicadores deben hacerse cuidadosamente para evitar el sobreajuste o el retraso en la decisión. En balance, esta estrategia tiene un buen perfil de riesgo-recompensación y vale la pena considerar.
/*backtest start: 2024-01-04 00:00:00 end: 2024-02-03 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //© Densz strategy("3EMA with TP & SL (ATR)", overlay=true ) // INPUTS startTime = input(title="Start Time", type = input.time, defval = timestamp("01 Jan 2017 00:00 +0000")) endTime = input(title="End Time", type = input.time, defval = timestamp("01 Jan 2022 00:00 +0000")) slowEMALength = input(title="Slow EMA Length", type = input.integer, defval = 55) middleEMALength = input(title="Middle EMA Length", type = input.integer, defval = 21) fastEMALength = input(title="Fast EMA Length", type = input.integer, defval = 9) trendMALength = input(title="Trend indicator MA Length", type = input.integer, defval = 200) atrLength = input(title="ATR Length", type = input.integer, defval = 14) tpATRMult = input(title="Take profit ATR multiplier", type = input.integer, defval = 3) slATRMult = input(title="Stop loss ATR multiplier", type = input.integer, defval = 2) rsiLength = input(title="RSI Length", type = input.integer, defval = 14) // Indicators slowEMA = ema(close, slowEMALength) middEMA = ema(close, middleEMALength) fastEMA = ema(close, fastEMALength) atr = atr(atrLength) rsiValue = rsi(close, rsiLength) isRsiOB = rsiValue >= 80 isRsiOS = rsiValue <= 20 sma200 = sma(close, trendMALength) inDateRange = true // Plotting plot(slowEMA, title="Slow EMA", color=color.red, linewidth=2, transp=50) plot(middEMA, title="Middle EMA", color=color.orange, linewidth=2, transp=50) plot(fastEMA, title="Fast EMA", color=color.green, linewidth=2, transp=50) plot(sma200, title="SMA Trend indicator", color=color.purple, linewidth=3, transp=10) plotshape(isRsiOB, title="Overbought", location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, text="OB") plotshape(isRsiOS, title="Oversold", location=location.belowbar, color=color.green, transp=0, style=shape.triangledown, text="OS") float takeprofit = na float stoploss = na var line tpline = na var line slline = na if strategy.position_size != 0 takeprofit := takeprofit[1] stoploss := stoploss[1] line.set_x2(tpline, bar_index) line.set_x2(slline, bar_index) line.set_extend(tpline, extend.none) line.set_extend(slline, extend.none) // STRATEGY goLong = crossover(middEMA, slowEMA) and inDateRange closeLong = crossunder(fastEMA, middEMA) and inDateRange if goLong takeprofit := close + atr * tpATRMult stoploss := close - atr * slATRMult // tpline := line.new(bar_index, takeprofit, bar_index, takeprofit, color=color.green, width=2, extend=extend.right, style=line.style_dotted) // slline := line.new(bar_index, stoploss, bar_index, stoploss, color=color.red, width=2, extend=extend.right, style=line.style_dotted) // label.new(bar_index, takeprofit, "TP", style=label.style_labeldown) // label.new(bar_index, stoploss, "SL", style=label.style_labelup) strategy.entry("Long", strategy.long, when = goLong) strategy.exit("TP/SL", "Long", stop=stoploss, limit=takeprofit) if closeLong takeprofit := na stoploss := na strategy.close(id = "Long", when = closeLong) if (not inDateRange) strategy.close_all()