Strategi Dagangan MACD dengan Stop Loss ATR adaptif

Penulis:ChaoZhang, Tarikh: 2023-09-20 15:23:00
Tag:

Ringkasan

Strategi ini menggunakan penunjuk MACD untuk menjana isyarat perdagangan dan stop loss berasaskan ATR adaptif untuk mengawal risiko.

Logika Strategi

  1. Perpindahan garis delta MACD 0 menghasilkan isyarat beli dan jual.

  2. Pendapatan yang tidak dikurangkan daripada jumlah yang dikurangkan daripada jumlah yang dikurangkan daripada jumlah yang dikurangkan.

  3. Stop loss menyesuaikan diri dengan perubahan turun naik, meluas apabila turun naik meningkat.

  4. Mengemas kini stop loss dalam masa nyata apabila dalam kedudukan, untuk mengunci keuntungan dan mengawal risiko.

  5. Posisi keluar apabila stop loss dicetuskan untuk menguruskan risiko.

Kelebihan

  1. MACD sensitif dalam mengesan trend.

  2. Hentian penyesuaian sesuai dengan persekitaran pasaran yang berbeza, mengelakkan hentian yang terlalu ketat atau longgar.

  3. Garis berhenti visual secara intuitif mencerminkan status risiko.

  4. Peraturan strategi yang mudah dan jelas, mudah difahami dan dilaksanakan.

  5. Pengeluaran yang boleh dikawal dan pengurusan risiko yang berkesan.

Risiko

  1. MACD boleh menghasilkan isyarat palsu yang menyebabkan kerugian yang tidak perlu.

  2. Parameter ATR yang tidak betul menyebabkan hentian terlalu ketat atau longgar.

  3. Risiko berhenti yang dicetuskan terlalu kerap.

  4. Sukar untuk berhenti tepat pada masanya apabila trend berbalik.

  5. Risiko overfitting apabila mengoptimumkan parameter.

Peningkatan

  1. Uji parameter MACD untuk kombinasi yang optimum.

  2. Cuba kaedah berhenti lain seperti hentian.

  3. Mengoptimumkan hentian untuk mengimbangi kekerapan dan kawalan risiko.

  4. Tambah penapis trend untuk mengelakkan hentian pembalikan.

  5. Pertimbangkan kesan kos dagangan untuk mengelakkan overtrading.

  6. Menggunakan slippage atau penghentian yang dipertingkatkan untuk memastikan penghentian dipicu.

Kesimpulan

Strategi ini memperdagangkan isyarat MACD dengan hentian dinamik ATR adaptif. Ia mempunyai risiko dan kesederhanaan yang boleh dikawal. Tetapi isyarat MACD mungkin salah, dan hentian memerlukan pengoptimuman berterusan. Secara keseluruhan, dengan penyesuaian parameter, pengoptimuman hentian dan lain-lain, ia boleh menjadi sistem trend berikut yang kukuh.


/*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)

Lebih lanjut