
A estratégia baseia-se no indicador CCI, que usa os critérios de entrada de adaptação dinâmica para determinar o momento da reversão da tendência, enquanto o rastreamento de stop-loss é usado para bloquear os lucros. O nome da estratégia é muito promissor para capturar o fundo do CCI. A estratégia de negociação de mercadorias contém o núcleo da estratégia: usar o indicador CCI para determinar áreas de superalimento para capturar oportunidades de reversão e usar as entradas de adaptação dinâmica para otimizar o tempo das entradas horizontalmente.
O indicador central é o indicador CCI, usado para determinar as chances de uma região de oversold sugerir uma reversão de tendência. Além disso, a amplitude da região de oversold CCI também pode variar de acordo com diferentes indicadores e condições de mercado. Portanto, esta estratégia usa uma visão pessimista para determinar a localização dos pontos mais baixos do CCI no passado e definir dinamicamente os níveis de compra do CCI. Se o ponto mais baixo do CCI nos últimos 40 dias for maior que -90, então -90 como o novo nível da região de oversold; se o ponto mais baixo do CCI nos últimos 50 dias for maior que -70, então -70 como o novo nível da região de oversold, e assim por diante.
Concretamente, o nível de CCI do sinal de compra por defeito é -145. Então, para determinar a localização do ponto mais baixo do CCI nos últimos 40 dias, 50 dias, etc., se o ponto mais baixo estiver acima do nível padrão, o próximo nível, por exemplo, -90, então use -90 como o novo nível de entrada. Se o ponto mais baixo estiver acima de -90, use -70 como o novo nível de entrada, assim por diante.
Além disso, a estratégia também usa o rastreamento de stop-loss para bloquear os lucros, com o nível de stop-loss a subir com a movimentação dos preços.
Em comparação com o nível de entrada fixo, esse design dinâmico permite otimizar o tempo das entradas. Em mercados com forte queda, a busca de padrões de entradas mais elevados pode reduzir o risco; e, em mercados com agitação, a redução dos padrões de entradas pode aproveitar mais oportunidades.
O CCI em si também é um indicador claro e confiável para determinar o excesso de compra e venda, e a lógica baseada no CCI para avaliar a reversão de tendência é eficaz. Combinado com o design de entradas dinâmicas, a vantagem geral desta estratégia é significativa.
O CCI baseia-se no pensamento de que os pontos de mudança de tendência têm um certo atraso. Quando os preços sobem ou descem rapidamente, o tempo de entrada pode não ser exato. Além disso, o mecanismo de adaptação dinâmica do nível de entrada também é difícil de se adaptar perfeitamente ao ambiente atual do mercado, o que faz com que as entradas não sejam necessariamente o melhor momento.
Os principais aspectos que podem ser otimizados são os próprios parâmetros do CCI, a configuração do nível de entradas e os parâmetros de stop loss. Parâmetros mais favoráveis para determinar com precisão os parâmetros específicos podem melhorar a eficácia da estratégia.
A estratégia combina o uso do indicador CCI para avaliar o excesso de compra e venda e o design do nível de entrada de adaptação dinâmica para capturar tendências de ruptura. Em comparação com os parâmetros fixos, o nível de entrada dinâmica aumenta significativamente a adaptabilidade da estratégia.
/*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)")