Diese Strategie basiert auf dem Commodity Channel Index (CCI) Indikator und verwendet dynamische adaptive Einstiegsniveaus, um den Zeitpunkt der Trendumkehr zu bestimmen, während ein Trailing Stop Loss verwendet wird, um Gewinne zu erzielen.
Der Kernindikator ist der CCI, der verwendet wird, um überverkaufte Zonen zu erkennen, was auf Trendumkehrungsmöglichkeiten hindeutet. Außerdem variiert das Ausmaß von CCI-Überverkaufszonen zwischen verschiedenen Instrumenten und Marktumgebungen. Daher verfolgt diese Strategie einen "fernblickenden" Ansatz, indem sie die niedrigsten CCI-Level über bestimmte Rückblicksperioden untersucht, um die CCI-Kaufintrittsstufe dynamisch festzulegen. Wenn der niedrigste CCI in den letzten 40 Tagen über -90 liegt, wird -90 die neue Überverkaufszone Schwelle und so weiter. Dieses anpassungsfähige Design ermöglicht es, die Einstiegsniveaus dynamisch an verschiedene Marktbedingungen anzupassen, wobei bei starken Abwärtstrends konservativere Eintritte verfolgt werden, während bei Bereichsmarkten aggressivere Eintritte durchgeführt werden.
Die Strategie überprüft dann die niedrigsten CCI-Werte in den letzten 40 Tagen, 50 Tagen usw. verschiedene Lookback-Tage. Wenn der niedrigste CCI über dem nächsten Niveau wie -90 liegt, dann wird -90 das neue Einstiegsniveau. Und so weiter, kann das Einstiegsniveau zwischen -145 / -90 / -70 / -50 / -4 / 0 / +25 / +50 / +70 dynamisch wechseln. Ein langes Einstiegssignal wird ausgelöst, wenn der CCI unter das entsprechende Niveau fällt.
Darüber hinaus wird ein Trailing Stop Loss verwendet, um Gewinne zu erzielen, wobei sich das Stop Level mit dem Preis nach oben bewegt.
Im Vergleich zu festen Einstiegsniveaus ermöglicht ein solches dynamisches Design einen optimierten Einstiegszeitplan.
Der CCI selbst ist ein klarer und zuverlässiger Indikator für die Ermittlung von Überkauf-/Überverkaufswerten. Die Logik der Beurteilung von Trendumkehrungen auf der Grundlage des CCI ist nachgewiesen.
Die Logik der Erkennung von Trendumkehrpunkten hat einige Verzögerungsmerkmale. Der Eintrittszeitplan kann bei plötzlichen Preisanstiegen oder Abstürzen möglicherweise nicht genau sein. Außerdem passt der anpassungsfähige Mechanismus möglicherweise nicht perfekt zum aktuellen Marktumfeld, was zu nicht optimalen Eintritten führt. Schließlich können hohe Schwankungen auf den Rohstoffmärkten zu großen Verlusten führen, wenn Stop-Loss-Parameter nicht richtig eingestellt werden.
Es kann vor allem die CCI selbst, das Design auf Einstiegsebene und die Stop-Loss-Parameter verbessert werden.
Diese Strategie kombiniert die Logik der Verwendung von CCI, um überkaufte / überverkaufte Zonen zu erkennen, und das dynamische adaptive Entry-Level-Design, um Trendumkehrungen zu erfassen. Im Vergleich zu festen Parametern verbessern die dynamischen Entry-Levels die Anpassungsfähigkeit erheblich. Dieses Entry-Reversal-Capture-Modell mit Trailing Stop Loss kann Chancen mit starker Dynamik nutzen und Verluste rechtzeitig reduzieren. Mit richtig konfigurierten Parametern zeigt diese Strategie Lebensfähigkeit und Robustheit. Weitere Verbesserungen können durch die ständige Optimierung von CCI-Parametern und Entry-Level-Regeln erzielt werden, um höhere Stabilität und Rentabilität zu erzielen.
/*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)")