
Die Moving-Average-Cross-Strategie ist eine sehr klassische und häufig verwendete Technische Analyse-Strategie. Die Kernidee dieser Strategie ist es, die Kreuzung zwischen Moving-Averages aus verschiedenen Perioden als Kauf- und Verkaufssignal zu nutzen. Es erzeugt ein Kaufsignal, wenn ein kurzfristiger Moving-Average den längerfristigen Moving-Average von unten durchbricht; es erzeugt ein Verkaufsignal, wenn ein kurzfristiger Moving-Average den längerfristigen Moving-Average von oben durchbricht.
Die Strategie setzt die Art der eingegebenen Moving Averages (SMA, EMA, WMA, RMA) und die Länge der Perioden sowie die Zeitspanne für die Rückmessung ein.
Die Berechnung von verschiedenen Arten von Moving Averages in Variantfunktionen. Der berechnete Moving Average wird durch die Variable ma gespeichert.
Wenn der Schlusskurs Ma überschreitet, erzeugt er ein Kaufsignal; wenn der Schlusskurs Ma unterschreitet, erzeugt er ein Verkaufssignal.
Um einen Stop-Loss zu setzen, berechnet man die durchschnittliche reale Schwankungsbreite über 14 Zyklen mit Hilfe vonatr. Mit dem Durchschnittspunkt als Referenz und dem Auf- oder Abzug von 2 malatr als Stop-Bereich.
Die Ein- und Ausstiegslogik lautet wie folgt:
Eintritt mit mehreren Köpfen: close auf ma und in der Rückmesszeit als Eintrittstopp close Mehrköpfige Ausstieg: Close unter Durchschnittsma minus 2-fache ATR bei Ausstiegsverlust oder maximaler Preis über dem Einstiegspunkt close plus 2-fache ATR bei Ausstiegsverlust Eintritt: close unter Ma und in der Rückmesszeit als Eintritt close Leer ausgehen: Schließen auf Ma plus 2xatr, wenn der Ausgang verloren geht, oder der Mindestpreis niedriger als der Einstiegspunkt ist. Schließen minus 2xatr, wenn der Ausgang gestoppt wird
Die Optimierung von Risiken kann in folgenden Bereichen erfolgen:
Diese Strategie kann in folgenden Bereichen optimiert werden:
Die Moving-Average-Cross-Strategie ist eine sehr typische und häufig verwendete technische Analyse-Strategie. Die Kernidee der Strategie ist einfach, leicht umzusetzen, für verschiedene Märkte geeignet und ist eine der Einstiegsstrategien für den Quantifizierungshandel. Die Strategie hat jedoch auch einige Probleme, z. B. häufige Signale, leichte Stop-Losses usw. Die reale Performance der Strategie kann durch angemessene Optimierung erheblich verbessert werden.
/*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] )