Esta estratégia baseia-se no indicador de canal de commodities (CCI) e emprega níveis de entrada adaptativos dinâmicos para determinar o tempo de reversão da tendência, ao mesmo tempo em que usa um stop loss para bloquear os lucros.
O indicador central é o CCI, usado para detectar zonas de sobrevenda, sugerindo oportunidades de reversão da tendência. Além disso, a extensão das zonas de sobrevenda CCI varia em diferentes instrumentos e ambientes de mercado. Portanto, esta estratégia adota uma abordagem "vidente", examinando os níveis mais baixos do CCI em determinados períodos de retrospectiva, para definir dinamicamente o nível de entrada de compra do CCI. Se o CCI mais baixo nos últimos 40 dias estiver acima de -90, então -90 se torna o novo limiar da zona de sobrevenda, e assim por diante. Este design adaptativo permite que os níveis de entrada se adequem dinamicamente a diferentes condições de mercado, perseguindo entradas mais conservadoras durante fortes tendências de queda, enquanto entradas mais agressivas durante mercados de gama.
Especificamente, o nível padrão do sinal de compra do CCI é -145. A estratégia então verifica as leituras mais baixas do CCI nos últimos 40 dias, 50 dias etc. Se o menor CCI estiver acima do próximo nível, como -90, então -90 se torna o novo nível de entrada. E assim por diante, o nível de entrada pode alternar entre -145 / -90 / -70 / -50 / -4 / 0 / +25 / +50 / +70 dinamicamente. Um sinal de entrada longo é desencadeado quando o CCI cai abaixo do nível correspondente.
Além disso, um trailing stop loss é usado para bloquear os lucros, com o nível de stop subindo junto com o preço.
Em comparação com os níveis de entrada fixos, esse design dinâmico permite otimizar o tempo de entrada.
O próprio CCI é um indicador claro e fiável para identificar os níveis de sobrecompra/supervenda. A lógica de julgar inversões de tendência com base no CCI é comprovada.
A lógica de detectar pontos de reversão de tendência tem alguns atributos atrasados. O tempo de entrada pode não ser preciso durante os aumentos repentinos de preços ou quedas. Além disso, o mecanismo adaptativo pode não se adequar perfeitamente ao ambiente atual do mercado, levando a entradas não ideais. Finalmente, altas flutuações nos mercados de commodities podem causar grandes perdas se os parâmetros de stop loss não forem definidos corretamente.
Os parâmetros de stop loss podem ser melhorados, principalmente o próprio CCI, o projeto de nível de entrada e a localização precisa dos parâmetros ótimos para instrumentos específicos podem melhorar o desempenho da estratégia.
Esta estratégia combina a lógica de usar o CCI para detectar zonas de sobrecompra / sobrevenda e o design de nível de entrada adaptativo dinâmico para capturar inversões de tendência. Em comparação com parâmetros fixos, os níveis de entrada dinâmicos melhoram significativamente a adaptabilidade. Este modelo de captura de reversão de entrada com stop loss traseiro pode aproveitar oportunidades com forte impulso e cortar perdas no tempo. Com parâmetros configurados corretamente, esta estratégia demonstra viabilidade e robustez. Mais melhorias podem ser feitas continuamente otimizando os parâmetros do CCI e as regras de nível de entrada para alcançar maior estabilidade e lucratividade.
/*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)")