Strategie für die Übertragung von doppelten gleitenden Durchschnitten

Schriftsteller:ChaoZhang, Datum: 23.11.2023
Tags:

img

Übersicht

Die Double Moving Average Crossover Strategie ist eine Trend-folgende Strategie, die das Crossover von zwei gleitenden Durchschnitten unterschiedlicher Perioden als Handelssignale verwendet. Sie tritt in Long- oder Short-Positionen ein, wenn der schnelle MA über oder unter dem langsamen MA überschreitet und die Trendrichtung nach dem Crossover bestimmt. Sie kann mittelfristige Trends erfassen und gleichzeitig unnötige Handelsfrequenz durch übermäßige Schwankungen reduzieren.

Strategie Logik

Die Strategie verwendet zwei gleitende Durchschnitte: einen schnellen MA mit einem kürzeren Zeitraum (z. B. 15 Perioden) zur Erfassung kurzfristiger Kursbewegungen und einen langsamen MA mit einem längeren Zeitraum (z. B. 21 Perioden) zur Identifizierung der Haupttrendrichtung.

Durch die Anpassung der MA-Periodenkombinationen kann die Strategie den Zeitrahmen der Trends anpassen, um Trends zu erfassen.

Die Strategie umfasst auch Risikomanagement-Module wie Take Profit, Stop Loss und Trailing Stop Loss, die dazu beitragen, den maximalen Gewinn/Verlust einzelner Trades zu begrenzen und das Gesamtrisiko zu enthalten.

Vorteile

Die Strategie der doppelten Vermarktungsbeihilfe hat folgende Vorteile:

  1. Einfache Logik und leicht verständliche/umsetzbare Verfahren;
  2. Flexibilität bei der Anpassung an die Marktbedingungen durch Anpassung der MA-Perioden;
  3. Stabilität durch weniger Handelssignale;
  4. Wirksame Risikokontrolle durch Stop-Losses;
  5. Einfachheit der Optimierung von MA, Risikoparametern usw.

Risiken

Es gibt auch einige Risiken, die zu berücksichtigen sind:

  1. Übermäßige Crossovers und Handelshäufigkeit während von Rangebound-Märkten;
  2. Verzögerte MAs können die Preisumkehrpunkte verfehlen und den Verlust nicht rechtzeitig stoppen;
  3. Anfälligkeit für falsche Ausbrüche, die zu unnötigen Verlusten führen;
  4. Allgemeine Ungenauigkeit bei der Preisverfolgung aufgrund von Verzögerungen bei der Bereitstellung von Zinszuschüssen.

Diese Schwächen können durch Optimierungen wie Filtersignale, Trailing Stop Loss usw. gelindert werden.

Möglichkeiten zur Verbesserung

Die Strategie kann in folgenden Aspekten verbessert werden:

  1. Hinzufügen von Filtern für Volumen oder Volatilität, um Whipsaws zu vermeiden;
  2. Erprobung mehrer Zulassungsarten und Feinabstimmungsperioden/Formeln, um sie auf verschiedene Produkte und Zeitrahmen anzupassen;
  3. Überprüfung von MA-Typen wie EMA, LWMA zur schnellsten Preisverfolgung;
  4. Automatisierung des MA-Tuning und der Stop-Loss-Dimension mit maschinellem Lernen;
  5. Alternative Stop-Loss-Techniken, z. B. Gap, Durchschnittspreis, Kronleuchter.

Diese Erhöhungen erwarten eine deutliche Erhöhung der Gewinnquote und risikoadjustierte Renditen.

Schlussfolgerung

Insgesamt bietet die doppelte gleitende Durchschnitts-Crossover-Strategie Einfachheit, Flexibilität und kontrollierbare Risiken.


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

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)

Mehr