Drei gleitende Durchschnitte – quantitative Handelsstrategie


Erstellungsdatum: 2024-01-23 14:20:50 zuletzt geändert: 2024-01-23 14:20:50
Kopie: 0 Klicks: 624
1
konzentrieren Sie sich auf
1617
Anhänger

Drei gleitende Durchschnitte – quantitative Handelsstrategie

Diese Strategie ist eine typische Trend-Tracking-Strategie, die durch die Berechnung von Moving Averages für drei verschiedene Perioden und in Verbindung mit einem Preisbruch ein Handelssignal erzeugt. Die Strategie zielt darauf ab, die mittelfristigen Trends des Marktes zu verfolgen und kann durch dynamische Anpassung der Parameter für verschiedene Sorten und Handelsumgebungen verwendet werden.

Grundsätze

Die Strategie besteht aus drei Moving Averages: MA1, MA2 und MA3 zwischen MA1 und MA2 entsteht ein Handelskanal, dessen Kreuzung ein Handelssignal erzeugt; MA3 dient zum Filtern von Signalen .

Wenn ein schneller Durchschnittswert MA1 über dem mittelfristigen Durchschnittswert MA2 durchbricht, zeigt dies eine Stärkung des kurzfristigen Trends an, wobei ein Mehr-Signal erzeugt wird, wenn der Preis höher als der langfristige Durchschnitt MA3 ist. Im Gegensatz dazu erzeugt ein Fehlsignal, wenn ein MA1 unter dem MA2 durchbricht und der Preis unter dem MA3 ist.

Die MA3 filtert kurzfristigen Marktrauschen aus und gibt nur dann ein Signal, wenn ein Trend in die mittlere oder lange Phase eingeschaltet ist. Die Strategie passt die Parameter der drei Moving Averages dynamisch an, um die optimale Kombination von Parametern in verschiedenen Märkten zu finden.

Vorteile

  • Verschiedene zyklische Trends durch mehrere Gruppen von Moving Averages
  • MA3 filtert Signale und vermeidet Arbitrage
  • Anpassungsfähige Mittelwerttypen und -parameter
  • Sichtbarer Kreuzgang zur Identifizierung von Signalpunkten

Die Gefahr

  • Bewegliche Durchschnittswerte liegen hinter der Kreuzung der großen zyklischen Trendwende zurück
  • Es könnte zu hohe Handelsfrequenz geben, was zu höheren Transaktionskosten und einem Risiko für Ausrutscher führt.
  • Fehlgeleitete Parameter können zu übermäßigen Transaktionen oder Signalvorgaben führen

Durch die Anpassung der MA-Zyklen kann die Auswahl der verschiedenen Sorten optimiert werden. Die Stop-Loss-Strategie kann optimiert werden, um den Einzelschaden zu kontrollieren. Die Signalwirksamkeit kann in Kombination mit anderen technischen Indikatoren bestätigt werden, um die Wahrscheinlichkeit eines Fehlsignals zu verringern.

Optimierungsrichtung

  • Hinzufügen von anderen Indikatoren, um Trends zu beurteilen, wie MACD, Brin-Band usw.
  • Erhöhung der Stop-Loss-Strategie
  • Dynamische Anpassung von Parametern zur Suche nach der optimalen Parameterkombination
  • Optimierung der Parameter für verschiedene Sorten
  • Berücksichtigung der Transaktionskosten und Optimierung der Frequenz

Zusammenfassen

Diese Strategie ist eine typische Trend-Tracking-Strategie, die durch die Berechnung von drei Moving Averages und die Beobachtung der Kreuzung von Handelssignalen erzeugt wird. Die Strategie kann durch Parameteroptimierung für verschiedene Sorten verwendet werden, aber es besteht die Gefahr, dass sie ausgesetzt ist und den Wendepunkt verpasst wird. In Zukunft kann die Strategie durch die Einführung anderer technischer Kennzahlen optimiert werden, um die Signalwirksamkeit zu beurteilen und eine Dynamikparameteroptimierungsmechanik zu entwickeln.

Strategiequellcode
/*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)