Esta estrategia se basa en el indicador del canal de productos básicos (CCI) y emplea niveles de entrada adaptativos dinámicos para determinar el momento de la reversión de la tendencia, al tiempo que utiliza un stop loss para bloquear las ganancias.
El indicador principal es el CCI, utilizado para detectar zonas de sobreventa, lo que sugiere oportunidades de inversión de tendencia. Además, la extensión de las zonas de sobreventa del CCI varía según los diferentes instrumentos y entornos de mercado. Por lo tanto, esta estrategia adopta un enfoque "distante", examinando los niveles más bajos del CCI durante ciertos períodos de retroceso, para establecer dinámicamente el nivel de entrada de compra del CCI. Si el CCI más bajo en los últimos 40 días está por encima de -90, entonces -90 se convierte en el nuevo umbral de zona de sobreventa, y así sucesivamente. Este diseño adaptativo permite que los niveles de entrada se adapten dinámicamente a diferentes condiciones del mercado, buscando entradas más conservadoras durante tendencias bajistas fuertes mientras que entradas más agresivas durante los mercados de rango.
Específicamente, el nivel de señal de compra CCI predeterminado es -145. La estrategia luego comprueba las lecturas más bajas de CCI en los últimos 40 días, 50 días, etc. Si el CCI más bajo está por encima del siguiente nivel como -90, entonces -90 se convierte en el nuevo nivel de entrada. Y así sucesivamente, el nivel de entrada puede cambiar entre -145 / -90 / -70 / -50 / -4 / 0 / +25 / +50 / +70 dinámicamente. Una señal de entrada larga se activa cuando CCI cae por debajo del nivel correspondiente.
Además, se utiliza un stop loss para bloquear las ganancias, con el nivel de stop subiendo junto con el precio.
En comparación con los niveles de entrada fijos, este diseño dinámico permite un tiempo de entrada optimizado. Perseguir entradas más conservadoras durante fuertes tendencias bajistas reduce el riesgo, mientras que entradas más bajas durante los mercados de rango permiten capturar más oportunidades. Esto mejora la adaptabilidad de la estrategia.
El CCI en sí es un indicador claro y fiable para identificar los niveles de sobrecompra/sobreventa. Se ha comprobado la lógica de juzgar las inversiones de tendencia basadas en el CCI. Combinado con el diseño dinámico de entrada, la ventaja general de esta estrategia es significativa.
La lógica de detectar puntos de inversión de tendencia tiene algunos atributos rezagados. El momento de entrada puede no ser preciso durante aumentos repentinos de precios o caídas. Además, el mecanismo adaptativo puede no encajar perfectamente en el entorno actual del mercado, lo que lleva a entradas no óptimas. Por último, las altas fluctuaciones en los mercados de materias primas pueden causar grandes pérdidas si los parámetros de stop loss no se establecen correctamente.
En particular, el propio CCI, el diseño de nivel de entrada y los parámetros de stop loss pueden mejorarse.
Esta estrategia combina la lógica de usar CCI para detectar zonas de sobrecompra / sobreventa y el diseño dinámico de nivel de entrada adaptativo para capturar las reversiones de tendencia. En comparación con los parámetros fijos, los niveles de entrada dinámicos mejoran significativamente la adaptabilidad. Este modelo de captura de reversión de entrada con stop loss trasero puede aprovechar las oportunidades con un fuerte impulso y reducir las pérdidas a tiempo. Con parámetros configurados correctamente, esta estrategia demuestra viabilidad y robustez. Se pueden hacer mejoras adicionales optimizando los parámetros de CCI y las reglas de nivel de entrada para lograr una mayor estabilidad y rentabilidad.
/*backtest start: 2023-11-20 00:00:00 end: 2023-12-20 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Extended Adaptive CCI Entry Strategy for Commodities", shorttitle="Ext_Adaptive_CCI_Entry_Com", overlay=true) // Inputs cciLength = input(20, title="CCI Period") defaultCCIEntryOversold = input(-145, title="Default CCI Entry Oversold Level") adaptiveCCIEntryLevel90 = input(-90, title="Adaptive CCI Entry Level for 40 Days") adaptiveCCIEntryLevel70_50Days = input(-70, title="Adaptive CCI Entry Level for 50 Days") adaptiveCCIEntryLevel50 = input(-50, title="Adaptive CCI Entry Level for 60 Days") adaptiveCCIEntryLevel4 = input(-4, title="Adaptive CCI Entry Level for 90 Days") adaptiveCCIEntryLevel0 = input(0, title="Adaptive CCI Entry Level for 120 Days") adaptiveCCIEntryLevel25 = input(25, title="Adaptive CCI Entry Level for 140 Days") adaptiveCCIEntryLevel50_160Days = input(50, title="Adaptive CCI Entry Level for 160 Days") adaptiveCCIEntryLevel70_180Days = input(70, title="Adaptive CCI Entry Level for 180 Days") lookback40 = input(40, title="Lookback Period for -90 Level") lookback50 = input(50, title="Lookback Period for -70 Level") lookback60 = input(60, title="Lookback Period for -50 Level") lookback90 = input(90, title="Lookback Period for -4 Level") lookback120 = input(120, title="Lookback Period for 0 Level") lookback140 = input(140, title="Lookback Period for +25 Level") lookback160 = input(160, title="Lookback Period for +50 Level") lookback180 = input(180, title="Lookback Period for +70 Level") // Indicator Calculation cci = ta.cci(close, cciLength) // Determine adaptive entry level based on lookback periods var float entryLevel = defaultCCIEntryOversold // Initialize with the default level if ta.lowest(cci, lookback40) > adaptiveCCIEntryLevel90 entryLevel := adaptiveCCIEntryLevel90 if ta.lowest(cci, lookback50) > adaptiveCCIEntryLevel70_50Days entryLevel := adaptiveCCIEntryLevel70_50Days if ta.lowest(cci, lookback60) > adaptiveCCIEntryLevel50 entryLevel := adaptiveCCIEntryLevel50 if ta.lowest(cci, lookback90) > adaptiveCCIEntryLevel4 entryLevel := adaptiveCCIEntryLevel4 if ta.lowest(cci, lookback120) > adaptiveCCIEntryLevel0 entryLevel := adaptiveCCIEntryLevel0 if ta.lowest(cci, lookback140) > adaptiveCCIEntryLevel25 entryLevel := adaptiveCCIEntryLevel25 if ta.lowest(cci, lookback160) > adaptiveCCIEntryLevel50_160Days entryLevel := adaptiveCCIEntryLevel50_160Days if ta.lowest(cci, lookback180) > adaptiveCCIEntryLevel70_180Days entryLevel := adaptiveCCIEntryLevel70_180Days // Entry Condition longCondition = cci < entryLevel // Entry and Exit if (longCondition) strategy.entry("Long", strategy.long, qty=1) alert("Long entry executed at " + str.tostring(close), alert.freq_once_per_bar) trailOffset = input(10.0, title="Trailing Stop Offset in USD") strategy.exit("Trailing Stop", "Long", trail_offset = trailOffset, trail_price = close) if (close < entryLevel - trailOffset) alert("Long position closed at " + str.tostring(close), alert.freq_once_per_bar) // Plotting plot(series=cci, color=color.purple, title="CCI") hline(price=defaultCCIEntryOversold, color=color.red, title="Default CCI Entry Oversold Level") hline(price=adaptiveCCIEntryLevel90, color=color.orange, title="CCI -90 Level (40 Days)") hline(price=adaptiveCCIEntryLevel70_50Days, color=color.yellow, title="CCI -70 Level (50 Days)") hline(price=adaptiveCCIEntryLevel50, color=color.green, title="CCI -50 Level (60 Days)") hline(price=adaptiveCCIEntryLevel4, color=color.blue, title="CCI -4 Level (90 Days)") hline(price=adaptiveCCIEntryLevel0, color=color.purple, title="CCI 0 Level (120 Days)") hline(price=adaptiveCCIEntryLevel25, color=color.aqua, title="CCI +25 Level (140 Days)") hline(price=adaptiveCCIEntryLevel50_160Days, color=color.black, title="CCI +50 Level (160 Days)") hline(price=adaptiveCCIEntryLevel70_180Days, color=color.gray, title="CCI +70 Level (180 Days)")