Strategie für den quantitativen Handel mit dreigliedrigem gleitendem Durchschnitt

Schriftsteller:ChaoZhang, Datum: 2024-01-23 14:20:50
Tags:

img

Diese Strategie erzeugt Handelssignale durch Berechnung von drei gleitenden Durchschnitten verschiedener Zeiträume und Kombination von Preisdurchbrüchen. Sie gehört zu einer typischen Trendfolgestrategie. Die Strategie zielt darauf ab, mittelfristigen Markttrends zu folgen und kann durch dynamische Anpassung von Parametern an verschiedene Produkte und Handelsumgebungen angepasst werden.

Grundsätze

Die Strategie umfasst drei gleitende Durchschnitte: MA1, MA2 und MA3. MA1 und MA2 bilden einen Handelskanal, und ihr Crossover erzeugt Handelssignale; MA3 wird zum Filtern von Signalen verwendet.

Wenn der schnelle gleitende Durchschnitt MA1 den mittelfristigen gleitenden Durchschnitt MA2 überschreitet, zeigt dies die Stärkung des kurzfristigen Trends an. Wenn der Preis zu diesem Zeitpunkt über dem langfristigen gleitenden Durchschnitt MA3 liegt, wird ein langes Signal erzeugt; umgekehrt, wenn der MA1 unter den MA2 überschreitet und der Preis unter dem MA3 liegt, wird ein kurzes Signal erzeugt.

Die Rolle von MA3 besteht darin, kurzfristiges Marktlärm auszufiltern und erst nach Feststellung, dass der Trend in die mittelfristige und langfristige Phase eingetreten ist, Signale zu erzeugen.

Vorteile

  • Erfassen von Trends verschiedener Zyklen durch mehrere gleitende Durchschnitte
  • MA3 filtert Signale, um Whipsaws zu vermeiden
  • Anpassungsfähige gleitende Durchschnittsarten und -parameter, hohe Anpassungsfähigkeit
  • Visualisieren Sie Kreuzungen, um Signalpunkte zu identifizieren

Risiken

  • Bewegliche Durchschnittswerte können bei einer Umkehrung der wichtigsten Trends zurückbleiben
  • Potenziell hohe Handelsfrequenz, steigende Handelskosten und Risiken für Ausrutscher
  • Falsche Parameter können zu Über- oder Nachlasssignalen führen

Kann MA-Perioden für verschiedene Produkte optimieren; Stop-Loss optimieren, um einzelne Verluste zu kontrollieren; andere technische Indikatoren kombinieren, um die Signalgültigkeit zu bestätigen und falsche Signale zu reduzieren.

Optimierungsrichtlinien

  • Hinzufügen anderer Indikatoren zur Bestimmung von Trends, z. B. MACD, Bollinger Bands usw.
  • Hinzufügen von Stop-Loss-/Take-Profit-Strategien
  • Dynamische Anpassung der Parameter, um optimale Kombinationen zu finden
  • Parameteroptimierung für verschiedene Produkte
  • Berücksichtigen Sie die Handelskosten, optimieren Sie die Handelsfrequenz

Zusammenfassung

Diese Strategie erzeugt Handelssignale durch Berechnung von drei gleitenden Durchschnitten und Beobachtung ihrer Kreuzungen. Mit der Idee, schnelle, mittlere und langsame Linien zu kombinieren, um Trends zu bestimmen, ist es eine typische Trend-Folgende Strategie. Die Strategie kann durch Parameteroptimierung an verschiedene Produkte angepasst werden, riskiert jedoch Whipsaws und fehlende Wendungen. Zukünftige Verbesserungen könnten andere technische Indikatoren einführen, um die Signalgültigkeit zu beurteilen, dynamische Parameteroptimierungsmechanismen zu entwickeln usw., um die Strategie flexibler zu machen.


/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-22 00:00:00
period: 1d
basePeriod: 1h
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/
// © Meesemoo

//@version=4
strategy("Custom MA Strategy Tester", overlay = true)
MA1Period = input(13, title="MA1 Period")
MA1Type = input(title="MA1 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA1Source = input(title="MA1 Source", type=input.source, defval=close)
MA1Visible = input(title="MA1 Visible", type=input.bool, defval=true)
MA2Period = input(50, title="MA2 Period")
MA2Type = input(title="MA2 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA2Source = input(title="MA2 Source", type=input.source, defval=close)
MA2Visible = input(title="MA2 Visible", type=input.bool, defval=true) 
MA3Period = input(200, title="MA3 Period")
MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA3Source = input(title="MA3 Source", type=input.source, defval=close)
MA3Visible = input(title="MA3 Visible", type=input.bool, defval=true)
ShowCrosses = input(title="Show Crosses", type=input.bool, defval=true)

MA1 = if MA1Type == "SMA"
    sma(MA1Source, MA1Period)
else
    if MA1Type == "EMA"
        ema(MA1Source, MA1Period)
    else
        if MA1Type == "WMA"
            wma(MA1Source, MA1Period)
        else
            if MA1Type == "RMA"
                rma(MA1Source, MA1Period)
            else
                if MA1Type == "HMA"
                    wma(2*wma(MA1Source, MA1Period/2)-wma(MA1Source, MA1Period), round(sqrt(MA1Period)))
                else
                    if MA1Type == "DEMA"
                        e = ema(MA1Source, MA1Period)
                        2 * e - ema(e, MA1Period)
                    else
                        if MA1Type == "TEMA"
                            e = ema(MA1Source, MA1Period)
                            3 * (e - ema(e, MA1Period)) + ema(ema(e, MA1Period), MA1Period)

                    
MA2 = if MA2Type == "SMA"
    sma(MA2Source, MA2Period)
else
    if MA2Type == "EMA"
        ema(MA2Source, MA2Period)
    else
        if MA2Type == "WMA"
            wma(MA2Source, MA2Period)
        else
            if MA2Type == "RMA"
                rma(MA2Source, MA2Period)
            else
                if MA2Type == "HMA"
                    wma(2*wma(MA2Source, MA2Period/2)-wma(MA2Source, MA2Period), round(sqrt(MA2Period)))
                else
                    if MA2Type == "DEMA"
                        e = ema(MA2Source, MA2Period)
                        2 * e - ema(e, MA2Period)
                    else
                        if MA2Type == "TEMA"
                            e = ema(MA2Source, MA2Period)
                            3 * (e - ema(e, MA2Period)) + ema(ema(e, MA2Period), MA2Period)
                    
MA3 = if MA3Type == "SMA"
    sma(MA3Source, MA3Period)
else
    if MA3Type == "EMA"
        ema(MA3Source, MA3Period)
    else
        if MA3Type == "WMA"
            wma(MA3Source, MA3Period)
        else
            if MA3Type == "RMA"
                rma(MA3Source, MA3Period)
            else
                if MA3Type == "HMA"
                    wma(2*wma(MA3Source, MA3Period/2)-wma(MA3Source, MA3Period), round(sqrt(MA3Period)))
                else
                    if MA3Type == "DEMA"
                        e = ema(MA3Source, MA3Period)
                        2 * e - ema(e, MA3Period)
                    else
                        if MA3Type == "TEMA"
                            e = ema(MA3Source, MA3Period)
                            3 * (e - ema(e, MA3Period)) + ema(ema(e, MA3Period), MA3Period)
                    


p1 = plot(MA1Visible ? MA1 : na, color=color.green, linewidth=1)
p2 = plot(MA2Visible ? MA2 : na, color=color.yellow, linewidth=1)
p3 = plot(MA3Visible ? MA3 : na, color=color.red, linewidth=2)

fill(p1, p2, color.silver, transp=80, title="Fill")


start = timestamp(2019, 1, 1, 1, 0)
end = timestamp(2025, 1, 1, 1, 0)

if time >= start and time <= end
    longCondition = crossover(MA1, MA2) and close > MA3
    if (longCondition)
        strategy.entry("Long", strategy.long)
        
    shortCondition = crossunder(MA1, MA2) and close < MA3
    if (shortCondition)
        strategy.entry("Short", strategy.short)

Mehr