Strategie des langsam gleitenden Durchschnitts

Schriftsteller:ChaoZhang, Datum: 23.07.2023
Tags:

img

Übersicht

Diese Strategie verwendet einen 24-Perioden-Donchian-Kanal in Kombination mit einem 200-Perioden- gleitenden Durchschnitt als Haupthandelssignale.

Strategie Logik

Die strategische Logik beruht hauptsächlich auf den folgenden Punkten:

  1. Ein Donchian-Kanal wird mit dem höchsten Höchststand und dem niedrigsten Tiefstand der letzten 24 Perioden konstruiert.

  2. 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.

  3. Eintrittssignale sind:

  • Kurz: Die Schließung des vorherigen Balkens liegt über dem oberen Band des Donchian-Kanals und unter dem 200-Perioden-MA. Die Öffnung des aktuellen Balkens liegt unter dem vorherigen Schließen und das Tief liegt unter dem 200-MA.
  • Lang: Der Schluß des vorherigen Balkens liegt unterhalb des unteren Bandes des Donchian-Kanals und über dem 200-Perioden-MA. Der Offener des aktuellen Balkens liegt über dem vorherigen Schluß und der Höchststand liegt über dem 200-MA.
  1. 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.

  2. 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.

Analyse der Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Hohe Gewinnrate: Durch die Kombination des Donchian-Kanals und des gleitenden Durchschnittsfilters werden unnötige Verluste aufgrund falscher Signale eines einzelnen Indikators vermieden.

  2. 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.

  3. Einfach und einfach umzusetzen: Die Logik verwendet einfache, intuitive Indikatoren, die leicht zu verstehen und umzusetzen sind.

  4. Robustheit über Märkte und Zeitrahmen hinweg: Mit relativ wenigen Parametern ist die Strategie über verschiedene Produkte und Zeitrahmen hinweg stabil.

Risikoanalyse

Die wichtigsten Risiken dieser Strategie sind:

  1. Extreme Marktbewegungen: Sehr starke einseitige Trends können zu Stop-Losses führen, die zu verstärkten Verlusten führen.

  2. Frühzeitiges Ausstiegssignalrisiko: Das Ausstiegssignal kann zu einem Überhandel in unruhigen Märkten führen.

  3. 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.

Möglichkeiten zur Verbesserung

Die Strategie kann wie folgt verbessert werden:

  1. Optimieren Sie den Donchian Channel und gleitende Durchschnittsrückblickperioden, um die beste Kombination von Parametern zu finden.

  2. Verschiedene Stop-Loss-Tests, um Gewinnquoten zu ermitteln, um die Gewinnquote gegenüber der Belohnung/dem Risiko auszugleichen.

  3. Einbeziehung zusätzlicher Filter für Eingangssignale unter Verwendung von Indikatoren wie MACD, RSI usw. zur Verbesserung der Robustheit.

  4. Optimieren Sie die Exit-Logik, um unnötige Exits in unruhigen Märkten zu vermeiden.

  5. Entwicklung neuer Kombinationen unter Verwendung dieses Strategierahmens, z. B. mit anderen Kanälen, Bandindikatoren usw.

Schlussfolgerung

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)


Mehr