Handelsstrategie für das gleitende Durchschnittssystem

Schriftsteller:ChaoZhang, Datum: 2024-01-05 15:36:00 Uhr
Tags:

img

Übersicht

Dieser Artikel behandelt eine Handelsstrategie, die auf einem einfachen gleitenden Durchschnitt basiert. Die Strategie vergleicht den Schlusskurs mit einem 17-Perioden-gleitenden Durchschnitt, der lang geht, wenn der Schlusskurs über den gleitenden Durchschnitt überschreitet, und kurz geht, wenn er darunter überschreitet.

Strategie Logik

Berechnung des gleitenden Durchschnitts

Bei der Berechnung des gleitenden Durchschnitts werden in der Strategie folgende Parameter verwendet:

  • MA-Quelle: Ausfall bis zum Durchschnitt von OHLC (OHLC4)
  • Der Wert der Vermögenswerte, die für die Berechnung der Vermögenswerte verwendet werden.
  • MA-Länge: Standardeinstellung auf 17

Auf der Grundlage dieser Parameter wird die Funktion getMAType (() aufgerufen, um den 17-Perioden-SMA der Schlusskurs zu berechnen.

Erzeugung von Handelssignalen

Vergleichen Sie dann den Zusammenhang zwischen dem Schlusskurs und dem gleitenden Durchschnitt:

  • Schließen > Gleitender Durchschnitt: Langes Signal
  • Schließung < gleitender Durchschnitt: Kurzsignal

Wenn der Schlusskurs den gleitenden Durchschnitt von unten überschreitet, wird ein langes Signal erzeugt.

Handelsausführung

Während des Backtest-Zeitraums eröffnen Sie lange Positionen, wenn lange Signale auftreten, und kurze Positionen, wenn kurze Signale auftreten.

Analyse der Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass die Logik sehr einfach und klar ist. Mit nur einem Indikator beurteilt sie die Trendumkehr basierend auf der Richtungsänderung des Indikators. Die Strategie ist leicht zu verstehen und umzusetzen, geeignet für Anfänger.

Darüber hinaus gehören gleitende Durchschnitte zu den Trendindikatoren, die Trendänderungen effektiv verfolgen und Störungen durch kurzfristige Marktlärm vermeiden können.

Durch die Anpassung der Parameter kann es sich an verschiedene Zyklen und verschiedene Produkte anpassen.

Risikoanalyse

Erstens beruht diese Strategie nur auf einem Indikator, so dass die Beurteilungskriterien relativ einheitlich sind, was zu mehr falschen Signalen führen kann.

Außerdem funktioniert es als Trendfolgersystem nicht gut auf den Märkten mit Bandbreite und seitlich.

Außerdem besteht ohne Stop-Loss oder Take-Profit das Risiko, dass sich die Verluste vergrößern.

Die Lösungen bestehen darin, andere Indikatoren einzubeziehen, Parameterkombinationen zu optimieren, um falsche Signale zu reduzieren, Stop Loss und Take Profit hinzuzufügen, um Risiken zu kontrollieren und Drawdowns zu optimieren.

Optimierungsrichtlinien

Hier sind einige Ideen zur Optimierung der Strategie:

  1. Anpassung der gleitenden Durchschnittsparameter, Optimierung der Periodenzahlen, z. B. Änderung auf 30- oder 50-Perioden.

  2. Versuchen Sie verschiedene Arten von gleitenden Durchschnitten, wie EMA, VIDYA usw. Sie haben unterschiedliche Empfindlichkeit gegenüber Preisänderungen.

  3. Hinzufügen anderer Indikatoren in Kombination, z. B. MACD, um die Stärke zu beurteilen; RSI, um falsche Signale zu reduzieren.

  4. Einheitliche Handelsverlustmenge zu kontrollieren, indem Sie einen festen Prozentsatz oder einen ATR-basierten Stop-Loss festlegen.

  5. Fügen Sie Gewinnmechanismen hinzu und setzen Sie einen gewinnorientierten Prozentsatz fest, um den Gewinn zu maximieren.

Diese Optimierungen können die Strategieleistung stabiler machen und übermäßige Abzüge vermeiden.

Zusammenfassung

Dieser Artikel analysiert eine einfache Handelsstrategie, die auf einem gleitenden Durchschnitt von 17 Perioden basiert. Die Strategie hat einfache Signalquellen, die leicht zu verstehen und umzusetzen sind und zu einem typischen Trendfolgensystem gehören. Durch eine tiefgreifende Interpretation der Strategie werden ihre Vor- und Nachteile analysiert und mehrere Dimensionen von Optimierungsideen vorgeschlagen. Es wird angenommen, dass sich diese Strategie durch kontinuierliche Optimierung und Anreicherung allmählich entwickeln und auch im Live-Handel stabile Renditen erzielen kann.


/*backtest
start: 2023-12-05 00:00:00
end: 2024-01-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Simple 17 BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2012, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Moving Average /////////////
source = input(title="MA Source", defval=ohlc4)
maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"])
length = input(title="MA Length", defval=17)

///////////// Get MA Function /////////////
getMAType(maType, sourceType, maLen) => 
    res = sma(close, 1)
    
    if maType == "ema"
        res := ema(sourceType, maLen)
    if maType == "sma"
        res := sma(sourceType, maLen)
    if maType == "swma"
        res := swma(sourceType)
    if maType == "wma"
        res := wma(sourceType, maLen)
    if maType == "vwma"
        res := vwma(sourceType, maLen)
    if maType == "rma"
        res := rma(sourceType, maLen)
    res
    
MA = getMAType(maType, source, length)

/////////////// Strategy ///////////////
long = close > MA
short = close < MA

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("L", strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)

/////////////// Plotting /////////////// 
p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2)
p2 = plot(close, linewidth=2)
fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)

Mehr