Die Dual Moving Average Crossover Trend Strategie ist eine Trendfolgestrategie, die Kauf- und Verkaufssignale erzeugt, wenn sich schnelle und langsame gleitende Durchschnittslinien kreuzen.
Die Strategie verwendet hauptsächlich folgende Indikatoren:
Schnelle und langsame gleitende Durchschnittslinien: Goldenes Kreuz für Kaufsignal, Todeskreuz für Verkaufssignal.
MACD: MACD-Linie oberhalb der Signallinie und steigender MACD-Tiefpunkt für bullisches Signal.
RSI: RSI über 50 für bullish, unter 50 für bearish.
Awesome Oscillator (AO): AO überschreitet die 0-Linie für Kauf und unterschreitet sie für Verkauf.
Drei tägliche gleitende Durchschnitte: Kurzerfristige tägliche MA überschreitet längerfristige tägliche MA als Kaufsignal.
Die Strategie kombiniert mehrere Zeitrahmen und Indikatoren, um eine Kauf- und Verkaufslogik zu erzeugen. Sie erzeugt Kaufbestellungen, wenn mehrere Indikatoren gleichzeitig bullische Signale zeigen, und Verkaufsbestellungen, wenn bärische Signale auftauchen, um den Trend zu verfolgen.
Die Strategie weist folgende Vorteile auf:
Eine Kombination aus mehreren Indikatoren reduziert die falschen Signale und verbessert die Genauigkeit.
Durch die Einbeziehung mehrerer Zeitrahmen wird eine größere Trendrichtung ermittelt.
Parameter-Tuning sorgt für eine gute Rentabilität.
Einbeziehung von Stopp-Loss, um Risiken zu kontrollieren und Verluste zu begrenzen.
Automatisierte Trendverfolgung ohne manuelles Eingreifen, Kostensenkung.
Es hat auch einige Risiken:
Optimieren Sie die Parameter, um ungültige Signale zu reduzieren.
Black Swan-Ereignisse könnten einen starken Rückzug verursachen.
Eine komplexe Kauf-/Verkaufslogik setzt auf große historische Daten, um optimale Parameter zu finden.
Eine unangemessene Stop-Loss-Einstellung führt zu einem vorzeitigen Ausstieg.
Die Strategie kann in folgenden Aspekten verbessert werden:
Testen Sie mehr Indikatorkombinationen für stabilere und genauere Signale wie Volatilitätsindex, OBV usw.
Optimierung der Indikatorparameter durch maschinelles Lernen und genetische Algorithmen zur Verringerung des Überhandels.
Einführung von Modellensemble-Techniken zur Integration von Signalen aus mehreren unabhängigen Strategiemodellen, um die Robustheit zu verbessern.
Eintritt in den Handel in einem höheren Zeitrahmen, Ausstieg in einem niedrigeren Zeitrahmen.
Ein quantitatives Risikokontrollmodul mit strengen Grenzen für den Stop-Loss-Prozentsatz, den maximalen Drawdown usw. pro Handel erstellen.
Die Dual Moving Average Crossover Trend-Strategie verwendet schnelle und langsame MA-Kreuzungen als Handelssignale, zusammen mit MACD, RSI, um die Trendrichtung für die automatisierte Trendverfolgung zu beurteilen.
/*backtest start: 2023-10-22 00:00:00 end: 2023-11-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('SteffVans', shorttitle='SteffVans strategy', overlay=true, process_orders_on_close = true) // Input settings macd_fast_length = input(12) macd_slow_length = input(26) macd_signal_length = input(9) // Calculate MACD values [macd_line, signal_line, _] = ta.macd(close, macd_fast_length, macd_slow_length, macd_signal_length) mg = ta.lowest(signal_line, 30) >= -0 // RSI ma(source, length, type) => switch type "SMA" => ta.sma(source, length) "Bollinger Bands" => ta.sma(source, length) "EMA" => ta.ema(source, length) "SMMA (RMA)" => ta.rma(source, length) "WMA" => ta.wma(source, length) "VWMA" => ta.vwma(source, length) rsiLengthInput = input.int(14, minval=1) rsiSourceInput = input.source(close, "Source", group="RSI Settings") maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings") maLengthInput = input.int(14, title="MA Length", group="MA Settings") bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings") up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput) down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput) RSI = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) // AO AO = ta.sma((high + low) / 2, 5) - ta.sma((high + low) / 2, 34) crossaosell = AO < AO[1] and AO[1] < AO[2] and AO[2] > AO[3] and ta.lowest(low,3) // Uptrend sma len1 = input.int(5, minval=1) len2 = input.int(10, minval=1) len3 = input.int(20, minval=1) src = input(close) out1 = ta.sma(src, len1) out2 = ta.sma(src, len2) out3 = ta.sma(src, len3) // Timeframe macdl60 = request.security(syminfo.tickerid, "60", signal_line,lookahead = barmerge.lookahead_on) ao = request.security(syminfo.tickerid, "60", AO,lookahead = barmerge.lookahead_on) rsi = request.security(syminfo.tickerid, "60", RSI,lookahead = barmerge.lookahead_on) good = request.security(syminfo.tickerid, "60", mg,lookahead = barmerge.lookahead_on) bad = request.security(syminfo.tickerid, "60", crossaosell,lookahead = barmerge.lookahead_on) ma1 = request.security(syminfo.tickerid, "D", out1,lookahead = barmerge.lookahead_on) ma2 = request.security(syminfo.tickerid, "D", out2, lookahead = barmerge.lookahead_on) ma3 = request.security(syminfo.tickerid, "D", out3, lookahead = barmerge.lookahead_on) // Kriteria BUY and SELL uptrend1 = request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) > ma1 and ma1 > ma3 and ma2 > ma3 uptrend2 = ta.lowest(ma1,12) > ta.lowest(ma3,12) and ta.lowest(ma2,12) > ta.lowest(ma3,12) // Triger BUY and SELL cross1 = ao > ao[1] and ao[1] < ao[2] and ao > 0 and good and rsi >= 60 and uptrend1 cross2 = ao > 0 and ao[1] < 0 and good and rsi >=50 and uptrend1 cross3 = ao > 0 and ao[1] < 0 and not good and uptrend2 and uptrend1 cross4 = ao > ao[1] and ao[1] > ao[2] and ao[2] < ao[3] and ao[3] < ao[4] and not good and uptrend2 and uptrend1 s1 = ao < ao[1] and ao[1] < ao[2] and ao[2] < ao[3] and ao > 0 and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1 s2 = ao < 0 and ao < ao[2] and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1 // Variabel Buy dan Sell buySignal = false sellSignal = false // Syarat masuk Buy buyCondition = cross1 or cross2 or cross3 or cross4 if buyCondition buySignal := true // Syarat masuk Sell sellCondition = s1 or s2 if sellCondition sellSignal := true // Reset sinyal jika ada sinyal berulang if buySignal and sellSignal sellSignal := false if sellSignal and buySignal buySignal := false // Logika perdagangan if buySignal strategy.entry("Buy", strategy.long, comment = "BUY") if sellSignal strategy.close("Buy") plotshape(cross1,title = "Stefkuy1", style = shape.labelup, location = location.belowbar, color = color.green,text = "1", textcolor = color.white,size = size.small) plotshape(cross2,title = "Stefkuy2", style = shape.labelup, location = location.belowbar, color = color.green, text = "2", textcolor= color.white, size = size.small) plotshape(cross3,title = "StefVan1", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "3", textcolor= color.white,size = size.small) plotshape(cross4,title = "StefVan2", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "4", textcolor= color.white,size = size.small)