MACD-Trend-Bilanzierungsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-10-17 16:15:53
Tags:

img

Übersicht

Dies ist eine Trendfolgestrategie, die mit Hilfe des MACD-Indikators bullische und bärische Richtungen identifiziert. Sie erzeugt die MACD-Hauptlinie, indem sie den Unterschied zwischen schnellen und langsamen gleitenden Durchschnitten berechnet.

Strategie Logik

Der Code legt zunächst den Zeitrahmen für das Backtesting fest, um die historische Leistung der Strategie zu testen.

Der MACD-Indikator wird dann berechnet, einschließlich der Längeneinstellungen für den schnellen gleitenden Durchschnitt, den langsamen gleitenden Durchschnitt und den MACD-gleitenden Durchschnitt. Die schnelle Linie reagiert empfindlicher und die langsame Linie reagiert stetiger. Ihre Differenz bildet die MACD-Hauptlinie, die dann durch einen gleitenden Durchschnitt glättet wird, um die MACD-Signallinie zu bilden. Wenn die Differenz über die Nulllinie geht, wird ein Aufwärtssignal generiert. Wenn sie darunter geht, wird ein Bärensignal generiert.

Wenn die schnellen und langsamen Linien sich kreuzen, bestätigen und die Kauf-/Verkaufssignale aufzeichnen, kann eine Position eröffnet werden.

Nach dem Eintritt in eine Position verfolgen Sie kontinuierlich den höchsten und niedrigsten Preis der Position. Setzen Sie einen Stop-Loss-Prozentsatz, wenn der Verlust diesen Prozentsatz erreicht, verlassen Sie mit einem Stop-Loss.

Vorteile

  1. Der MACD-Indikator kann Trends effektiv identifizieren und ist einer der klassischen technischen Indikatoren.

  2. Die Differenz zwischen schnellen und langsamen gleitenden Durchschnitten kann die Kursdynamik und Richtungsänderungen frühzeitig erfassen.

  3. Der Filtereffekt der gleitenden Durchschnitte hilft, einige falsche Signale zu filtern.

  4. Die Strategie enthält einen Stop-Loss-Mechanismus zur Risikokontrolle.

Risiken

  1. Der MACD ist anfällig für falsche Signale mit begrenztem Optimierungsraum.

  2. Eine falsche Stop-Loss-Platzierung kann zu aktiv oder konservativ sein und eine individuelle Optimierung aller Produkte erfordern.

  3. Eine feste Positionsgröße kann leicht zu einer Überhebung führen. Betrachten Sie eine Positionsgröße, die auf der Kontogröße basiert.

  4. Die Begründung für Backtest-Zeitrahmen muss validiert werden, um eine Überanpassung zu vermeiden.

Optimierung

  1. Optimieren Sie Kombinationen von schnellen und langsamen gleitenden Durchschnitten, um die besten Parameter für verschiedene Produkte zu finden.

  2. Fügen Sie andere Indikatoren wie Kerzen, Bollinger Bands, RSI hinzu, um Signale zu filtern.

  3. Bewertet verschiedene Stop-Loss-Level basierend auf Drawdown, Sharpe-Ratio.

  4. Erforschen Sie Stop-Loss-Techniken wie Trailing-Stop-Loss, Limit-Orders.

  5. Testen Sie dynamische Positionsgrößen auf der Grundlage von Eigenkapital und Volatilität.

Schlussfolgerung

Die MACD-Trend-Balancing-Strategie basiert auf dem klassischen MACD-Indikator. Sie hat die Fähigkeit, die Kursdynamik empfindlich zu erfassen und kann durch Parameteroptimierung an verschiedene Produkte angepasst werden. Weitere Verbesserungen bei Filtersignalen, Stop-Loss-Techniken und dynamischer Positionsgröße können die Stabilität und Rentabilität weiter verbessern.


/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("MACD BF", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Component Code Start ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true

///////////////  MACD Component - Default settings for one day. /////////////// 
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12)  // 12 for 4hr

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

long = crossover(delta, 0) 
short = crossunder(delta, 0) 

last_long = long ? time : nz(last_long[1])
last_short = short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = long_signal ? time : nz(last_long_signal[1])
last_short_signal = short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low = not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(5.0, title='Stop Loss %', type=float)/100

/////////////// Strategy Component /////////////// 
// Strategy Entry
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long_signal)
    strategy.entry("Short Entry", strategy.short, when=short_signal)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy SL Exit
if testPeriod()
    strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
    strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)

//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)

Mehr