Cette stratégie est basée sur l'indicateur du canal des produits de base (CCI) et utilise des niveaux d'entrée adaptatifs dynamiques pour déterminer le moment de l'inversion de la tendance, tout en utilisant un stop-loss pour verrouiller les bénéfices.
L'indicateur de base est l'ICC, utilisé pour repérer les zones de survente, ce qui laisse entrevoir des opportunités d'inversion de tendance. En outre, l'étendue des zones de survente CCI varie selon les différents instruments et environnements de marché. Par conséquent, cette stratégie adopte une approche "rétrospective", en examinant les niveaux les plus bas de l'ICC sur certaines périodes de rétrospective, pour définir dynamiquement le niveau d'entrée d'achat de l'ICC. Si l'ICC le plus bas au cours des 40 derniers jours est supérieur à -90, alors -90 devient le nouveau seuil de zone de survente, et ainsi de suite. Cette conception adaptative permet aux niveaux d'entrée de s'adapter dynamiquement à différentes conditions de marché, en poursuivant des entrées plus conservatrices pendant les fortes tendances à la baisse tandis que des entrées plus agressives pendant les marchés à plage.
Plus précisément, le niveau de signal d'achat CCI par défaut est -145. La stratégie vérifie ensuite les lectures les plus basses du CCI au cours des 40 derniers jours, 50 jours, etc. Si le CCI le plus bas est au-dessus du niveau suivant comme -90, alors -90 devient le nouveau niveau d'entrée. Et ainsi de suite, le niveau d'entrée peut basculer entre -145 / -90 / -70 / -50 / -4 / 0 / +25 / +50 / +70 dynamiquement. Un signal d'entrée long est déclenché lorsque le CCI tombe en dessous du niveau correspondant.
En outre, un stop loss de trailing est utilisé pour verrouiller les bénéfices, le niveau de stop se déplaçant vers le haut avec le prix.
Comparé aux niveaux d'entrée fixes, une telle conception dynamique permet un calendrier d'entrée optimisé. La poursuite d'entrées plus conservatrices pendant les fortes tendances à la baisse réduit le risque, tandis que des entrées plus faibles pendant les marchés à plage permettent de saisir plus d'opportunités. Cela améliore l'adaptabilité de la stratégie.
L'indicateur CCI lui-même est un indicateur clair et fiable pour identifier les niveaux de surachat/survente.
La logique de repérage des points d'inversion de tendance présente des attributs de retard. Le timing de l'entrée peut ne pas être précis lors de pics ou de chutes soudains de prix. De plus, le mécanisme d'adaptation peut ne pas s'adapter parfaitement à l'environnement actuel du marché, conduisant à des entrées non optimales. Enfin, les fluctuations élevées des marchés des matières premières peuvent causer d'énormes pertes si les paramètres de stop loss ne sont pas correctement définis.
La mise en place d'un système de gestion de la rentabilité et de la rentabilité est un élément essentiel de la stratégie.
Cette stratégie combine la logique de l'utilisation de l'ICC pour repérer les zones de surachat/survente et la conception dynamique adaptative de niveau d'entrée pour capturer les inversions de tendance. Par rapport aux paramètres fixes, les niveaux d'entrée dynamiques améliorent considérablement l'adaptabilité. Ce modèle de capture d'inversion d'entrée avec stop loss peut saisir les opportunités avec une forte dynamique et réduire les pertes dans le temps. Avec des paramètres correctement configurés, cette stratégie démontre la viabilité et la robustesse. D'autres améliorations peuvent être apportées en optimisant constamment les paramètres de l'ICC et les règles de niveau d'entrée pour atteindre une plus grande stabilité et rentabilité.
/*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)")