MACD-Momentumsindikator Backtest-Strategie

Schriftsteller:ChaoZhang, Datum: 24.09.2023
Tags:

Übersicht

Diese Strategie kombiniert den MACD-Momentumsindikator mit dem RSI-Overbought/Oversold-Indikator. Wenn der MACD nach oben oder unten kreuzt, überprüft er, ob der RSI auch die entsprechende Bottoming/Topping-Umkehrung über den Lookback-Zeitraum abschließt, um zuverlässigere Handelssignale zu generieren.

Strategie Logik

  1. Berechnen Sie MACD DIFF, DEA und Histogramm. Das Crossover von DIFF über DEA gibt ein bullisches Crossover-Signal und das Crossover darunter gibt ein Todes-Cross-Signal.

  2. Berechnen Sie den RSI, um Überverkauf und Überkauf zu identifizieren.

  3. Wenn der MACD-Bullish-Crossover stattfindet, wird ein langes Signal erzeugt, wenn der RSI innerhalb des Lookback-Fensters von Überverkäufen zurückgeschlagen hat.

  4. Stop-Loss-Einstellung nach dem Eintritt in die Risikokontrolle.

Vorteile

  1. Der MACD identifiziert tendenzbedingte Veränderungen auf empfindliche Weise. Der RSI beurteilt effektiv Überkauf-/Überverkaufswerte.

  2. Wenn sowohl MACD- als auch RSI-Signale benötigt werden, werden falsche Signale ausfiltert.

  3. Das Rückblickfenster verbessert die Signalzuverlässigkeit.

  4. Stop-Loss hilft beim Risikomanagement.

Risiken

  1. Ein Verzögerung des MACD und des RSI kann zu fehlenden optimalen Einträgen führen.

  2. Eine geringere Wahrscheinlichkeit eines Dual-Indicator-Signals bedeutet weniger Trades.

  3. Eine Überlegung über eine größere Trendrichtung birgt die Gefahr, dass man in die Falle gerät.

  4. Eine schlechte Einstellung des Stoppverlustes kann zu breit oder zu eng sein.

Mögliche Lösungen:

  1. MACD- und RSI-Parameter anpassen, um die Verzögerung zu verringern.

  2. Erweitern Sie den Schwellenbereich der Indikatoren, um mehr Signale zu liefern.

  3. Hinzufügen eines Trendfilters, um Gegentrend-Einträge zu vermeiden.

  4. Versuche verschiedene Stop-Loss-Parameter für optimale Werte.

Optimierungsrichtlinien

  1. Testen Sie SMA und andere gleitende Durchschnitte.

  2. Für flexible Stopps hinzufügen.

  3. Einbeziehen Sie die Trendstärke, um die Qualität des Eingangs zu beurteilen.

  4. Verwenden Sie maschinelles Lernen, um Indikatorbewegungen vorherzusagen.

  5. Kombinieren Sie mehr Faktoren, um den Einstiegszeitplan zu optimieren.

Zusammenfassung

Diese Strategie filtert nach zuverlässigen Umkehrsignalen mit koordinierten MACD und RSI. Die Logik ist klar und die Parameter flexibel für Verbesserungen wie Indikatorauswahl, Trendfilter, Stop-Loss-Techniken usw., um mehr Trades zu erwerben und gleichzeitig Stabilität zu erhalten, aber Überoptimierungsrisiken müssen vermieden werden.


/*backtest
start: 2023-08-24 00:00:00
end: 2023-09-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//based on Range Strat - MACD/RSI 
// strategy("MACD/RSI - edited", 
//      overlay=true,
//      default_qty_type=strategy.percent_of_equity,
//      default_qty_value=10, precision=2, initial_capital=100000,
//      pyramiding=2,
//      commission_value=0.05)

//Backtest date range
StartDate = input(timestamp("13 Jun 2022"), title="Start Date")
EndDate = input(timestamp("13 Jun 2024"), title="Start Date")
inDateRange = true

// RSI Input Settings
rsisrc = input(title="RSI Source", defval=close, group="RSI Settings")
length = input(title="Length", defval=14, group="RSI Settings" )
overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" )
overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" )
rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings")

// Calculating RSI
vrsi = ta.rsi(rsisrc, length)
co = ta.crossover(vrsi, overSold)
cu = ta.crossunder(vrsi, overBought)

// Function looking for a happened condition during lookback period
f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed


coCheck = f_somethingHappened(co, rsi_lookback)
cuCheck = f_somethingHappened(cu, rsi_lookback)

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


// Calculating MACD
fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
delta = macd - signal

MACDcrossover = ta.crossover(delta, 0)
MACDcrossunder = ta.crossunder(delta, 0)

// Stop Loss Input Settings
longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01
shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01

// Calculating Stop Loss
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



// Strategy Entry
if (not na(vrsi))
	if (inDateRange and MACDcrossover and coCheck)
		strategy.entry("LONG", strategy.long, comment="LONG")
	if (inDateRange and MACDcrossunder and cuCheck)
		strategy.entry("SHORT", strategy.short, comment="SHORT")

// Submit exit orders based on calculated stop loss price
if (strategy.position_size > 0)
    strategy.exit(id="LONG STOP", stop=longStopPrice)
if (strategy.position_size < 0)
    strategy.exit(id="SHORT STOP", stop=shortStopPrice)

Mehr