Momentum-Breakout-Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-19
Tags:

img

Übersicht

Die Momentum-Breakout-Handelsstrategie ist eine Trendfolgestrategie, die Handelssignale erzeugt, indem Preisbreaks über wichtige Unterstützungs-/Widerstandsniveaus hinaus erkannt werden.

Strategie Logik

Der Kernindikator dieser Strategie ist der Donchian Channel. Der Donchian Channel besteht aus dem höchsten Preis, dem niedrigsten Preis und dem mittleren Preis über einen bestimmten Zeitraum. Das obere und untere Band des Kanals verbindet die höchsten und niedrigsten Preise entsprechend über den Lookback-Zeitraum. Ein langes Signal wird erzeugt, wenn der Preis über das obere Band bricht, während ein kurzes Signal bei einem Bruch unter dem unteren Band erzeugt wird, was Veränderungen der Marktdynamik widerspiegelt.

Der gleitende Durchschnitt wird verwendet, um die Trendrichtung zu messen. Nur Kaufsignale mit einem Preis über dem gleitenden Durchschnitt werden genommen, um Konsolidierungen zu vermeiden.

Insbesondere besteht die Einstiegsbedingung aus: Der Preis bricht über das obere Band des Donchian-Kanals aus und schließt über dem gleitenden Durchschnitt.

Der Stop-Loss folgt dem unteren Donchian Channel-Band und sorgt dafür, dass sich der Stop mit dem Trend höher anpasst.

Analyse der Vorteile

Diese Strategie kombiniert effektiv zwei Indikatoren, um die Trendrichtung und -dynamik zu beurteilen und fehlerhafte Trades aus falschen Breakout-Signalen zu vermeiden.

Die Vorteile sind insbesondere:

  1. Der Donchian Channel bestimmt dynamisch die wichtigsten Unterstützungs-/Widerstandsniveaus und identifiziert Trendwendepunkte.

  2. Der gleitende Durchschnitt filtert Konsolidierungen aus und vermeidet unnötige Whipsaws.

  3. Die Verfolgung des unteren Bandes des Donchian-Kanals ermöglicht eine Maximierung der Gewinne.

  4. Vernünftige Parameter sorgen für Flexibilität in verschiedenen Marktumgebungen.

Risikoanalyse

Die wichtigsten Risiken:

  1. Ausfallrisiko - Der Kurs kann die Dynamik nach dem Ausbruch nicht über dem oberen Bereich halten.

  2. Das Risiko einer Trendumkehrung - Preisumkehrungen vor Erreichen des Trailing-Stop-Loss.

  3. Parameteroptimierungsrisiko - Ineffiziente Parameter führen zu Überhandelungen oder zu unzureichenden Signalen.

Um dies zu mindern, sollten Faktoren wie Volumenbestätigung, gleitende Durchschnittsverstellung und angemessene Stoppdistanzen berücksichtigt werden.

Möglichkeiten zur Verbesserung

Weitere Optimierungen:

  1. Fügen Sie den Lautstärkungsfilter hinzu, um hohe Schwungbreaks zu gewährleisten.

  2. Optimierung der gleitenden Durchschnittsperioden für die Instrumenteneigenschaften.

  3. Anpassungsfähiger Stop-Loss-Mechanismus auf Basis der Preisvolatilitätsdynamik.

  4. Rücktrittsmechanismus nach dem ersten Stopp-Out, um zusätzliche Trendwiederholungsbewegungen zu erfassen.

  5. Robuste Multi-Markt-Tests zur Identifizierung von Parametern nach Produktnuancen.

Schlussfolgerung

Die Momentum-Breakout-Handelsstrategie kombiniert Indikatoren, um den Trend und die Dynamikstärke effektiv zu messen und die häufigen Probleme zu vermeiden, mit denen Trendsysteme in Bezug auf Blind-Einträge konfrontiert sind.


/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Revision:        1
// Author:          @millerrh
// Strategy:  
//      Entry: Buy when Donchian Channel breaks out
//      Exit: Trail a stop with the lower Donchian Channel band
// Conditions/Variables:
//    1. Can add a filter to only take setups that are above a user-defined moving average (helps avoid trading counter trend) 
//    2. Manually configure which dates to back test
//    3. User-Configurable DC Channel length


// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study() 
strategy("Donchian Breakout", 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.1)
// (STUDY ONLY) - Comment out study() when in a strategy() 
//study("Donchian Breakout", overlay=true)


// === 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 ==
trigInput = input(title = "Execute Trades On...", defval = "Wick", options=["Wick","Close"]) // Useful for comparing standing stop orders vs. waiting for candle closes prior to action
stopTrail = input(title = "Trail Stops On...", defval = "ATR", options = ["ATR","Bottom of DC Channel","Midline of DC Channel","Tightest of ATR/Bot DC Channel"])
dcPeriod = input(title="DC period", type=input.integer, defval=20)

// === PLOT THE DONCHIAN CHANNEL ===
// Logic
dcUpper = highest(high, dcPeriod)
dcLower = lowest(low, dcPeriod)
dcMid = avg(dcUpper, dcLower)

// Plotting
dcUplot = plot(dcUpper, color=color.blue, linewidth=1, title="Upper Channel Line")
dcLplot = plot(dcLower, color=color.blue, linewidth=1, title="Lower Channel Line")
dcMidPlot = plot(dcMid, color=color.gray, linewidth=1, title="Mid-Line Average")
fill(dcUplot, dcLplot, color=color.gray, transp=90)

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="SMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 100, 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
    0

// == ENTRY AND EXIT CRITERIA ==
// Trigger stop based on candle close or High/Low (i.e. Wick) - If doing daily timeframe, can do candle close.  Intraday should use wick.
trigResistance = trigInput == "Close" ? close : trigInput == "Wick" ? high : na
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na
buySignal = trigResistance >= dcUpper[1] // The [1] looks at the previous bar's value as it didn't seem to be triggering correctly without it (likely) DC moves with each bar
sellSignal = trigSupport <= dcLower[1]

buy = buySignal and dcUpper[1] > maFilterCheck // All these conditions need to be met to buy


// (STRATEGY ONLY) Comment out for Study
// This string of code enters and exits at the close
if (trigInput == "Close")
    strategy.entry("Long", strategy.long, when = buy)
    strategy.close("Long", when = sellSignal)

// This string of code enters and exits at the wick (i.e. with pre-set stops)
if (trigInput == "Wick")
    strategy.entry("Long", strategy.long, stop = dcUpper[1], when = time > Start and time < Finish and dcUpper[1] > maFilterCheck)
    strategy.exit("Exit Long", from_entry = "Long", stop = dcLower[1])





Mehr