
Cette stratégie est une stratégie de suivi de tendance combinant l’indicateur ATR et l’indicateur ADX. Elle ajuste dynamiquement le multiplicateur d’ATR en fonction de l’état de tendance du marché, permettant ainsi un meilleur suivi de tendance.
La stratégie est basée sur les indices ATR et ADX.
Tout d’abord, on calcule la portée réelle des fluctuations (ATR) et l’ADX. L’ATR reflète la volatilité du marché et l’ADX détermine la force de la tendance.
Ensuite, en fonction de la différence entre l’indicateur d’orientation polyvalent ADX et DX, jugez l’état polyvalent de la tendance actuelle. Si DI+ est supérieur à DI-, il s’agit d’une tendance polyvalente et si DI- est supérieur à DI+, il s’agit d’une tendance sans tête.
Ensuite, on utilise un ATR plus grand lorsque l’ADX est en hausse (m1) et un ATR plus petit lorsque l’ADX est en baisse (m2), ce qui permet un ajustement dynamique. C’est le cœur de la stratégie.
Finalement, la moyenne combinée de l’ATR et du prix est calculée pour déterminer la direction de la tendance. Voir plus quand le prix est en hausse et moins quand il est en baisse.
Ainsi, la stratégie intègre l’indicateur ATR et l’indicateur ADX, afin de mieux capturer les tendances en ajustant dynamiquement les paramètres ATR.
Cette stratégie présente plusieurs avantages évidents:
C’est donc une stratégie de suivi de tendance très pratique, avec une excellente capacité de contrôle des retraits, et qui est recommandée.
Cette stratégie comporte aussi des risques:
Par conséquent, il est nécessaire de prêter attention à l’optimisation des paramètres et au contrôle des risques. De plus, les événements Black Swan peuvent avoir un impact important sur la stratégie.
Cette stratégie peut être optimisée dans les directions suivantes:
Par conséquent, la stratégie a encore beaucoup à optimiser et il est nécessaire d’ajuster les paramètres et les mécanismes en fonction des problèmes.
La stratégie de tendance auto-adaptative ATR-ADX est excellente pour l’ensemble de la V2, capture bien les tendances en ajustant dynamiquement les paramètres ATR; elle est également très tolérante à l’erreur en combinant les deux indicateurs de jugement ATR et ADX. Cependant, nous devons également faire attention au contrôle des risques et à l’optimisation de la stratégie pour éviter l’expansion des retards et des pertes.
/*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