MACD-Bewegliche Durchschnittskombination Zeitrahmenübergreifende dynamische Trendstrategie

Schriftsteller:ChaoZhang, Datum: 2024-02-19 10:48:11
Tags:

img

Übersicht

Diese Strategie basiert auf der Kombination von gleitenden Durchschnitten des MACD-Indikators, um dynamische Trendbeurteilung über Zeiträume hinweg zu realisieren. Sie gehört zu einer klassischeren Trendverfolgungsstrategie. Sie beurteilt hauptsächlich die aktuelle Trendrichtung und -stärke durch die Differenz zwischen schnellen und langsamen gleitenden Durchschnitten des MACD und die Beziehung zwischen seiner Signallinie. Zur gleichen Zeit wird ein Überzeitrahmen eingeführt, um die Genauigkeit zu verbessern und Positionen dynamisch anzupassen.

Strategieprinzip

  1. Beurteilen Sie die aktuelle Trendrichtung anhand der Differenz zwischen den schnellen und langsam gleitenden Durchschnitten des MACD-Indikators und seiner Signallinie.
  2. Die MACD-Differenz über der Signallinie ist ein langes Signal und unterhalb ist ein kurzes Signal.
  3. Einführung von MACD-Differenz und MACD-Histogramm in die gleiche Richtung zur Verbesserung der Strategiesignale.
  4. Hinzufügen eines Kreuzzyklusbeurteilungsmoduls, Verwendung des MACD-Indikators eines höheren Zeitrahmens als Signalfilter und Positionsausrichtung.
  5. Dynamische Positionsanpassung, Verringerung der Positionsgröße, wenn das Kreuzzyklussignal schwächer ist, und Erhöhung der Positionsgröße, wenn das Signal verstärkt wird.

Analyse der Vorteile

  1. Die Wirksamkeit des MACD selbst bei der Bestimmung der Trendrichtung ist relativ hoch.
  2. Die Kombination von MACD-Differenz und Doppelverifizierung des Histogramms kann die Signalgenauigkeit verbessern.
  3. Das Kreuzzyklus-Urteilsvermögen erhöht die Stabilität der Strategie und verhindert, dass sie durch Hochfrequenzsignale in die Irre geführt wird.
  4. Eine dynamische Positionsanpassung ermöglicht es der Strategie, Chancen besser zu nutzen und überschüssige Renditen zu erhöhen.

Risikoanalyse und Lösungen

  1. Die MACD-Signale weisen eine Verzögerung auf, was zu leicht schlechteren Signalleffekten führen kann.
  • Lösung: Vergrößern Sie die Differenz zwischen schnellen und langsamen gleitenden Durchschnitten, um Signale im Voraus zu erfassen.
  1. Kreuzzyklussignale sind nicht unbedingt genau und können Strategien irreführen.
  • Lösung: Einführung eines dynamischen Positionsanpassungsmechanismus, um sicherzustellen, dass die Hauptzyklustrategie dominiert.
  1. Die allgemeine Stabilität von Kombinationsstrategien mit mehreren Faktoren ist möglicherweise unzureichend.
  • Lösung: Der Anteil des Gewichts jedes Strategieparameters wird sorgfältig angepasst, um die allgemeine Robustheit sicherzustellen.

Optimierungsrichtlinien

  1. Testen Sie die Auswirkungen verschiedener Kombinationen von Zyklusparametern.
  2. Prüfung der Auswirkungen verschiedener Kreuzzykluskombinationen auf die Wirksamkeit der Strategie.
  3. Anpassung der MACD-Indikatorparameter, wie z. B. schnelle und langsame gleitende Durchschnittszyklen, Signallinienzyklen usw.
  4. Testen Sie die Auswirkungen verschiedener Positionsanpassungsfaktoren.
  5. Testen Sie die Auswirkungen von Backtests auf andere Sorten.

Zusammenfassung

Diese MACD Moving Average Kombination Cross-Period Dynamic Trend Strategy integriert die Vorteile klassischer Indikatoren und Multi-Time Frame Referenzen. Durch Parameteroptimierung und Kombinationstests kann eine relativ stabile und profitable Trend-Tracking-Strategie konstruiert werden.


/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@temelbulut
//@version=5
strategy('MACD Strategy %80', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50)

fastLength = input.int(title='MACD Fast Length', defval=12, minval=1)
slowLength = input.int(title='MACD Slow Length', defval=26, minval=1)
signalLength = input.int(title='MACD Signal Length', defval=9, minval=1)
crossscore = input(title='Cross (buy/sell) Score', defval=10.)
indiside = input(title='indicator Direction Score', defval=8)
histside = input(title='Histogram Direction Score', defval=2)
shotsl = input(title='Show Stop Loss Line', defval=false)
Mult = input.float(title='Stop Loss Factor', defval=1.2, minval=0.1, maxval=100)
Period = input.int(title='Stop Loss Period', defval=10, minval=1, maxval=100)
lookaheadi = input(title='Lookahead', defval=true)

HTF = timeframe.period == '1' ? '5' : timeframe.period == '3' ? '15' : timeframe.period == '5' ? '15' : timeframe.period == '15' ? '60' : timeframe.period == '30' ? '60' : timeframe.period == '45' ? '60' : timeframe.period == '60' ? '240' : timeframe.period == '120' ? '240' : timeframe.period == '180' ? '240' : timeframe.period == '240' ? 'D' : timeframe.period == 'D' ? 'W' : 'W'

calc = timeframe.period == '1' ? 5 : timeframe.period == '3' ? 5 : timeframe.period == '5' ? 3 : timeframe.period == '15' ? 4 : timeframe.period == '30' ? 4 : timeframe.period == '45' ? 4 : timeframe.period == '60' ? 4 : timeframe.period == '120' ? 3 : timeframe.period == '180' ? 3 : timeframe.period == '240' ? 6 : timeframe.period == 'D' ? 5 : 1

count() =>
    indi = ta.ema(close, fastLength) - ta.ema(close, slowLength)
    signal = ta.ema(indi, signalLength)
    Anlyse = 0.0
    // direction of indi and histogram
    hist = indi - signal
    Anlyse := indi > indi[1] ? hist > hist[1] ? indiside + histside : hist == hist[1] ? indiside : indiside - histside : 0
    Anlyse += (indi < indi[1] ? hist < hist[1] ? -(indiside + histside) : hist == hist[1] ? -indiside : -(indiside - histside) : 0)
    Anlyse += (indi == indi[1] ? hist > hist[1] ? histside : hist < hist[1] ? -histside : 0 : 0)
    // cross now earlier ?
    countcross = indi >= signal and indi[1] < signal[1] ? crossscore : indi <= signal and indi[1] > signal[1] ? -crossscore : 0.
    countcross += nz(countcross[1]) * 0.6
    Anlyse += countcross
    nz(Anlyse)

Anlys = count()
AnlysHfrm = lookaheadi ? request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_on) : request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_off)
Result = (AnlysHfrm * calc + Anlys) / (calc + 1)

longCondition = ta.change(Result) != 0 and Result > 0
if longCondition
    strategy.entry('MACD Long', strategy.long,alert_message = 'MACD Long')

shortCondition = ta.change(Result) != 0 and Result < 0
if shortCondition
    strategy.entry('MACD Short', strategy.short,alert_message = 'MACD Short')

countstop(pos) =>
    Upt = hl2 - Mult * ta.atr(Period)
    Dnt = hl2 + Mult * ta.atr(Period)
    TUp = 0.
    TDown = 0.
    TUp := close[1] > TUp[1] ? math.max(Upt, TUp[1]) : Upt
    TDown := close[1] < TDown[1] ? math.min(Dnt, TDown[1]) : Dnt
    tslmtf = pos == 1 ? TUp : TDown
    tslmtf

pos = longCondition ? 1 : -1
stline = 0.
countstop__1 = countstop(pos)
security_1 = request.security(syminfo.tickerid, HTF, countstop__1)
stline := ta.change(time(HTF)) != 0 or longCondition or shortCondition ? security_1 : nz(stline[1])
plot(stline, color=shotsl ? color.rgb(148, 169, 18) : na, style=plot.style_line, linewidth=2, title='Stop Loss')



Mehr