Cette stratégie est une stratégie de canal de prix adaptatif basée sur l'indicateur Average True Range (ATR) et l'indice Directionnel Moyen (ADX).
Calculer le plus haut maximum (HH) et le plus bas minimum (LL) sur une longueur donnée.
Calculer +DI et -DI en fonction des mouvements de prix à la hausse et à la baisse.
Si ADX < 25, le marché est considéré comme latéralement. Si close > canal supérieur (HH - ATR multiplicateur * ATR), aller long. Si close < canal inférieur (LL + ATR multiplicateur * ATR), aller court.
Si ADX >= 25 et +DI > -DI, le marché est haussier.
Si ADX >= 25 et +DI < -DI, le marché est baissier.
Position de sortie après les barres de longueur de sortie depuis l'entrée.
La stratégie s'adapte automatiquement en fonction des conditions du marché, en utilisant une stratégie de canal sur le marché latéral et une tendance sur le marché tendance.
L'utilisation de l'ATR et de l'ADX assure l'adaptabilité.
La sortie forcée ajoute de la stabilité.
L'ADX peut générer de faux signaux fréquemment.
Les mauvais paramètres ATR et ADX entraînent de mauvaises performances.
Incapable de se protéger efficacement contre les événements du cygne noir.
Optimiser les paramètres pour l'ATR et l'ADX afin d'améliorer la capacité d'adaptation.
Ajouter un stop loss pour limiter les pertes.
Ajoutez des filtres pour éviter les faux signaux.
La stratégie combine des indicateurs et des mécanismes pour s'adapter aux conditions du marché, mais des erreurs d'appréciation peuvent survenir en raison des limitations des indicateurs, des optimisations futures des paramètres et du contrôle des risques.
/*backtest start: 2023-11-03 00:00:00 end: 2023-12-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Adaptive Price Channel Strategy", overlay=true) length = input(20, title="Length") exit_length = input(10, title="Exit After X Periods") atr_multiplier = input(3.2, title="ATR Multiplier") startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date") endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date") hh = ta.highest(high, length) ll = ta.lowest(low, length) atr = ta.atr(length) // calculate +DI and -DI upMove = high - high[1] downMove = low[1] - low plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0) minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0) plusDI = ta.rma(plusDM, length) / atr * 100 minusDI = ta.rma(minusDM, length) / atr * 100 // calculate ADX dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100 adx = ta.rma(dx, length) var int barSinceEntry = na if (not na(close[length]) ) if (adx < 25) // Sideways market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 else if (adx >= 25 and plusDI > minusDI) // Bullish market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (adx >= 25 and plusDI < minusDI) // Bearish market if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 if (na(barSinceEntry)) barSinceEntry := barSinceEntry[1] + 1 else if (barSinceEntry >= exit_length) strategy.close("PChLE") strategy.close("PChSE") barSinceEntry := na plot(hh, title="Highest High", color=color.green, linewidth=2) plot(ll, title="Lowest Low", color=color.red, linewidth=2)