MACD-Handelsstrategie mit adaptiver ATR-Stop Loss

Schriftsteller:ChaoZhang, Datum: 2023-09-20 15:23:00 Uhr
Tags:

Übersicht

Diese Strategie verwendet den MACD-Indikator, um Handelssignale und adaptive ATR-basierte Stop-Loss zu generieren, um Risiken zu kontrollieren.

Strategie Logik

  1. Der MACD-Delta-Linienkreuz 0 erzeugt Kauf- und Verkaufssignale.

  2. Der Wert der Risikopositionen, die für die Berechnung der Risikopositionen gemäß Artikel 429 Absatz 1 Buchstabe c der CRR gelten, wird auf der Grundlage der Risikopositionen gemäß Artikel 429 Absatz 1 der CRR berechnet.

  3. Der Stop-Loss passt sich anhand von Volatilitätsänderungen an und vergrößert sich, wenn die Volatilität ansteigt.

  4. Aktualisieren Sie Stop Loss in Echtzeit, wenn Sie in Positionen sind, um Gewinne zu erzielen und Risiken zu kontrollieren.

  5. Ausgangspositionen, wenn zum Risikomanagement ein Stop-Loss ausgelöst wird.

Vorteile

  1. Der MACD ist bei der Verfolgung von Trends empfindlich.

  2. Adaptive Stopps passen sich unterschiedlichen Marktumgebungen an und vermeiden zu enge oder lose Stopps.

  3. Die visuellen Stopplinien spiegeln den Risikostand intuitiv wider.

  4. Einfache und klare Strategieregeln, leicht verständlich und umsetzbar.

  5. Kontrollierbare Abzüge und ein wirksames Risikomanagement.

Risiken

  1. Der MACD kann falsche Signale erzeugen, die unnötige Verluste verursachen.

  2. Bei falschen ATR-Parametern werden die Haltestellen zu eng oder zu locker eingestellt.

  3. Gefahr, dass zu häufig Stopps ausgelöst werden.

  4. Es ist schwer, rechtzeitig zu stoppen, wenn sich der Trend umkehrt.

  5. Risiko einer Überanpassung bei der Optimierung von Parametern.

Erweiterung

  1. Testen Sie die MACD-Parameter für eine optimale Kombination.

  2. Versuchen Sie andere Stopp-Methoden wie Trailing Stops.

  3. Optimieren Sie Stopps, um die Häufigkeit und die Risikokontrolle auszugleichen.

  4. Hinzufügen eines Trendfilters, um Umkehrstopp zu verhindern.

  5. Berücksichtigen Sie die Auswirkungen auf die Handelskosten, um zu vermeiden, dass der Handel überhöhter ist.

  6. Verwenden Sie Gleit oder verstärkte Stopps, um sicherzustellen, dass die Stopps ausgelöst werden.

Schlussfolgerung

Diese Strategie handelt MACD-Signale mit adaptiven ATR-Dynamic-Stops. Sie bietet kontrollierbare Risiken und Einfachheit. Aber MACD-Signale können falsch sein, und Stops benötigen kontinuierliche Optimierung. Insgesamt kann es mit Parameter-Tuning, Stop-Optimierung usw. zu einem robusten Trendfolgensystem werden.


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

//@version=4
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)

/////////////// Time Frame ///////////////
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)

testPeriod() =>  true

///////////////  MACD  /////////////// 
fastLength = input(13) 
slowlength = input(30) 
MACDLength = input(12) 

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

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

last_long = 0.0
last_short = 0.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 = 0.0
last_open_short_signal = 0.0
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 = 0.0
last_short_signal = 0.0
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 = 0.0
last_low = 0.0
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])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(2, minval=1, title='ATR Stop Period')
atrMult = input(1.25, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long", strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
barcolor(long ? color.lime : short ? color.red : na)
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=2)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=2)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

Mehr