ADX-Dynamische Trendstrategie

Schriftsteller:ChaoZhang, Datum: 15.01.2024
Tags:

img

Übersicht

Die ADX Dynamic Trend Strategy ist eine quantitative Handelsstrategie, die den ADX-Indikator verwendet, um die Stärke und Richtung von Markttrends zu bestimmen.

Handelslogik

Die Strategie verwendet zunächst den ADX-Indikator, um festzustellen, ob ein Trend auf dem Markt besteht. Wenn der ADX über einem vom Benutzer definierten Schlüsselniveau liegt (Standard 23), signalisiert er, dass der Markttrend relativ stark ist. Wenn der aktuelle ADX-Wert höher ist als der ADX-Wert vor n Tagen (n ist der vom Benutzer definierte Rückblickzeitraum, Standard 3 Tage), signalisiert er, dass der ADX steigt und sich ein Trend auf dem Markt bildet.

Die Strategie nutzt dann DI+ und DI- um die Richtung des Markttrends zu bestimmen. Wenn DI+ höher ist als DI-, signalisiert es einen Aufwärtstrend auf dem Markt. Wenn DI+ niedriger ist als DI-, signalisiert es einen Abwärtstrend auf dem Markt.

Schließlich kombiniert die Strategie die ADX- und DI-Analyse, um spezifische Kauf- und Verkaufssignale zu erzeugen:

  1. Wenn der ADX steigt und über dem Schlüsselwert liegt und DI+ höher als DI- ist, wird ein Kaufsignal generiert.
  2. Wenn ADX steigt und über dem Schlüsselwert liegt und DI+ unter DI- liegt, wird ein Verkaufssignal generiert
  3. Wenn ADX abnimmt, wird ein flaches Positionssignal erzeugt

Die Strategie bietet auch Funktionen wie gleitende Durchschnittsfilterung und anpassbaren Backtesting-Zeitrahmen.

Analyse der Vorteile

Die ADX Dynamic Trend Strategy weist folgende Vorteile auf:

  1. Automatische Erkennung von Markttrends und Vermeidung eines ineffektiven Handels
  2. Automatische Bestimmung der Marktentwicklung für den folgenden Trend
  3. Klarer Logik von Kauf auf Trend Existenz und Flachung auf Trend Verschwinden
  4. Konfigurerbares gleitendes Durchschnittsfilter vermeidet falsche Ausbrüche
  5. Anpassbarer Backtesting-Zeitrahmen für historische Tests
  6. Einstellbare Indikatorparameter für die Optimierung verschiedener Produkte

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Der ADX-Indikator wirkt nachlässig und verpasst möglicherweise frühe Trendchancen
  2. Die Abhängigkeit von DI kann falsche Signale erzeugen, da DI empfindlich ist
  3. Der gleitende Durchschnittsfilter kann kurzfristige Chancen verpassen
  4. Unzulängliche Rückprüfung kann zu Überanpassung führen
  5. Fehlende Indikatorparameter können die Strategieleistung beeinträchtigen

Zur Verringerung der Risiken können folgende Maßnahmen berücksichtigt werden:

  1. Verkürzung der ADX-Parameter zur Verringerung der Verzögerung
  2. Entfernen oder einstellen Sie den DI-Filter, um falsche Signale zu verhindern
  3. Verkürzung der gleitenden Durchschnittsperiode
  4. Erweiterung des Zeitrahmens für Backtesting für die vollständige Probenprüfung
  5. Optimieren von Parametern, um die besten Einstellungen zu finden

Möglichkeiten zur Verbesserung

Die Strategie kann in folgenden Aspekten verbessert werden:

  1. Portfoliotests für mehrere Bestände zur Diversifizierung des Einzelbestandrisikos
  2. Hinzufügen von Stop-Loss-Logik zur Steuerung pro Handelsverlust
  3. Kombination mit anderen Indikatoren zur Signalprüfung zur Verbesserung der Genauigkeit
  4. Einführung von Algorithmen für maschinelles Lernen zur Erzeugung von Kauf-/Verkaufssignalen
  5. Hinzufügen eines automatischen Parameter-Tuning-Moduls für die dynamische Anpassung

Schlussfolgerung

Die ADX Dynamic Trend Strategy nutzt ADX, um die Existenz des Trends und DI für die Trendrichtung zu bestimmen. Sie erzeugt Handelssignale, wenn ein Trend existiert, und ebnet Positionen, wenn der Trend verschwindet. Die Logik ist klar. Durch die automatische Erkennung und Verfolgung von Trends kann ein ineffizienter Handel in nicht-trendigen Märkten bis zu einem gewissen Grad vermieden werden. Mit der richtigen Verbesserung kann diese Strategie zu einem leistungsstarken Werkzeug für mittelfristigen bis langfristigen quantitativen Handel werden.


/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh with inspiration from @9e52f12edd034d28bdd5544e7ff92e 
//The intent behind this study is to look at ADX when it has an increasing slope and is above a user-defined key level (23 default). 
//This is to identify when it is trending.
//It then looks at the DMI levels.  If D+ is above D- and the ADX is sloping upwards and above the key level, it triggers a buy condition.  Opposite for short.
//Can use a user-defined moving average to filter long/short if desried.
// NOTE: THIS IS MEANT TO BE USED IN CONJUNCTION WITH MY "ATX TRIGGER" INDICATOR FOR VISUALIZATION. MAKE SURE SETTINGS ARE THE SAME FOR BOTH.

strategy("ADX | DMI Trend", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.04)

// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
// ADX Info
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(23, title="Keylevel for ADX")
adxLookback = input(3, title="Lookback Period for Slope")

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 200, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    close

// == USE BUILT-IN DMI FUNCTION TO DETERMINE ADX AND BULL/BEAR STRENGTH
[diplus, diminus, adx] = dmi(dilen, adxlen)

buySignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus > diminus  and close >= maFilterCheck
// buySignalValue = valuewhen(buySignal, close, 0)
shortSignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus < diminus  and close <= maFilterCheck
// shortSignalValue = valuewhen(shortSignal, close, 0)
sellCoverSignal = adx[0]-adx[adxLookback] < 0

// == ENTRY & EXIT CRITERIA
// Triggers to be TRUE for it to fire of the BUY Signal : (opposite for the SELL signal).
// (1): Price is over the 200 EMA line. (EMA level configurable by the user)
// (2): "D+" is OVER the "D-" line
// (3): RSI 7 is under 30 (for SELL, RSI 7 is over 70)
// 1* = The ultimate is to have a combination line of 3 EMA values, EMA 14, EMA 50 and EMA 200 - And if price is over this "combo" line, then it's a strong signal

// == STRATEGY ENTRIES/EXITS == 
strategy.entry("Long", strategy.long, when = buySignal)
strategy.close("Long", when = sellCoverSignal)
strategy.entry("Short", strategy.short, when = shortSignal)
strategy.close("Short", when = sellCoverSignal)
    
// == ALERTS == 
// alertcondition(buySignal, title='ADX Trigger Buy', message='ADX Trigger Buy')
// alertcondition(sellSignal, title='ADX Trigger Sell', message='ADX Trigger Sell')

Mehr