Esta estrategia combina el indicador CCI, el indicador RSI y dos promedios móviles en un sistema de negociación compuesto.
La estrategia utiliza principalmente el indicador CCI para determinar la dirección de la tendencia. Las lecturas del CCI por encima de 100 indican un mercado alcista, mientras que las por debajo de -100 indican un mercado bajista. El sistema utiliza dos cruces de promedios móviles para ayudar a determinar la dirección de la tendencia. Cuando el promedio móvil rápido cruza por encima del promedio móvil lento, es una señal de compra, y viceversa para las señales de venta.
Después de determinar la tendencia alcista o bajista, el sistema utiliza el cruce de dos RSI con diferentes longitudes de parámetros como verificación de entrada. Por ejemplo, en un mercado alcista, si el RSI de corto período cruza por encima del RSI de largo período, es la señal final de compra. Este diseño filtra principalmente el ruido para evitar operaciones incorrectas desencadenadas por correcciones a corto plazo durante las tendencias.
La estrategia solo abre posiciones durante la sesión de negociación especificada, cerrando activamente todas las posiciones 15 minutos antes del cierre para evitar el riesgo de la noche a la mañana.
Esta estrategia considera de manera integral la determinación de tendencias y la validación del cruce de indicadores para garantizar la validez de la señal mientras se controla el riesgo. A través de la optimización de parámetros y ajustes lógicos, la estrategia tiene un mayor potencial para expandir las oportunidades de ganancia y reducir las oportunidades perdidas.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m 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/ // © rwestbrookjr //@version=5 strategy("EMA with RSI Cross Strategy", overlay=true) //EMA fastLen = input(title='Fast EMA Length', defval=9) slowLen = input(title='Slow EMA Length', defval=20) fastEMA = ta.ema(close, fastLen) slowEMA = ta.ema(close, slowLen) fema = plot(fastEMA, title='FastEMA', color=color.new(color.green, 0), linewidth=1, style=plot.style_line) sema = plot(slowEMA, title='SlowEMA', color=color.new(color.red, 0), linewidth=1, style=plot.style_line) fill(fema, sema, color=fastEMA > slowEMA ? color.new(#417505, 50) : color.new(#890101, 50), title='Cloud') // Bull and Bear Alerts //Bull = ta.crossover(fastEMA, slowEMA) Bull = fastEMA > slowEMA //Bear = ta.crossunder(fastEMA, slowEMA) Bear = fastEMA < slowEMA //RSIs rsiLength1Input = input.int(9, minval=1, title="RSI Length", group="RSI Settings") rsiSource1Input = input.source(close, "Source", group="RSI Settings") rsiLength2Input = input.int(20, minval=1, title="RSI Length", group="RSI Settings") rsiSource2Input = input.source(close, "Source", group="RSI Settings") up1 = ta.rma(math.max(ta.change(rsiSource1Input), 0), rsiLength1Input) down1 = ta.rma(-math.min(ta.change(rsiSource1Input), 0), rsiLength1Input) rsi = down1 == 0 ? 100 : up1 == 0 ? 0 : 100 - (100 / (1 + up1 / down1)) up2 = ta.rma(math.max(ta.change(rsiSource2Input), 0), rsiLength2Input) down2 = ta.rma(-math.min(ta.change(rsiSource2Input), 0), rsiLength2Input) rsi2 = down2 == 0 ? 100 : up2 == 0 ? 0 : 100 - (100 / (1 + up2 / down2)) //CCI cciLength = input.int(20, minval=1) src = input(hlc3, title="Source") ma = ta.sma(src, cciLength) cci = (src - ma) / (0.015 * ta.dev(src, cciLength)) //Trail Stop Setup trstp = input.float(title="Trail Loss($)", minval = 0.0, step = 0.01, defval = 0.5) longStop = 0.0, shortStop = 0.0 longStop := if Bull stopValue = close - trstp math.max(stopValue, longStop[1]) else 0.0 shortStop := if Bear stopValue = close + trstp math.min(stopValue, shortStop[1]) else 999999 //Session Setup open_session=input(defval="0930-1545") session = time("1", open_session) validSession=(na(session) ? 0 : 1) //Trade Signals longCondition = Bull and cci > 100 and ta.crossover(rsi,rsi2) and validSession if (longCondition) strategy.entry("Long", strategy.long, 1) //longExit = close > strategy.opentrades.entry_price(0) + 1.5 or close < strategy.opentrades.entry_price(0) - 0.75 longExit = close < longStop or not validSession if (longExit) strategy.close("Long") shortCondition = Bear and cci < 100 and ta.crossunder(rsi,rsi2) and validSession if (shortCondition) strategy.entry("Short", strategy.short, 1) //shortExit = close < strategy.opentrades.entry_price(0) - 1.5 or close > strategy.opentrades.entry_price(0) + 0.75 shortExit = close > shortStop or not validSession if (shortExit) strategy.close("Short")