Эта стратегия основана на индикаторе индекса товарного канала (CCI) и использует динамические адаптивные уровни входа для определения сроков изменения тренда, используя при этом отставание стоп-лосса для блокировки прибыли.
Основным показателем является CCI, используемый для выявления перепроданных зон, что указывает на возможности обратного тренда. Кроме того, степень перепроданных зон CCI варьируется в зависимости от различных инструментов и рыночных условий. Поэтому эта стратегия использует "дальновидный" подход, изучая самые низкие уровни CCI за определенные периоды, чтобы динамически установить уровень входа в покупку CCI. Если самый низкий CCI за последние 40 дней превышает -90, то -90 становится новым порогом перепроданной зоны и так далее. Эта адаптивная конструкция позволяет уровням входа динамически соответствовать различным рыночным условиям, преследуя более консервативные входы во время сильных нисходящих тенденций, а более агрессивные входы во время рынков с ограниченным диапазоном.
В частности, уровень по умолчанию сигнала покупки CCI составляет -145. Стратегия затем проверяет самые низкие показания CCI за последние 40 дней, 50 дней и т. Д. Если самый низкий CCI выше следующего уровня, например -90, то -90 становится новым уровнем входа. И так далее, уровень входа может переключаться между -145 / -90 / -70 / -50 / -4 / 0 / +25 / +50 / +70 динамически. Длинный сигнал входа запускается, когда CCI опускается ниже соответствующего уровня.
Кроме того, для блокировки прибыли используется стоп-лосс, при котором уровень стоп-лосса поднимается вместе с ценой.
По сравнению с фиксированными уровнями входа, такая динамическая конструкция позволяет оптимизировать сроки входа. Преследование более консервативных входов во время сильных нисходящих тенденций снижает риск, в то время как более низкие входы во время рынков с диапазоном позволяют захватывать больше возможностей. Это повышает адаптивность стратегии.
Сам по себе CCI является четким и надежным показателем для выявления уровня перекупленности/перепроданности. Логика суждения об изменении тренда на основе CCI доказана. В сочетании с динамическим дизайном входа общие преимущества этой стратегии значительны.
Логика обнаружения точек переворота тренда имеет некоторые задержки. Время входа может быть неточным во время внезапных скачков цен или крахов. Кроме того, адаптивный механизм может не идеально соответствовать текущей рыночной среде, что приводит к неоптимальным входам.
В основном, сам CCI, дизайн начального уровня и параметры стоп-лосса могут быть улучшены.
Эта стратегия сочетает в себе логику использования CCI для выявления зон перекупленности/перепроданности и динамическое адаптивное проектирование уровня входа для улавливания отклонений тренда. По сравнению с фиксированными параметрами, динамические уровни входа значительно улучшают адаптивность. Эта модель улавливания отклонения входа с отставанием стоп-лосса может использовать возможности с сильным импульсом и сокращать потери вовремя. При правильно настроенных параметрах эта стратегия демонстрирует жизнеспособность и надежность. Дальнейшие улучшения могут быть достигнуты путем постоянной оптимизации параметров CCI и правил уровня входа для достижения более высокой стабильности и прибыльности.
/*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)")