Diese Strategie verwendet einen 24-Perioden-Donchian-Kanal in Kombination mit einem 200-Perioden- gleitenden Durchschnitt als Haupthandelssignale.
Die strategische Logik beruht hauptsächlich auf den folgenden Punkten:
Ein Donchian-Kanal wird mit dem höchsten Höchststand und dem niedrigsten Tiefstand der letzten 24 Perioden konstruiert.
Der 200-Perioden- gleitende Durchschnitt dient als Filter für Long/Short-Bias. Wenn der Preis den Donchian Channel durchbricht und sich auf der anderen Seite des gleitenden Durchschnitts befindet, kann eine Umkehr wahrscheinlich sein.
Eintrittssignale sind:
Der Stop-Loss für Short-Positionen wird auf den höchsten Höchststand der letzten 3 Bars gesetzt. Der Take-Profit wird auf den Einstiegspreis minus 3 Mal die Differenz zwischen dem Stop-Loss und dem Einstiegspreis gesetzt. Die Long-Position Stop-Loss und Take-Profit-Logik ist das Gegenteil.
Der Vorteil dieser Strategie besteht darin, dass sie durch die Kombination des Donchian-Kanals und des gleitenden Durchschnittsfilters verhindert, dass falsche Signale auf einen einzigen Indikator angewiesen werden, was die Gewinnrate erheblich verbessert.
Die Strategie weist folgende Vorteile auf:
Hohe Gewinnrate: Durch die Kombination des Donchian-Kanals und des gleitenden Durchschnittsfilters werden unnötige Verluste aufgrund falscher Signale eines einzelnen Indikators vermieden.
Kontrollierbares Risiko: Die Verwendung des jüngsten höchsten Höchst-/niedrigsten Tiefstands als Stop-Loss-Level verwaltet effektiv den Abwärtstrend bei Verlustgeschäften.
Einfach und einfach umzusetzen: Die Logik verwendet einfache, intuitive Indikatoren, die leicht zu verstehen und umzusetzen sind.
Robustheit über Märkte und Zeitrahmen hinweg: Mit relativ wenigen Parametern ist die Strategie über verschiedene Produkte und Zeitrahmen hinweg stabil.
Die wichtigsten Risiken dieser Strategie sind:
Extreme Marktbewegungen: Sehr starke einseitige Trends können zu Stop-Losses führen, die zu verstärkten Verlusten führen.
Frühzeitiges Ausstiegssignalrisiko: Das Ausstiegssignal kann zu einem Überhandel in unruhigen Märkten führen.
Parameteroptimierungsrisiko: Eine schlechte Einstellung der Parameter der Donchian Channel Lookback Periode oder des gleitenden Durchschnitts kann zu verzögerten oder häufigen Signalen führen. Dies kann durch strenge Optimierung und kombinatorische Tests minimiert werden.
Die Strategie kann wie folgt verbessert werden:
Optimieren Sie den Donchian Channel und gleitende Durchschnittsrückblickperioden, um die beste Kombination von Parametern zu finden.
Verschiedene Stop-Loss-Tests, um Gewinnquoten zu ermitteln, um die Gewinnquote gegenüber der Belohnung/dem Risiko auszugleichen.
Einbeziehung zusätzlicher Filter für Eingangssignale unter Verwendung von Indikatoren wie MACD, RSI usw. zur Verbesserung der Robustheit.
Optimieren Sie die Exit-Logik, um unnötige Exits in unruhigen Märkten zu vermeiden.
Entwicklung neuer Kombinationen unter Verwendung dieses Strategierahmens, z. B. mit anderen Kanälen, Bandindikatoren usw.
Die Slow Moving Average-Strategie hat eine klare, leicht verständliche Logik, die eine Kombination aus Donchian Channel und gleitendem Durchschnitt für die Signalgenerierung verwendet. Dieser hybride Ansatz verbessert die Stabilität und Gewinnrate erheblich. Das 3: 1 Gewinn-Verlust-Verhältnis bietet auch ein gutes Belohnungspotenzial. Während Risiken in Bezug auf extreme Bewegungen und Signalfehler bestehen, können zahlreiche Optimierungsmöglichkeiten die Leistung verbessern und die Kernstrategie erweitern.
/*backtest start: 2023-11-06 00:00:00 end: 2023-12-06 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Mysteriown //@version=4 strategy("Lagged Donchian Channel + EMA", overlay = true) //tradePeriod = time(timeframe.period,"0000-0000:1234567")?true:false // ------------------------------------------ // // ----------------- Inputs ----------------- // // ------------------------------------------ // period = input(24, title="Channel's periods") Pema = input(200, title="EMA's periods ?") ratio = input(3, title="Ratio TP", type=input.float) loss = input(20, title="Risk Loss ($)") lev = input(5, title="Leverage *...") chan = input(title="Plot channel ?", type=input.bool, defval=false) Bpos = input(title="Plot Bull positions ?", type=input.bool, defval=false) bpos = input(title="Plot Bear positions ?", type=input.bool, defval=false) labels = input(title="Plot labels of bets ?", type=input.bool, defval=true) supp = input(title="Delete last labels ?", type=input.bool, defval=true) // ------------------------------------------ // // ---------- Canal, EMA and arrow ---------- // // ------------------------------------------ // pema = ema(close,Pema) plot(pema, title="EMA", color=color.blue) canalhaut = highest(period)[1] canalbas = lowest(period)[1] bear = close[1] > canalhaut[1] and close < open and high > pema bull = close[1] < canalbas[1] and open < close and low < pema canalhautplot = plot(chan? canalhaut:na, color=color.yellow) canalbasplot = plot(chan? canalbas:na, color=color.yellow) plotshape(bear, title='Bear', style=shape.triangledown, location=location.abovebar, color=color.red, offset=0) plotshape(bull, title='Bull', style=shape.triangleup, location=location.belowbar, color=color.green, offset=0) // ------------------------------------------ // // ------------- Position Short ------------- // // ------------------------------------------ // SlShort = highest(3) BidShort = close[1] TpShort = BidShort-((SlShort-BidShort)*ratio) deltaShort = (SlShort-BidShort)/BidShort betShort = round(loss/(lev*deltaShort)*100)/100 cryptShort = round(betShort*lev/BidShort*1000)/1000 // if bear[1] and labels //and low < low[1] // Lbear = label.new(bar_index, na, text="SHORT\n\nSL: " + tostring(SlShort) + "\n\nBid: " + tostring(BidShort) + "\n\nTP: " + tostring(TpShort) + "\n\nMise: " + tostring(betShort) + "\n\nCryptos: " + tostring(cryptShort), color=color.red, textcolor=color.white, style=label.style_labeldown, yloc=yloc.abovebar) // label.delete(supp ? Lbear[1] : na) var bentry=0.0 var bsl=0.0 var btp=0.0 if bear[1] and low < low[1] bentry:=BidShort bsl:=SlShort btp:=TpShort pbentry = plot(bpos? bentry:na, color=color.orange) plot(bpos? (bentry+btp)/2:na, color=color.gray) pbsl = plot(bpos? bsl:na, color=color.red) pbtp = plot(bpos? btp:na, color=color.green) fill(pbentry,pbsl, color.red, transp=70) fill(pbentry,pbtp, color.green, transp=70) // ------------------------------------------ // // ------------- Position Long -------------- // // ------------------------------------------ // SlLong = lowest(3) BidLong = close[1] TpLong = BidLong + ((BidLong - SlLong) * ratio) deltaBull = (BidLong - SlLong)/BidLong betLong = round(loss/(lev*deltaBull)*100)/100 cryptLong = round(betLong*lev/BidLong*1000)/1000 // if bull[1] and labels //and high > high[1] // Lbull = label.new(bar_index, na, text="LONG\n\nSL: " + tostring(SlLong) + "\n\nBid: " + tostring(BidLong) + "\n\nTP: " + tostring(TpLong) + "\n\nMise: " + tostring(betLong) + "\n\nCryptos: " + tostring(cryptLong), color=color.green, textcolor=color.white, style=label.style_labelup, yloc=yloc.belowbar) // label.delete(supp ? Lbull[1] : na) var Bentry=0.0 var Bsl=0.0 var Btp=0.0 if bull[1] and high > high[1] Bentry:=BidLong Bsl:=SlLong Btp:=TpLong pBentry = plot(Bpos?Bentry:na, color=color.orange) plot(Bpos?(Bentry+Btp)/2:na, color=color.gray) pBsl = plot(Bpos?Bsl:na, color=color.red) pBtp = plot(Bpos?Btp:na, color=color.green) fill(pBentry,pBsl, color.red, transp=70) fill(pBentry,pBtp, color.green, transp=70) // ------------------------------------------ // // --------------- Strategie ---------------- // // ------------------------------------------ // Bear = bear[1] and low < low[1] Bull = bull[1] and high > high[1] if (Bear and strategy.opentrades==0) strategy.order("short", false, 1, limit=BidShort) strategy.exit("exit", "short", limit = TpShort, stop = SlShort) strategy.cancel("short", when = high > SlShort or low < (BidShort+TpShort)/2) strategy.close("short", when=bull) if (Bull and strategy.opentrades==0) strategy.order("long", true, 1, limit=BidLong) strategy.exit("exit", "long", limit = TpLong, stop = SlLong) strategy.cancel("long", when = low < SlLong or high > (BidLong+TpLong)/2) strategy.close("long", when=bear)