Eine adaptive ATR-ADX-Trendstrategie V2

Schriftsteller:ChaoZhang, Datum: 2023-12-05 18:08:14
Tags:

img

Übersicht

Dies ist eine Trendfolgestrategie, die den ATR-Indikator und den ADX-Indikator kombiniert und den ATR-Multiplikator entsprechend den Markttrendbedingungen dynamisch anpasst, um eine bessere Trendverfolgung zu erreichen.

Strategie Logik

Die Strategie basiert hauptsächlich auf dem ATR-Indikator und dem ADX-Indikator.

Erstens berechnet es den True Range (ATR) und den ADX. Der ATR spiegelt die Volatilität des Marktes wider, während der ADX die Trendstärke beurteilt.

Zweitens bestimmt es die aktuelle Trendrichtung nach der Differenz zwischen DI+ und DI- im ADX-Indikator. Wenn DI+ höher ist als DI-, ist es ein Aufwärtstrend. Wenn DI- höher ist als DI+, ist es ein Abwärtstrend.

Wenn der ADX dann steigt, verwendet er einen größeren ATR-Multiplikator (m1).

Schließlich berechnet es in Kombination mit ATR und dem Mittelpunkt des Preises die oberen und unteren Bands, um die Trendrichtung zu bestimmen.

Die Strategie beinhaltet also ATR und ADX und kann durch dynamische Anpassung der ATR-Parameter Trends für den Handel besser erfassen.

Analyse der Vorteile

Die Strategie hat mehrere offensichtliche Vorteile:

  1. Fähigkeit zur dynamischen Anpassung von Parametern zur besseren Erfassung von Trends
  2. Kombiniert ATR und ADX für eine umfassendere Beurteilung
  3. Erwartet kontrollierte Abnahmen
  4. Einfache Umsetzung und einfaches Verstehen

Daher ist dies ein sehr praktischer Trend, der eine Strategie mit einer guten Abnahmekontrolle beinhaltet.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. ADX hat nachlassende Ausgaben, kann Trendumkehrpunkte verpassen
  2. Eine falsche Auswahl der ATR-Größe kann zu einem unzureichenden Gewinn oder zu einem übergroßen Stop-Loss führen
  3. Schnelle Ausbrüche gegen Bands, verursacht durch schwarze Schwan-Ereignisse, können zu Verlusten führen

Die Optimierung der Parameter und die Risikokontrolle bedürfen daher einer besonderen Aufmerksamkeit.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Optimierung der ATR- und ADX-Parameter für eine bessere Trendfassung
  2. Hinzufügen anderer Indikatoren zur Bestätigung, um Probleme mit ADX-Verzögerungen zu vermeiden
  3. Entwicklung dynamischer Stop-Loss-Mechanismen zur Kontrolle einzelner Handelsverluste
  4. Anpassung der Positionsgröße an verschiedene Marktumgebungen

Es gibt also noch viel Raum für Optimierung durch Anpassung von Parametern und Mechanismen entsprechend den Problemen.

Schlussfolgerung

Im Allgemeinen funktioniert diese Adaptive ATR-ADX Trend Strategy V2 sehr gut. Durch die dynamische Anpassung der ATR-Parameter erfasst sie Trends gut. Außerdem macht die Kombination von zwei Indikatoren in ATR und ADX sie robuster. Aber wir müssen immer noch auf Risikokontrolle und Optimierung achten, um Verzögerungen und übergroße Verluste zu vermeiden. Insgesamt lohnt sich die Strategie zu lernen und anzuwenden.


/*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

Mehr