Une stratégie de tendance adaptative ATR-ADX V2

Auteur:ChaoZhang est là., Date: 12-05-2023 à 18h08
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de suivi des tendances qui combine l'indicateur ATR et l'indicateur ADX. Il ajuste dynamiquement le multiplicateur ATR en fonction des conditions de tendance du marché pour obtenir un meilleur suivi des tendances.

La logique de la stratégie

La stratégie repose principalement sur l'indicateur ATR et l'indicateur ADX.

Tout d'abord, il calcule la True Range (ATR) et l'ADX.

Deuxièmement, il détermine la direction de la tendance actuelle en fonction de la différence entre DI+ et DI- dans l'indicateur ADX. Si DI+ est supérieur à DI-, c'est une tendance haussière. Si DI- est supérieur à DI+, c'est une tendance à la baisse.

Ensuite, lorsque l'ADX est en hausse, il utilise un multiplicateur d'ATR plus grand (m1).

Enfin, combiné à l'ATR et au point médian du prix, il calcule les bandes supérieures et inférieures pour déterminer la direction de la tendance.

Ainsi, la stratégie intègre ATR et ADX, et en ajustant dynamiquement les paramètres ATR, elle peut mieux capturer les tendances pour le trading.

Analyse des avantages

Cette stratégie présente plusieurs avantages évidents:

  1. Capable d'ajuster dynamiquement les paramètres pour une meilleure capture de tendance
  2. Combine ATR et ADX pour un jugement plus complet
  3. Prévoit des prélèvements contrôlés
  4. Mise en œuvre simple et facile à comprendre

Il s'agit donc d'une tendance très pratique à suivre une stratégie avec un bon contrôle du tirage.

Analyse des risques

La stratégie comporte également certains risques:

  1. ADX a des émissions en retard, peut manquer les points d'inversion de tendance
  2. Une mauvaise sélection de la taille de l'ATR peut entraîner un profit insuffisant ou un stop loss trop important
  3. Une rupture rapide contre les bandes causée par les événements du cygne noir peut entraîner des pertes.

L'optimisation des paramètres et le contrôle des risques nécessitent donc une attention particulière.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Optimiser les paramètres de l'ATR et de l'ADX pour une meilleure capture des tendances
  2. Ajouter d'autres indicateurs pour la confirmation afin d'éviter les problèmes de retard de l'ADX
  3. Mettre en place des mécanismes dynamiques de stop loss pour contrôler les pertes de transactions uniques
  4. Ajuster la taille des positions pour les différents environnements de marché

Il y a donc encore beaucoup de place pour l'optimisation en ajustant les paramètres et les mécanismes en fonction des problèmes.

Conclusion

En général, cette stratégie de tendance adaptative ATR-ADX V2 fonctionne très bien. En ajustant dynamiquement les paramètres ATR, elle capte les tendances. En outre, la combinaison de deux indicateurs ATR et ADX la rend plus robuste. Mais nous devons toujours faire attention au contrôle des risques et à l'optimisation pour éviter les pertes en retard et en surdimension. Dans l'ensemble, la stratégie vaut la peine d'être apprise et appliquée.


/*backtest
start: 2022-11-28 00:00:00
end: 2023-12-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// From mortdiggiddy's indicator to strategy
// See also: https://www.tradingview.com/u/mortdiggiddy/

strategy(title = "Adaptive ATR-ADX Trend V2", shorttitle = "Adaptive ATR V2 Strategy", overlay = true)

//Mode
src = input(title = "Source",  defval = hlc3)
atrLen = input(title = "ATR",  defval = 21, minval = 1, maxval = 100)
m1 = input(title = "ATR Multiplier - ADX Rising", type = float, defval = 3.5, minval = 1, step = 0.1, maxval = 100)
m2 = input(title = "ATR Multiplier - ADX Falling", type = float, defval = 1.75, minval = 1, step = 0.1, maxval = 100)

adxLen = input(title = "ADX",  defval = 14, minval = 1, maxval = 100)
adxThresh = input(title = "ADX Threshold",  defval = 30, minval = 1)
aboveThresh = input(true, title = "ADX Above Threshold uses ATR Falling Multiplier Even if Rising?")
useHeiken = input(false, title = "Use Heiken-Ashi Bars (Source will be ohlc4)")
    
// DI-Pos, DI-Neg, ADX

hR = change(high)
lR = -change(low)

dmPos = hR > lR ? max(hR, 0) : 0
dmNeg = lR > hR ? max(lR, 0) : 0

sTR = nz(sTR[1]) - nz(sTR[1]) / adxLen + tr
sDMPos = nz(sDMPos[1]) - nz(sDMPos[1]) / adxLen + dmPos
sDMNeg = nz(sDMNeg[1]) - nz(sDMNeg[1]) / adxLen + dmNeg

DIP = sDMPos / sTR * 100
DIN = sDMNeg / sTR * 100
DX = abs(DIP - DIN) / (DIP + DIN) * 100
adx = sma(DX, adxLen)

// Heiken-Ashi

xClose = ohlc4
xOpen = (nz(xOpen[1]) + nz(close[1])) / 2
xHigh = max(high, max(xOpen, xClose))
xLow = min(low, min(xOpen, xClose))

// Trailing ATR

v1 = abs(xHigh - xClose[1])
v2 = abs(xLow - xClose[1])
v3 = xHigh - xLow

trueRange = max(v1, max(v2, v3))
atr = useHeiken ? rma(trueRange, atrLen) : atr(atrLen)

m = rising(adx, 1) and (adx < adxThresh or not aboveThresh) ? m1 : falling(adx, 1) or (adx > adxThresh and aboveThresh) ? m2 : nz(m[1])
mUp = DIP >= DIN ? m : m2
mDn = DIN >= DIP ? m : m2

src_ = useHeiken ? xClose : src
c = useHeiken ? xClose : close
t = useHeiken ? (xHigh + xLow) / 2 : hl2

up = t - mUp * atr
dn = t + mDn * atr

TUp = max(src_[1], c[1]) > TUp[1] ? max(up, TUp[1]) : up
TDown = min(src_[1], c[1]) < TDown[1] ? min(dn, TDown[1]) : dn

trend = min(src_, min(c, close)) > TDown[1] ? 1 : max(src_, max(c, close)) < TUp[1]? -1 : nz(trend[1], 1)
stop = trend == 1 ? TUp : TDown
trendChange = change(trend)

longCondition = (trendChange > 0)
if (longCondition)
    strategy.entry("long", strategy.long)
shortCondition = (trendChange < 0)
if (shortCondition)
    strategy.entry("short", strategy.short)    
    
// Plot

lineColor = not(trendChange) ? trend > 0 ? #00FF00DD : #FF0000DD : #00000000
shapeColor = trendChange ? trendChange > 0 ? #00FF00F8 : #FF0000F8 : #00000000

plot(stop, color = lineColor, style = line, linewidth = 1, title = "ATR Trend")
plotshape(trendChange ? stop : na, style = shape.circle, size = size.tiny, location = location.absolute, color = shapeColor, title = "Change")

alertcondition(trendChange > 0, title = "ATR-ADX Change Up", message = "ATR-ADX Change Up")
alertcondition(trendChange < 0, title = "ATR-ADX Change Down", message = "ATR-ADX Change Down")

// end

Plus de