Strategie für eine doppelte dynamische Kreuzung des gleitenden Durchschnitts

Schriftsteller:ChaoZhang, Datum: 2023-11-16 17:25:13
Tags:

img

Übersicht

Diese Strategie nutzt das Dual Moving Average Crossover Prinzip, kombiniert den MACD-Indikator für Trendbeurteilung und Cross-Background-Highlighting und bestätigt Einträge mit Musterpunkten, mit dem Ziel, mittelfristige Trends auf dem Markt zu erfassen.

Strategie Logik

Die Strategie erstellt doppelte gleitende Durchschnitte unter Verwendung von schnellen EMA und langsamen EMA und bestimmt die Trendrichtung basierend auf dem Übergang zwischen den schnellen und langsamen Linien.

Nach dem Code beträgt die schnelle Linienlänge 12 und die langsame Linienlänge 26, was kurz- und langfristige Trends darstellt.

Crossover-Logik:

  • Trend_up = MACD > Signal: Schnelle Linie überläuft langsame Linie, was auf einen kurzfristigen Aufwärtstrend hinweist

  • Trend_dn = macd < Signal: Schnelle Linie unter der langsamen Linie, was auf einen kurzfristigen Abwärtstrend hinweist

Erkennung von Kreuzungspunkten:

  • cross_UP = Signal[1] >= macd[1] und Signal < macd: Schnelle Linie kreuzt langsame Linie von unten

  • cross_DN = Signal[1] <= macd[1] und Signal > macd: Schnelle Linie kreuzt langsame Linie von oben

Die Farbwechselung des Histogramms bestimmt die Impulsstärke:

  • histA_IsUp = Histogrammsäule wächst und größer als 0, Momentum stärkt sich im Aufwärtstrend

  • histA_IsDown = Histogrammsäule sinkend, aber immer noch größer als 0, Momentum schwächer im Aufwärtstrend

  • Die gleiche Logik unter 0

Vorteile

  1. Doppel gleitende Durchschnitte bestimmen den mittelfristigen Trend, vermeiden kurzfristigen Lärm

  2. MACD hilft bei der Beurteilung von kurzfristigen Trends und Dynamik für eine höhere Rentabilität

  3. Histogramm-Farbänderung hilft, bessere Eingangszeitpunkte zu identifizieren

  4. Crossover-Hintergrundfarbe hebt Signale hervor

  5. Anpassungsfähige gleitende Durchschnittsperioden für verschiedene Marktumgebungen

  6. Regelmäßige MACD-Parameter optimieren den Indikator

  7. Bereitstellung mehrerer Eingabebestätigungen: Trend, Crossover, Musterbruch

Risiken

  1. Doppelfinanzierte Finanzinstitute, die nicht auf kurzfristige Schwankungen reagieren, können kurzfristige Chancen verpassen

  2. Ein schlechter MACD-Effekt bei unsachgemäßen Parametereinstellungen kann zu falschen Signalen führen

  3. Einträge, die sich ausschließlich auf MAs und MACD stützen, haben einige blinde Punkte

  4. Keine Stop-Loss-Mechanismen führen zu einem Risiko für zunehmende Verluste

  5. Mangelnde strenge Geldverwaltung und Positionsgröße

Mögliche Lösungen:

  1. Kombination anderer Indikatoren zur Festlegung von kurzfristigen Swing-Bereichern und zur Kontrolle des Risikos

  2. Optimierung der MACD-Parameter und Test auf verschiedenen Märkten

  3. Hinzufügen von Muster, Impuls usw., um Signale zu bestätigen

  4. Einrichtung von Stop-Loss-Mechanismen zur Begrenzung der Verlustgröße

  5. Hinzufügen eines Geldmanagementmoduls zu den Größen von Positionen auf der Grundlage des Kapitals

Optimierungsrichtlinien

  1. Prüfung und Optimierung von Kombinationen von MA-Parametern für eine höhere Anpassungsfähigkeit des Marktes

  2. Versuchen Sie verschiedene MA-Typen wie VWAP, Bollinger Midline usw.

  3. Um falsche Ausbrüche zu vermeiden, sollten Sie das Handelsvolumen berücksichtigen

  4. Einbeziehung von RSI usw. zur Bestätigung von Überkauf/Überverkauf

  5. Es sollten robuste Stop-Loss-Mechanismen wie Trailing Stop, Volatility Stop usw. aufgebaut werden.

  6. Einbeziehung von Positionsgrößen auf der Grundlage der Kontogröße

  7. Maschinelles Lernen für die Optimierung von Parametern

  8. Erweiterung des Strategieuniversums für einen verbesserten Portfolioansatz

Schlussfolgerung

Diese Strategie integriert die doppelte gleitende Durchschnitts-Trendfilterung und MACD-Impuls, fügt Mustermerkmale hinzu und baut ein relativ stabiles mittelfristiges Handelssystem auf. Der Hauptvorteil liegt darin, den großen Trend zu erfassen und gleichzeitig kurzfristigen Lärm zu vermeiden. Es gibt aber auch Bereiche, die verbessert werden könnten, wie das Hinzufügen von Stop-Loss-Mechanismen und Risikomanagement. Insgesamt dient dies als wertvolles konzeptionelles Beispiel, erfordert aber umfassende Tests und Verfeinerungen für den Live-Handel.


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

//@version=5
strategy(title="Histogram MacD MVP_V2.1", shorttitle="Histogram MacD MVP_2.1")
//Plot Inputs
res           = input.timeframe("",  "Indicator TimeFrame")
fast_length   = input.int(title="Fast Length", defval=12)
slow_length   = input.int(title="Slow Length", defval=26)
src           = input.source(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9)
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"])
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Show Plots T/F
show_macd     = input.bool(true, title="Show MACD Lines", group="Show Plots?", inline="SP10")
show_macd_LW  = input.int(3, minval=0, maxval=5, title = "MACD Width", group="Show Plots?", inline="SP11")
show_signal_LW= input.int(2, minval=0, maxval=5, title = "Signal Width", group="Show Plots?", inline="SP11")
show_Hist     = input.bool(true, title="Show Histogram", group="Show Plots?", inline="SP20")
show_hist_LW  = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP20")
show_trend    = input.bool(true, title = "Show MACD Lines w/ Trend Color", group="Show Plots?", inline="SP30")
show_HB       = input.bool(false, title="Show Highlight Price Bars", group="Show Plots?", inline="SP40")
show_cross    = input.bool(false, title = "Show BackGround on Cross", group="Show Plots?", inline="SP50")
show_dots     = input.bool(true, title = "Show Circle on Cross", group="Show Plots?", inline="SP60")
show_dots_LW  = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP60")

//show_trend    = input(true, title = "Colors MACD Lines w/ Trend Color", group="Show Plots?", inline="SP5")
// MACD Lines colors
col_macd      = input.color(#FF6D00, "MACD Line  ",  group="Color Settings", inline="CS1")
col_signal    = input.color(#2962FF, "Signal Line  ",  group="Color Settings", inline="CS1")
col_trnd_Up   = input.color(#4BAF4F, "Trend Up      ",  group="Color Settings", inline="CS2")
col_trnd_Dn   = input.color(#B71D1C, "Trend Down    ",  group="Color Settings", inline="CS2")
// Histogram Colors
col_grow_above = input.color(#26A69A, "Above   Grow",  group="Histogram Colors", inline="Hist10")
col_fall_above = input.color(#FF5252, "Fall",  group="Histogram Colors", inline="Hist10")
col_grow_below = input.color(#FF5252, "Below Grow",  group="Histogram Colors", inline="Hist20")
col_fall_below = input.color(#f8f524, "Fall",  group="Histogram Colors", inline="Hist20")
// Alerts T/F Inputs
alert_Long    = input.bool(true, title = "MACD Cross Up", group = "Alerts", inline="Alert10")
alert_Short   = input.bool(true, title = "MACD Cross Dn", group = "Alerts", inline="Alert10")
alert_Long_A  = input.bool(false, title = "MACD Cross Up & > 0", group = "Alerts", inline="Alert20")
alert_Short_B = input.bool(false, title = "MACD Cross Dn & < 0", group = "Alerts", inline="Alert20")
// Calculating
fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal
// MACD Trend and Cross Up/Down conditions
trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0
// Condition that changes Color of MACD Line if Show Trend is turned on..
trend_col = show_trend  and trend_up ? col_trnd_Up : trend_up ? col_macd : show_trend  and trend_dn ? col_trnd_Dn: trend_dn ? col_macd : na 

//Var Statements for Histogram Color Change
var bool histA_IsUp = false
var bool histA_IsDown = false
var bool histB_IsDown = false
var bool histB_IsUp = false
histA_IsUp   := hist == hist[1] ? histA_IsUp[1] : hist > hist[1] and hist > 0
histA_IsDown := hist == hist[1] ? histA_IsDown[1] : hist < hist[1] and hist > 0
histB_IsDown := hist == hist[1] ? histB_IsDown[1] : hist < hist[1] and hist <= 0
histB_IsUp   := hist == hist[1] ? histB_IsUp[1] : hist > hist[1] and hist <= 0

hist_col =  histA_IsUp ? col_grow_above : histA_IsDown ? col_fall_above : histB_IsDown ? col_grow_below : histB_IsUp ? col_fall_below :color.silver 

// Plot Statements
//Background Color
bgcolor(show_cross and cross_UP ? col_trnd_Up : na, editable=false)
bgcolor(show_cross and cross_DN ? col_trnd_Dn : na, editable=false)
//Highlight Price Bars
barcolor(show_HB and trend_up ? col_trnd_Up : na, title="Trend Up", offset = 0, editable=false)
barcolor(show_HB and trend_dn ? col_trnd_Dn : na, title="Trend Dn", offset = 0, editable=false)
//Regular Plots
plot(show_Hist and hist ? hist : na, title="Histogram", style=plot.style_columns, color=color.new(hist_col ,0),linewidth=show_hist_LW)
plot(show_macd  and signal ? signal : na, title="Signal", color=color.new(col_signal, 0),  style=plot.style_line ,linewidth=show_signal_LW)
plot(show_macd  and macd ? macd : na, title="MACD", color=color.new(trend_col, 0),  style=plot.style_line ,linewidth=show_macd_LW)
hline(0, title="0 Line", color=color.new(color.gray, 0), linestyle=hline.style_dashed, linewidth=1, editable=false)
plot(show_dots and cross_UP ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false)
plot(show_dots and cross_DN ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false)

//Alerts
if alert_Long and cross_UP
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Up.", alert.freq_once_per_bar_close)

if alert_Short and cross_DN
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Down.", alert.freq_once_per_bar_close)
//Alerts - Stricter Condition - Only Alerts When MACD Crosses UP & MACD > 0 -- Crosses Down & MACD < 0
if alert_Long_A and cross_UP_A
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD > 0 And Crosses Up.", alert.freq_once_per_bar_close)

if alert_Short_B and cross_DN_B
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD < 0 And Crosses Down.", alert.freq_once_per_bar_close)


if (histA_IsUp)
	strategy.entry("buy", strategy.long, comment="buy")
if (histA_IsDown)
	strategy.entry("sell", strategy.short, comment="sell")


Mehr