Schnelle langsam bewegliche doppelte durchschnittliche Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-10-27 16.41:24
Tags:

img

Übersicht

Die doppelte gleitende Durchschnittsstrategie erzeugt Handelssignale, indem sie schnelle und langsame gleitende Durchschnitte berechnet und auf Kreuzungen achtet. Wenn der schnelle gleitende Durchschnitt über den langsamen gleitenden Durchschnitt überschreitet, wird eine Long-Position eingenommen. Wenn der schnelle gleitende Durchschnitt unter den langsamen gleitenden Durchschnitt überschreitet, wird eine Short-Position eingenommen.

Strategie Logik

Die Strategie legt zunächst die Längen des schnellen gleitenden Durchschnitts maFastLength und des langsam gleitenden Durchschnitts maSlowLength fest. Anschließend berechnet sie den schnellen gleitenden Durchschnitt fastMA und den langsam gleitenden durchschnitt slowMA. Der schnellen gleitenden Durchschnitt reagiert schneller auf Preisänderungen und wird verwendet, um den aktuellen Trend zu beurteilen, während der langsame gleitende Durchschnitt langsamer reagiert und zur Bestimmung der Trendrichtung verwendet wird.

Wenn der schnelle gleitende Durchschnitt über den langsamen gleitenden Durchschnitt geht, wird ein langes Eingangssignal generiert.

Die Strategie kann nur auf Long, nur auf Short eingestellt werden oder sowohl lange als auch kurze Trades ermöglichen.

Im Modus "Long Only" werden Long-Positionen mit dem Signal "goLong(") eingegeben und mit dem Signal "killLong(") beendet.

Im Short-Only-Modus werden Short-Positionen mit dem KillLong-Signal eingegeben und mit dem GoLong-Signal beendet.

Im Swapping-Modus werden Long-Positionen auf goLong ((() eingegeben, geschlossen und auf killLong ((() auf Short umgewandelt.

Die Strategie umfasst auch Stop-Loss, Trailing-Stop, Messaging und andere optionale Funktionen.

Vorteile

  1. Einfach und einfach umzusetzen.

  2. Flexibilität, um lang, kurz oder beides zu gehen.

  3. Optionale Stop-Loss- und Trailing-Stop-Funktionen.

  4. Anpassbare Nachrichten, um Trades zu alarmieren.

  5. Empfindlich für Marktentwicklungen.

  6. Anpassungsfähige Parameter passen sich den unterschiedlichen Märkten an.

Risiken

  1. Kann zu übermäßigen Geschäften in unruhigen oder schwankenden Märkten führen.

  2. Sie reagieren langsam auf plötzliche Nachrichten.

  3. Die Parameterwahl beeinflusst die Strategieleistung.

  4. Man muss sich streng an die Signale halten und Diskretionshandel vermeiden.

  5. Die Handelskosten können, wenn sie nicht berücksichtigt werden, den Gewinn beeinträchtigen.

Verbesserungen

  1. Fügen Sie Filter wie RSI hinzu, um falsche Signale zu vermeiden.

  2. Implementieren Sie die Optimierung der Parameter, um die besten Einstellungen zu finden.

  3. Verwenden Sie dynamische Stopps, um Gewinne zu erzielen und anzupassen.

  4. Einbeziehung von maschinellem Lernen zur Trendvorhersage.

  5. Optimieren Sie die Messaging für individuelle Handelsgewohnheiten.

Schlussfolgerung

Die doppelte gleitende Durchschnittsstrategie ist relativ einfach und nützlich, um starke Trends zu erfassen. Allerdings sollte darauf geachtet werden, Whipsaws in Niedrigtrendumgebungen zu vermeiden. Feinsteuerungsparameter und das Hinzufügen von Hilfsindikatoren oder Verbesserungen können die Robustheit und Anpassungsfähigkeit weiter verbessern.


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

//@version=4

strategy("SMA Strategy", shorttitle="SMA Strategy", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === Inputs ===
// short ma
maFastSource = input(defval=close, title="Fast MA Source")
maFastLength = input(defval=3, title="Fast MA Period", minval=1)

// long ma
maSlowSource = input(defval=close, title="Slow MA Source")
maSlowLength = input(defval=9, title="Slow MA Period", minval=1)

// Trade direction
shorting = input(defval=false, title="Short only?")
longonly = input(defval=true, title="Long only?")
swapping = input(defval=false, title="Swap orders?")
// risk management
useStop = input(defval=false, title="Use Initial Stop Loss?")
slPoints = input(defval=25, title="Initial Stop Loss Points", minval=1)
useTS = input(defval=false, title="Use Trailing Stop?")
tslPoints = input(defval=120, title="Trail Points", minval=1)
useTSO = input(defval=false, title="Use Offset For Trailing Stop?")
tslOffset = input(defval=20, title="Trail Offset Points", minval=1)

// Messages for buy and sell
message_long_entry  = input("Long entry message", title="Long entry message")
message_long_exit   = input("Long exit message", title="Long exit message")
message_short_entry = input("Short entry message", title="Short entry message")
message_short_exit  = input("Short exit message", title="Short exit message")

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-01T00:00:00"), type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time)
 
time_cond  = true
// === Vars and Series ===
fastMA = sma(maFastSource, maFastLength)
slowMA = sma(maSlowSource, maSlowLength)

plot(fastMA, color=color.blue)
plot(slowMA, color=color.purple)

goLong() =>
    crossover(fastMA, slowMA)
killLong() =>
    crossunder(fastMA, slowMA)
    
// Long only
if longonly
    strategy.entry("Buy", strategy.long, when=goLong() and time_cond, alert_message = message_long_entry)
    strategy.close("Buy", when=killLong() and time_cond, alert_message = message_long_exit)

// Short only
if shorting
    strategy.entry("Sell", strategy.short, when=killLong() and time_cond, alert_message = message_short_entry)
    strategy.close("Sell", when=goLong() and time_cond, alert_message = message_short_exit)
    
// Order Swapping
if swapping
    strategy.entry("Buy", strategy.long, when=goLong() and time_cond, alert_message = message_long_entry)
    strategy.entry("Sell", strategy.short, when=killLong() and time_cond, alert_message = message_short_entry)

if useStop
    strategy.exit("XLS", from_entry="Buy", stop=strategy.position_avg_price / 1.08, alert_message = message_long_exit)
    strategy.exit("XSS", from_entry="Sell", stop=strategy.position_avg_price * 1.08, alert_message = message_short_exit)



Mehr