Esta estrategia es un sistema de seguimiento de tendencias que combina múltiples indicadores técnicos, principalmente integrando cinco promedios móviles exponenciales (EMA) de diferentes períodos, el índice de fuerza relativa (RSI) y dos canales de Donchian de diferentes períodos.
La estrategia emplea múltiples indicadores técnicos para la confirmación de señales: en primer lugar, utiliza 5 EMA (9, 21, 55, 89, 144 períodos) para construir un marco de tendencia, determinando la dirección de tendencia inicial a través de cruces entre EMA rápidos y lentos. En segundo lugar, utiliza el RSI (14 períodos) como filtro de tendencia, requiriendo que el RSI esté en la zona de sobrecompra (por encima de 60) para posiciones largas y en la zona de sobreventa (por debajo de 40) para posiciones cortas, evitando así el comercio frecuente en mercados de rango. Finalmente, utiliza canales Donchian de 21 períodos y 74 períodos para definir rangos de movimiento de precios, proporcionando una referencia adicional de estructura de mercado para la negociación.
La estrategia construye un sistema comercial relativamente completo a través de la combinación de múltiples indicadores técnicos. Aunque tiene cierto retraso, puede lograr retornos estables en los mercados de tendencia a través de un estricto filtrado de señales y gestión de riesgos. Se aconseja a los operadores que ajusten los parámetros de acuerdo con las características específicas del mercado y su tolerancia al riesgo en aplicaciones prácticas. Mientras tanto, es necesario un monitoreo continuo del rendimiento del sistema y una evaluación regular de las direcciones de optimización para garantizar que la estrategia siga siendo adaptable a los cambios del mercado.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-04 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("EMA RSI Donchian Strategy", overlay=true) // Input parameters fastEmaLength = input(9, title="Fast EMA Length") midEmaLength = input(21, title="Mid EMA Length") slowEmaLength = input(55, title="Slow EMA Length") ema89Length = input(89, title="89 EMA Length") ema144Length = input(144, title="144 EMA Length") rsiPeriod = input(14, title="RSI Period") rsiOverbought = input(60, title="RSI Overbought Level") rsiOversold = input(40, title="RSI Oversold Level") donchianLength1 = input(21, title="Donchian Channel Length 1") donchianLength2 = input(74, title="Donchian Channel Length 2") // EMA calculations fastEma = ta.ema(close, fastEmaLength) midEma = ta.ema(close, midEmaLength) slowEma = ta.ema(close, slowEmaLength) ema89 = ta.ema(close, ema89Length) ema144 = ta.ema(close, ema144Length) // RSI calculation rsi = ta.rsi(close, rsiPeriod) // Donchian Channel calculations donchianUpper1 = ta.highest(high, donchianLength1) donchianLower1 = ta.lowest(low, donchianLength1) donchianUpper2 = ta.highest(high, donchianLength2) donchianLower2 = ta.lowest(low, donchianLength2) donchianMid1 = (donchianUpper1 + donchianLower1) / 2 donchianMid2 = (donchianUpper2 + donchianLower2) / 2 // Plot EMAs plot(fastEma, color=color.green, linewidth=2, title="Fast EMA") plot(midEma, color=color.blue, linewidth=2, title="Mid EMA") plot(slowEma, color=color.orange, linewidth=2, title="Slow EMA") plot(ema89, color=color.red, linewidth=2, title="89 EMA") plot(ema144, color=color.purple, linewidth=2, title="144 EMA") // Plot Donchian Channels plot(donchianUpper1, color=color.new(color.blue, 0), title="Donchian Upper 1") plot(donchianLower1, color=color.new(color.blue, 0), title="Donchian Lower 1") plot(donchianMid1, color=color.new(color.blue, 80), title="Donchian Mid 1") plot(donchianUpper2, color=color.new(color.red, 0), title="Donchian Upper 2") plot(donchianLower2, color=color.new(color.red, 0), title="Donchian Lower 2") plot(donchianMid2, color=color.new(color.red, 80), title="Donchian Mid 2") // Entry Conditions longCondition = ta.crossover(fastEma, slowEma) and rsi > rsiOverbought shortCondition = ta.crossunder(fastEma, slowEma) and rsi < rsiOversold // Stop Loss and Take Profit var float longStopLoss = na var float longTakeProfit1 = na var float longTakeProfit2 = na var float shortStopLoss = na var float shortTakeProfit1 = na var float shortTakeProfit2 = na if longCondition longStopLoss := high * 0.99 longTakeProfit1 := longStopLoss * 1.02618 longTakeProfit2 := longStopLoss * 1.036185 strategy.entry("Long", strategy.long) if shortCondition shortStopLoss := low * 1.01 shortTakeProfit1 := shortStopLoss * 0.97382 shortTakeProfit2 := shortTakeProfit1 * 0.96381 strategy.entry("Short", strategy.short) // Exit Conditions if not na(longStopLoss) strategy.exit("Take Profit 1", "Long", limit=longTakeProfit1) strategy.exit("Take Profit 2", "Long", limit=longTakeProfit2) strategy.exit("Stop Loss", "Long", stop=longStopLoss) if not na(shortStopLoss) strategy.exit("Take Profit 1", "Short", limit= shortTakeProfit1) strategy.exit("Take Profit 2", "Short", limit=shortTakeProfit2) strategy.exit("Stop Loss", "Short", stop=shortStopLoss) // Labels for buy and sell signals if longCondition label.new(bar_index, low, "Buy", color=color.green, style=label.style_label_up, textcolor=color.white) if shortCondition label.new(bar_index, high, "Sell", color=color.red, style=label.style_label_down, textcolor=color.white) // Alerts alertcondition(longCondition, title="Long Entry Alert", message="Long entry signal") alertcondition(shortCondition, title="Short Entry Alert", message="Short entry signal")