ADX-Momentums-Trendstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-16 15:57:17
Tags:

img

Übersicht

Diese Strategie verwendet den ADX-Indikator, um den Markttrend zu bestimmen, kombiniert sich mit dem DMI-Indikator, um die Richtung zu bestimmen, nutzt die ADX-Neigung, um die Trendstärke zu messen, setzt den ADX-Schlüssellevel, um nicht-trendige Märkte zu filtern, und verwendet einen gleitenden Durchschnitt, um Handelssignale zu filtern.

Strategie Logik

  1. Berechnen der ADX-, DI+- und DI-Indikatoren.
  2. Die ADX-Spannung > 0 zeigt einen steigenden Trend an; der Schlüsselwert ist auf 23 festgelegt, um nicht-trendige Märkte zu filtern.
  3. DI+ über DI- bedeutet, dass die Aufwärtsdynamik die Abwärtsdynamik übersteigt und ein Kaufsignal gibt.
  4. Wenn der Filter für gleitende Durchschnitte aktiviert ist, werden nur Kaufsignale erzeugt, wenn der Schlusspunkt über dem gleitenden Durchschnitt liegt.
  5. Schließen von Positionen, wenn die ADX-Neigung < 0, was auf einen abnehmenden Trend hinweist.

Analyse der Vorteile

  1. Der MA-Filter reduziert den Lärm bei nicht-trendigen Märkten.
  2. Die ADX-Neigung bestimmt genau die Trendstärke.
  3. DI zeigt Richtung und ADX für Stärke bildet ein robustes Trend-Trading-System.
  4. Erwarten Sie eine geringere Auslastung und einen höheren Gewinnfaktor als bei einfachen MA-Strategien.

Risikoanalyse

  1. Die ADX-Ergebnisse variieren signifikant mit unterschiedlichen Eingabeparametern.
  2. Das DMI kann vor der klaren Bestimmung der Richtung falsche Signale geben.
  3. Es gibt eine gewisse Verzögerung, die die Effizienz der Strategie verringert.

Optimierungsrichtlinien

  1. Optimieren Sie die ADX-Parameter für optimale Ergebnisse.
  2. Hinzufügen von Stop-Loss zu Limit-Loss bei einzelnen Trades.
  3. Versuchen Sie, andere Indikatoren zu kombinieren, um Signale zu filtern, z. B. RSI, Bollinger Bands.

Zusammenfassung

Diese Strategie nutzt die Stärke von ADX bei der Bestimmung von Trend und Momentum vollständig, kombiniert mit DMI für die Richtungsanalyse, um ein komplettes Trendfolgensystem zu bilden. Der MA-Filter reduziert effektiv den Lärm. Weitere Parameter-Tuning und Indikatorkombinationen können die Robustheit und Effizienz verbessern. Zusammenfassend hat diese Strategie durch die Einbeziehung von Trend-, Momentum- und Richtungsanalyse das Potenzial, starke Renditen zu erzielen.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 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