Strategie für eine doppelte Kreuzung von gleitenden Durchschnitten

Schriftsteller:ChaoZhang, Datum: 2023-11-22 17:29:04
Tags:

img

Übersicht

Die Dual Moving Average Crossover Trend Strategie ist eine Trendfolgestrategie, die Kauf- und Verkaufssignale erzeugt, wenn sich schnelle und langsame gleitende Durchschnittslinien kreuzen.

Strategie Logik

Die Strategie verwendet hauptsächlich folgende Indikatoren:

  1. Schnelle und langsame gleitende Durchschnittslinien: Goldenes Kreuz für Kaufsignal, Todeskreuz für Verkaufssignal.

  2. MACD: MACD-Linie oberhalb der Signallinie und steigender MACD-Tiefpunkt für bullisches Signal.

  3. RSI: RSI über 50 für bullish, unter 50 für bearish.

  4. Awesome Oscillator (AO): AO überschreitet die 0-Linie für Kauf und unterschreitet sie für Verkauf.

  5. 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.

Analyse der Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Eine Kombination aus mehreren Indikatoren reduziert die falschen Signale und verbessert die Genauigkeit.

  2. Durch die Einbeziehung mehrerer Zeitrahmen wird eine größere Trendrichtung ermittelt.

  3. Parameter-Tuning sorgt für eine gute Rentabilität.

  4. Einbeziehung von Stopp-Loss, um Risiken zu kontrollieren und Verluste zu begrenzen.

  5. Automatisierte Trendverfolgung ohne manuelles Eingreifen, Kostensenkung.

Risikoanalyse

Es hat auch einige Risiken:

  1. Optimieren Sie die Parameter, um ungültige Signale zu reduzieren.

  2. Black Swan-Ereignisse könnten einen starken Rückzug verursachen.

  3. Eine komplexe Kauf-/Verkaufslogik setzt auf große historische Daten, um optimale Parameter zu finden.

  4. Eine unangemessene Stop-Loss-Einstellung führt zu einem vorzeitigen Ausstieg.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten verbessert werden:

  1. Testen Sie mehr Indikatorkombinationen für stabilere und genauere Signale wie Volatilitätsindex, OBV usw.

  2. Optimierung der Indikatorparameter durch maschinelles Lernen und genetische Algorithmen zur Verringerung des Überhandels.

  3. Einführung von Modellensemble-Techniken zur Integration von Signalen aus mehreren unabhängigen Strategiemodellen, um die Robustheit zu verbessern.

  4. Eintritt in den Handel in einem höheren Zeitrahmen, Ausstieg in einem niedrigeren Zeitrahmen.

  5. Ein quantitatives Risikokontrollmodul mit strengen Grenzen für den Stop-Loss-Prozentsatz, den maximalen Drawdown usw. pro Handel erstellen.

Zusammenfassung

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)


Mehr