Doppel beweglicher Durchschnitt und Supertrendstrategie

Schriftsteller:ChaoZhang, Datum: 2023-09-28 15:12:50
Tags:

Übersicht

Diese Strategie erzeugt Handelssignale basierend auf dem Crossover von 21-Tage- und 55-Tage- gleitenden Durchschnitten und verwendet den Supertrend-Indikator, um falsche Signale auszufiltern.

Strategie Logik

Der Code definiert zunächst die 21-Tage-EMA (EMA1) und die 55-Tage-EMA (EMA2). Ein Kaufsignal wird erzeugt, wenn EMA1 über EMA2 überschreitet. Ein Verkaufssignal wird erzeugt, wenn EMA1 unter EMA2 überschreitet.

Um falsche Signale zu filtern, wird der Supertrend-Indikator hinzugefügt. Der Supertrend berechnet die Trendrichtung basierend auf ATR und den jüngsten High-Low-Preisen. Im Code ist oberhalb der Supertrend-Linie der Auftrend und darunter der Abwärtstrend.

Ein Kaufsignal wird also nur erzeugt, wenn EMA1 während eines Aufwärtstrends über EMA2 kreuzt. Ein Verkaufssignal wird nur erzeugt, wenn EMA1 während eines Abwärtstrends unter EMA2 kreuzt. Der Supertrend filtert falsche Signale während von Trendübergängen aus.

Darüber hinaus werden die gleitenden Durchschnitte von 200 und 233 Tagen addiert, um den langfristigen Trend zu bestimmen.

Vorteile

  1. Doppel gleitende Durchschnitte in Kombination mit Supertrend können Trends effektiv identifizieren und falsche Signale filtern.

  2. Durch die Anpassung von gleitenden Durchschnittsparametern kann die Strategie an die unterschiedlichen Marktbedingungen angepasst werden.

  3. Langfristige gleitende Durchschnitte verhindern Risiken aus widersprüchlichen Trends.

  4. Klare Regeln für den algorithmischen Handel.

  5. Visuelle Kauf-/Verkaufssignale machen Handelsentscheidungen klarer.

Risiken

  1. Bei gleitenden Durchschnitten kann es um Wendepunkte herum zu falschen Signalen kommen.

  2. Unangemessene Parameter-Einstellungen können zu verpassten Trends oder zu übermäßigen falschen Signalen führen.

  3. Eine hohe Handelsfrequenz führt zu höheren Transaktionskosten, die überwacht werden müssen.

  4. Die Supertrendparameter müssen so optimiert werden, dass die Filterwirksamkeit und die Verzögerung im Gleichgewicht bleiben.

  5. Langfristige Durchschnittswerte können bei der Erzeugung von Signalen verzögern.

Verbesserungen

  1. Versuche verschiedene Kombinationen von gleitenden Durchschnitten, um optimale Parameter zu finden.

  2. Optimieren Sie die Supertrend-Parameter, um Filterung und Verzögerung auszugleichen.

  3. Hinzufügen anderer Indikatoren wie Lautstärke, um Signale weiter zu validieren.

  4. Verwenden Sie Stimmungs- und Nachrichtenanalysen, um mögliche Wendepunkte zu identifizieren.

  5. Verwenden Sie maschinelles Lernen, um Parameter dynamisch zu optimieren.

Schlussfolgerung

Diese Strategie kombiniert die Stärken von doppelten gleitenden Durchschnitten und Supertrend bei der Identifizierung von Trends und dem Filtern falscher Signale. Sie kann durch Parameteroptimierung und zusätzliche Validierung kontinuierlich verbessert werden. Trotz bestimmter Risiken können sie durch Risikokontrolltechniken verwaltet werden. Die Strategie eignet sich für den algorithmischen Handel.


/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"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/
// © bhavikmota

//@version=4
strategy("EMA & Supertrend", overlay = true)

//length = input(9, minval=1)
//ema1 = ema(close, length)
//ema2 = ema(ema1, length)
//ema3 = ema(ema2, length)

//shortest = ema(close, 20)
//short = ema(close, 50)
//longer = ema(close, 100)
//longest = ema(close, 200)


//for Ema1
len1 = input(21, minval=1)
//src1 = input(close)
ema1 = ema(close,len1)
plot(ema1, color=color.red, linewidth=1)

//for Ema2
len2 = input(55, minval=1)
//src2 = input(close)
ema2 = ema(close,len2)
plot(ema2, color=color.green, linewidth=1)

//for Ema3
len3 = input(200, minval=1)
//src3 = input(close)
ema3 = ema(close,len3)
plot(ema3, color=color.blue, linewidth=1)

//for Ema4
len4 = input(233, minval=1)
//src4 = input(close)
ema4 = ema(close,len4)
plot(ema4, color=color.black, linewidth=1)


Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


//Trading logic

Enterlong = crossover(ema1,ema2) or (close>ema1 and close>ema2 and ema1>ema2) and close>ema4// positive ema crossover
Exitlong = crossunder(close,ema2) // candle closes below supertrend

Entershort = crossunder(ema1,ema2) or (close<ema1 and close<ema2 and ema2<ema1) and close<ema4// negative ema crossover
Exitshort = crossover(close,ema2) // candle closes above supertrend

//Execution Logic - Placing Order

start = timestamp(2008,1,1,0,0)

if time>= start
    strategy.entry("long", strategy.long, when=Enterlong)
    strategy.close("long",when=Exitlong)
//strategy.entry("short",strategy.short,100,when=Entershort)
//strategy.close("short",when=Exitshort)

Mehr