Die gleitende Durchschnitts-Crossover-Strategie ist eine sehr klassische und häufig verwendete technische Analyse-Strategie. Die Kernidee dieser Strategie besteht darin, den Crossover zwischen gleitenden Durchschnitten verschiedener Zeiträume als Handelssignale zu verwenden. Wenn der kurzfristige gleitende Durchschnitt über den langfristigen gleitenden Durchschnitt von unten kreuzt, wird ein Kaufsignal generiert. Wenn der kurzfristige gleitende Durchschnitt unter den langfristigen gleitenden Durchschnitt von oben kreuzt, wird ein Verkaufssignal generiert.
Diese Strategie verwendet Eingaben, um den Typ (SMA, EMA, WMA, RMA) und die Periode des gleitenden Durchschnitts sowie den Zeitrahmen für das Backtesting festzulegen.
In der Variantenfunktion werden verschiedene Arten von gleitenden Durchschnitten berechnet. Der berechnete gleitende Durchschnitt wird in der Variable ma gespeichert.
Wenn der Schlusskurs über ma liegt, wird ein Kaufsignal generiert.
Um einen Stop-Loss festzulegen, wird der 14-Perioden-Durchschnitt der wahren Bandbreite atr berechnet.
Die spezifische Ein- und Ausstiegslogik ist wie folgt:
Langer Einstieg: Nähere Kreuzungen über ma und innerhalb des Backtest-Zeitrahmens, Stop-Loss-Punkt ist Eintrittspunkt nahe
Long Exit: Schließen unter ma minus 2 mal atr für Stop Loss Exit oder höchster Preis übersteigt den Eintrittspunkt Schließen plus 2 mal atr für Take Profit Exit
Kurzer Einstieg: Schließung unter ma und innerhalb des Backtest-Zeitrahmens, Stop-Loss-Punkt ist Eintrittspunkt nahe
Kurzer Ausstieg: Schließung von Kreuzungen über ma plus 2 mal atr für den Stop-Loss-Ausgang oder niedrigster Preis unter dem Eintrittspunkt schließen minus 2 mal atr für den Take-Profit-Ausgang
Um den Risiken entgegenzuwirken, können Optimierungen in den folgenden Bereichen vorgenommen werden:
Diese Strategie kann in folgenden Aspekten optimiert werden:
Die gleitende Durchschnitts-Crossover-Strategie ist eine sehr typische und häufig verwendete technische Analyse-Strategie. Die Kernidee der Strategie ist einfach und einfach zu implementieren, geeignet für verschiedene Märkte und ist eine der Einstiegs-Quant-Handelsstrategien. Die Strategie hat jedoch auch einige Probleme wie die Erzeugung häufiger Signale und die Anfälligkeit für Stop-Loss. Mit angemessenen Optimierungen kann die Leistung erheblich verbessert werden. Insgesamt bietet die gleitende Durchschnitts-Crossover-Strategie einen sehr guten Rahmen für die Strategieentwicklung und ist der Eckpfeiler des quantitativen Handelsstrategienlernens.
/*backtest start: 2023-10-03 00:00:00 end: 2023-11-02 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MA Cross Strategy", overlay=true,commission_value = 0.1) type = input(defval = "WMA", title = "MA Type: ", options=["RMA", "SMA", "EMA", "WMA"]) length = input(28) source = close // === INPUT BACKTEST RANGE === FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromYear = input(defval = 2000, title = "From Year", minval = 2000) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(9999, 1, 1, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" variant(type, src, len) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v5 = wma(src, len) // Weighted v7 = rma(src, len) // Smoothed type=="EMA"?v2 : type=="WMA"?v5 : type=="RMA"?v7 : v1 ma = variant(type,source, length) atr = security(syminfo.tickerid, "D", atr(14)) range = valuewhen(cross(close,ma), (atr*2), na) ep = valuewhen(cross(close,ma), close, na) plot(ma,color=ma>ma[1]?color.blue:color.red,transp=0,linewidth=1) plot(ep,color=#2196f3,transp=100,trackprice=true, offset=-9999) plot(ep+range,color=#2196f3,transp=100,trackprice=true, offset=-9999) plot(ep-range,color=#2196f3,transp=100,trackprice=true, offset=-9999) strategy.entry("Long Entry", true, when = crossover(close,ma) and window() , stop = ep ) strategy.exit("Long Exit", "Long Entry", stop = ep-range) strategy.exit("Long Exit", "Long Entry", when = high > ep+range ,stop = ep[1] ) strategy.entry("Short Entry", false, when = crossunder(close,ma) and window() , stop = ep ) strategy.exit("Short Exit", "Short Entry", stop = ep+range) strategy.exit("Short Exit", "Short Entry", when = low < ep-range ,stop = ep[1] )