MACD-Strategie - Zwei-Wege-Exit-Handel

Schriftsteller:ChaoZhang, Datum: 2023-12-12 12:44:50
Tags:

img

Übersicht

Diese Strategie verwendet den Indikator Moving Average Convergence Divergence (MACD), um lange und kurze Signale zu generieren und umkehrende Trades unter guten Trendbedingungen durch dynamische Einstellung von Ausgangspunkten durchzuführen, um Gewinne zu erzielen.

Strategieprinzipien

Der Kern dieser Strategie basiert auf dem MACD-Goldkreuz für lange Signale und dem Todeskreuz für kurze Signale.

Bei goldenen Kreuzsignalen gehen Sie lang, wenn der Schlusskurs über der EMA liegt; bei Todeskreuzsignalen gehen Sie kurz, wenn der Schlusskurs unterhalb der EMA liegt.

Nach dem Eintritt in Positionen verwendet die Strategie Stop-Loss und Take-Profit, um die Ausgänge dynamisch zu steuern. Insbesondere wird der Stop-Loss für Long-Positionen auf den Einstiegspreis * (1 - max Drawdown) festgelegt; der Take-Profit wird auf den Einstiegspreis * (1 + TARGET_STOP_RATIO * max Drawdown) festgelegt. Umgekehrt für Short-Positionen. Hier wird der Max-Drawdown dynamisch als Prozentsatz des Kursrückgangs von Swing-Tief bis zum Schließen berechnet; TARGET_STOP_RATIO ist standardmäßig 2, was eine Risiko/Rendite-Ratio von 2 bedeutet.

Der Vorteil dieser dynamischen Stop-Strategie besteht darin, dass sie den Stop-Loss und das Risiko/Reward-Verhältnis basierend auf der Marktvolatilität anpassen kann.

Vorteile

  1. Der MACD ist ein effektiver Indikator zur Ermittlung von Umkehrmöglichkeiten.

  2. Der EMA-Filter stellt sicher, dass lange Trades nur in einem aufsteigenden Markt stattfinden.

  3. Das dynamische Exit-Control-System maximiert den Gewinn und verwaltet das Risiko effektiv.

  4. Die schnelle Existenzgeschwindigkeit reduziert die erforderliche Überwachungszeit und macht sie für beschäftigte Anleger geeignet.

Risiken und Lösungen

  1. Der MACD schwankt häufig während seitlicher Märkte und erzeugt falsche Signale. Dies wird durch Hinzufügen eines EMA-Filters gelöst, um Gegentrend-Trades zu vermeiden.

  2. Eine extreme Volatilität kann dazu führen, dass DYNAMIC STOP zu locker ist.

  3. Eine begrenzte Gewinnspanne pro Handel erfordert häufiges Handeln. Anleger benötigen eine gewisse psychologische Ausdauer und Zeitbindung. Sie können auf höhere Zeitrahmen wechseln, wenn sie zu beschäftigt sind.

Optimierungsrichtlinien

  1. Die MACD-Parameter werden anhand der Symbolmerkmale optimiert, um die Signalkwalität zu optimieren.

  2. Testen Sie verschiedene gleitende Durchschnitte als Trendfilter, um den optimalen zu finden.

  3. Überprüfen Sie die Berechnung von TARGET_STOP_RATIO und die Definition des maximalen Drawdowns, um die Ausstiegsstrategie zu optimieren.

  4. Zusätzlich werden weitere Faktoren wie Volumen, Volatilität usw. hinzugefügt, um die Signalqualität zu verbessern.

  5. Erforschen Sie maschinelle Lernmodelle, um mehr Funktionen zu extrahieren und adaptive Multifaktormodelle für intelligentere Ausgänge zu erstellen.

Schlussfolgerung

Diese Strategie hat insgesamt einen starken praktischen Wert. Mit dem MACD als Kernhandelssignal können die Add-on-Module des Trendfilters und der dynamischen Exit-Kontrolle die MACD-Leistung selbst erheblich verbessern. Die Exit-Kontrolle ist für die Strategieoptimierung unerlässlich und diese Strategie ist in diesem Bereich wesentlich innovativ.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © maxencetajet

//@version=5
strategy("MACD Strategy", overlay=true, initial_capital=1000, slippage=25)

src = input(title="Source", defval=close)
target_stop_ratio = input.float(title='Risk/Reward', defval=2, minval=0.5, maxval=100)
risk = input.float(2, title="Risk per Trade %")

riskt = risk / 100 + 1

useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
     group="Backtest Time Period")
backtestStartDate = input(timestamp("5 June 2022"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
backtestEndDate = input(timestamp("5 July 2022"),
     title="End Date", group="Backtest Time Period",
     tooltip="This end date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")

inTradeWindow =  true
emaV = input.int(200, title="Length", group="EMA")
swingHighV = input.int(7, title="Swing High", group="number of past candles")
swingLowV = input.int(7, title="Swing Low", group="number of past candles")

ema = ta.ema(src, emaV)

fast_length = input(title="Fast Length", defval=12, group="MACD")
slow_length = input(title="Slow Length", defval=26, group="MACD")
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD")

fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

longcondition = close > ema and ta.crossover(macd, signal) and macd < 0
shortcondition = close < ema and ta.crossunder(macd, signal) and macd > 0

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

risk_long := risk_long[1]
risk_short := risk_short[1]

swingHigh = ta.highest(high, swingHighV)
swingLow = ta.lowest(low, swingLowV)

lotB = (strategy.equity*riskt-strategy.equity)/(close - swingLow)
lotS = (strategy.equity*riskt-strategy.equity)/(swingHigh - close)

if strategy.position_size == 0 and longcondition and inTradeWindow
    risk_long := (close - swingLow) / close
    strategy.entry("long", strategy.long, qty=lotB)
    
if strategy.position_size == 0 and shortcondition and inTradeWindow
    risk_short := (swingHigh - close) / close  
    strategy.entry("short", strategy.short, qty=lotS)

if strategy.position_size > 0

    stopLoss := strategy.position_avg_price * (1 - risk_long)
    takeProfit := strategy.position_avg_price * (1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("long exit", "long", stop = stopLoss, limit = takeProfit)
    
if strategy.position_size < 0

    stopLoss := strategy.position_avg_price * (1 + risk_short)
    takeProfit := strategy.position_avg_price * (1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("short exit", "short", stop = stopLoss, limit = takeProfit)
    
plot(ema, color=color.white, linewidth=2, title="EMA")
p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price')
p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss')
p_tp = plot(takeProfit, color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr, title='takeProfit')
fill(p_sl, p_ep, color.new(color.red, transp=85))
fill(p_tp, p_ep, color.new(color.green, transp=85))



Mehr