
La estrategia se basa en el índice de canales de mercancías (CCI), utiliza el criterio de entradas de adaptabilidad dinámica para determinar el momento en que la tendencia se invierte, y utiliza el seguimiento de las paradas para bloquear las ganancias. El nombre de la estrategia se ajusta a la estrategia de comercio de mercancías para capturar el fondo del CCI. La estrategia contiene el núcleo de la estrategia: utiliza el indicador CCI para determinar las zonas de venta por encima para capturar oportunidades de reversión y utiliza entradas de adaptabilidad dinámica para optimizar las entradas horizontalmente.
El indicador central es el índice CCI, que se utiliza para determinar las áreas de sobreventa para indicar la oportunidad de un cambio de tendencia. Además, la amplitud de las áreas de sobreventa del CCI puede variar según los diferentes indicadores y el entorno del mercado. Por lo tanto, esta estrategia utiliza un enfoque mirador para determinar la ubicación del punto más bajo del CCI en el pasado y establecer dinámicamente el nivel de compra del CCI.
En concreto, el nivel de CCI de la señal de compra por defecto es -145. Luego, se determina la ubicación del punto más bajo de CCI en los últimos 40 días, 50 días, etc. Si el punto más bajo es superior al siguiente nivel de nivel por defecto, por ejemplo, -90, se toma -90 como nuevo nivel de entradas.
Además, la estrategia también utiliza un trazado de stop-loss para bloquear ganancias, y los niveles de stop-loss se mueven a medida que los precios se mueven.
Este diseño dinámico permite optimizar el momento de las entradas en comparación con el nivel de las entradas fijas. Buscar un estándar de entradas más alto en un mercado con una fuerte caída puede reducir el riesgo; mientras que reducir el estándar de entradas en un mercado con una clasificación por zonas de oscilación puede aprovechar más oportunidades. Este diseño aumenta la adaptabilidad de la estrategia.
El CCI en sí mismo es un indicador claro y fiable para determinar el exceso de compra y venta, y la lógica de la inversión de tendencia basada en el CCI es efectiva. Combinado con el diseño de entradas dinámicas, la ventaja general de esta estrategia es significativa.
La idea de los puntos de inflexión de tendencia basados en el CCI tiene un cierto atraso, cuando los precios suben o bajan rápidamente, el tiempo de las entradas puede no ser correcto. Además, el mecanismo de adaptación dinámica horizontal de las entradas también es difícil de adaptarse perfectamente al entorno del mercado actual, lo que hace que las entradas no sean necesariamente el momento óptimo.
Se puede optimizar principalmente a partir de los parámetros del CCI en sí, la configuración del nivel de entradas y los parámetros de stop loss. Para determinar con precisión los parámetros de mejor ubicación para los parámetros específicos, se puede mejorar el efecto de la estrategia.
La estrategia combina el uso de los indicadores CCI para determinar el exceso de venta y el diseño de niveles de entradas de adaptación dinámica para capturar las tendencias de ruptura. En comparación con los parámetros fijos, los niveles de entradas dinámicas aumentan significativamente la adaptabilidad de la estrategia.
/*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)")