
Die Strategie ist eine Trendverfolgung in Kombination mit dem ATR- und dem ADX-Indikator. Sie passt die ATR-Multiplikatoren dynamisch an die Trendlage des Marktes an, um eine bessere Trendverfolgung zu ermöglichen.
Die Strategie basiert hauptsächlich auf den ATR- und ADX-Indikatoren.
Zunächst berechnen wir die tatsächliche Bandbreite (ATR) und die ADX. Die ATR spiegelt die Marktschwankungen wider, während die ADX die Trendstärke beurteilt.
Dann wird der aktuelle Trend nach der Differenz des ADX-Polyhead-Indikators DX als Polyhead beurteilt. Wenn DI+ höher als DI- ist, ist dies ein mehrköpfiger Trend, wenn DI- höher als DI+ ist, ist dies ein leerer Trend.
Anschließend wird ein größerer ATR-Multiplikator verwendet, wenn der ADX steigt, und ein kleinerer ATR-Multiplikator, wenn der ADX fällt, um eine dynamische Anpassung zu erreichen. Dies ist der Kern der Strategie.
Letztendlich werden die Mittelwerte der ATR und der Preise kombiniert, um den Auf- und Abwärtstrend zu berechnen und die Richtung des Trends zu bestimmen. Blick hoch, wenn der Preis den Aufwärtstrend durchbricht, Blick unten, wenn der Preis den Abwärtstrend durchbricht.
Die Strategie kombiniert also ATR- und ADX-Indikatoren und kann Trends besser erfassen und handeln, indem die ATR-Parameter dynamisch angepasst werden.
Die Strategie hat einige deutliche Vorteile:
Daher ist es eine sehr praktische Trend-Tracking-Strategie, die eine hervorragende Rückzugskontrolle bietet und empfohlen wird.
Die Strategie birgt auch einige Risiken:
Daher ist die Optimierung der Parameter und die Risikokontrolle wichtig. Darüber hinaus kann der Black Swan-Vorfall einen großen Einfluss auf die Strategie haben.
Die Strategie kann in folgenden Richtungen optimiert werden:
Daher bleibt der Strategie noch viel Optimierungsraum, und es ist notwendig, die Parameter und Mechanismen an die Probleme anzupassen.
Die ATR-ADX-Trendstrategie, die sich an die ATR-ADX-Trends anpasst, ist für V2 insgesamt hervorragend und kann die Trends durch dynamische Anpassung der ATR-Parameter gut erfassen. Gleichzeitig ist die Kombination der beiden Indikatoren ATR und ADX sehr fehleranfällig.
/*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