이 전략은 재화 채널 지표 (CCI) 를 기반으로 하며, 트렌드 반전 시기를 결정하기 위해 동적 적응적 진입 수준을 사용하며, 수익을 차단하기 위해 후속 스톱 손실을 사용한다. 전략 이름인 '상품에 대한 확장된 적응적 CCI 바닥 낚시 거래 전략'은 이 전략의 주요 측면을 포착한다.
핵심 지표는 CCI이며, 과잉판매 구역을 발견하기 위해 사용되며, 따라서 트렌드 역전 기회를 암시합니다. 또한, CCI 과잉판매 구역의 범위는 다른 도구와 시장 환경에 따라 다릅니다. 따라서이 전략은 CCI 구매 입시 수준을 동적으로 설정하기 위해 특정 룩백 기간 동안 가장 낮은 CCI 수준을 조사하는 "장거리" 접근 방식을 취합니다. 지난 40 일 동안 가장 낮은 CCI가 -90 이상이라면 -90이 새로운 과잉판매 구역 문턱이됩니다. 이러한 적응성 설계는 다른 시장 조건에 동적으로 적합하도록 허용하며, 강력한 하향 추세 동안보다 보수적인 입시를 추구하고 범위 제한 시장에서 더 공격적인 입시를 추구합니다.
특히, 기본 CCI 구매 신호 수준은 -145이다. 전략은 다음 40 일, 50 일 등 다양한 룩백 날에 가장 낮은 CCI 판독을 검사합니다. 가장 낮은 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)")