
Die Momentum-Breakout-Trading-Strategie ist eine Trendverfolgungs-Strategie, die ein Handelssignal erzeugt, indem sie die kritische Resistenz-Unterstützungsstelle erkennt, die der Preis durchbricht. Die Strategie verwendet die Dynamik des Donchian-Kanals, um die kritische Resistenz-Unterstützungsstelle zu ermitteln, und kombiniert sie mit einem Moving-Average-Indikator, um ein weiteres Signal zu filtern und falsche Geschäfte zu vermeiden.
Der Kern der Strategie ist der Donchian Channel. Der Donchian Channel besteht aus Höchst-, Tief- und Mittelpreisen. Die oberen und unteren Bahnlinien verbinden jeweils die höchsten und niedrigsten Preise innerhalb eines bestimmten Zeitraums.
Der Moving Average wird verwendet, um die Richtung der Preisentwicklung zu bestimmen. Die Kaufsignale für den Übergang der Kanalstraße werden nur dann verwendet, wenn der Preis über dem Moving Average liegt, um einen Kauf in der Verrechnungszone zu vermeiden.
Die Eintrittsbedingungen für diese Strategie sind: Der Preis muss den Donchian Channel überschreiten und der Schlusskurs muss über dem Moving Average liegen. Die Ausstiegsbedingungen sind: Der Preis muss den Donchian Channel überschreiten.
Die Stop-Loss-Methode verfolgt den Donchian Channel nach unten. Dies garantiert, dass der Stop-Loss-Punkt mit dem Trend nach oben bewegt wird.
Die Strategie kombiniert zwei Indikatoren, die die Richtung und Stärke des Trends bestimmen, um Breakout-Signale zu erkennen und falsche Geschäfte zu vermeiden. Die Stop-Loss-Methode ist jedoch vernünftig, so dass die Strategie den Trends vollständig folgen kann.
Insbesondere hat diese Strategie folgende Vorteile:
Der Donchian Channel-Indikator kann dynamisch wichtige Unterstützungs- und Widerstandspunkte identifizieren und wichtige Trendwendepunkte identifizieren.
Der Moving Average dient als Filter zur Vermeidung von Kauf- und Verrechnungszonen und zur Verringerung von ungültigen Transaktionen.
Die Stop-Loss-Methode ist die Verfolgung der Donchian Channel-Unterspannung, um den Trend zu maximieren.
Die Strategieparameter sind flexibel eingestellt und können für unterschiedliche Marktbedingungen angepasst und optimiert werden.
Die Risiken der Strategie sind vor allem:
Risiko eines Durchbruchs. Wenn der Preis den Kanal durchbrochen hat, kann er schnell zurückgeschaltet werden, so dass keine effiziente Lagerhaltung möglich ist.
Trendumkehrrisiko: Die Kursumkehr kann vor dem Stop-Loss-Punkt eintreten und zu einem Stop-Loss führen.
Risiken bei der Optimierung von Parametern. Fehlende Parameter-Einstellungen können zu häufigen oder unzureichenden Signalen führen.
Diese Risiken können optimiert werden, indem die Moving-Average-Periode angepasst wird, die Transaktionsmenge gefiltert wird, um sicherzustellen, dass die erzeugten Signale zuverlässiger sind. Die Risiken der kurzfristigen Anpassung sollten mit entsprechenden Loose-Stop-Loss-Einstellungen begegnet werden.
Die Strategie kann in folgenden Bereichen weiter optimiert werden:
Die Übertragungsmessung wird verwendet, um das Signal zu filtern, um sicherzustellen, dass der Durchbruch stark ist.
Optimierung der Periodizität der Moving Average-Parameter, um sie besser an die Eigenschaften der verschiedenen Sorten anzupassen.
Anpassung der Stop-Loss-Mechanismen, um die Stop-Loss-Distanz an die Schwankungen der Marktlage anzupassen.
Ein zusätzlicher Wiedereintrittsmechanismus, um Trendchancen nach dem Ausstieg zu erfassen.
Mehrsprachige Rückmeldung, um die Parameter für die Robustheit zu überprüfen. Die Parameter werden entsprechend der Eigenschaften der verschiedenen Sorten eingeschränkt.
Die Dynamic Breakthrough Trading Strategie integriert verschiedene Indikatoren, um die Richtung und Stärke des Trends zu bestimmen und die häufige Problematik des Blind-Positions-Systems zu lösen. Die Strategie kann flexibel eingestellt werden und kann für verschiedene Umgebungen und Handelsarten optimiert werden. Es ist ein eher allgemeines und praktisches Breakout-System.
/*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])