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.
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.
Der MACD-Indikator kann Trends effektiv identifizieren und ist einer der klassischen technischen Indikatoren.
Die Differenz zwischen schnellen und langsamen gleitenden Durchschnitten kann die Kursdynamik und Richtungsänderungen frühzeitig erfassen.
Der Filtereffekt der gleitenden Durchschnitte hilft, einige falsche Signale zu filtern.
Die Strategie enthält einen Stop-Loss-Mechanismus zur Risikokontrolle.
Der MACD ist anfällig für falsche Signale mit begrenztem Optimierungsraum.
Eine falsche Stop-Loss-Platzierung kann zu aktiv oder konservativ sein und eine individuelle Optimierung aller Produkte erfordern.
Eine feste Positionsgröße kann leicht zu einer Überhebung führen. Betrachten Sie eine Positionsgröße, die auf der Kontogröße basiert.
Die Begründung für Backtest-Zeitrahmen muss validiert werden, um eine Überanpassung zu vermeiden.
Optimieren Sie Kombinationen von schnellen und langsamen gleitenden Durchschnitten, um die besten Parameter für verschiedene Produkte zu finden.
Fügen Sie andere Indikatoren wie Kerzen, Bollinger Bands, RSI hinzu, um Signale zu filtern.
Bewertet verschiedene Stop-Loss-Level basierend auf Drawdown, Sharpe-Ratio.
Erforschen Sie Stop-Loss-Techniken wie Trailing-Stop-Loss, Limit-Orders.
Testen Sie dynamische Positionsgrößen auf der Grundlage von Eigenkapital und Volatilität.
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)