Strategi perdagangan MACD berdasarkan stop loss ATR adaptif


Tanggal Pembuatan: 2023-09-20 15:23:00 Akhirnya memodifikasi: 2023-09-20 15:23:00
menyalin: 1 Jumlah klik: 870
1
fokus pada
1621
Pengikut

Ringkasan

Strategi ini menggunakan indikator MACD untuk menghasilkan sinyal perdagangan dan menggunakan stop-loss adaptif berbasis ATR untuk mengendalikan risiko.

Prinsip Strategi

  1. Garis delta deviasi MACD menembus sumbu 0 untuk menghasilkan sinyal beli dan jual.

  2. Stop loss dinamika ATR dihitung berdasarkan siklus N terakhir. ATR dapat mencerminkan volatilitas pasar.

  3. Stop loss beradaptasi dengan perubahan fluktuasi dan akan mereda saat fluktuasi meningkat.

  4. Pembaruan posisi stop loss secara real-time saat memegang sinyal untuk mengunci keuntungan dan mengendalikan risiko.

  5. Keluar dari posisi saat stop loss dipicu dan selesaikan pengendalian risiko.

Analisis Keunggulan

  1. Indikator MACD lebih sensitif terhadap trend tracking.

  2. Stop loss dinamis dapat beradaptasi dengan kondisi pasar dan menghindari stop loss yang terlalu dekat atau terlalu jauh.

  3. Garis Stop Loss yang dapat dilihat secara langsung mencerminkan situasi risiko.

  4. Peraturan-peraturan strategi yang sederhana, jelas, dan mudah dipahami.

  5. Pengunduran diri dapat dikontrol, manajemen risiko efektif.

Analisis risiko

  1. Indeks MACD dapat menghasilkan sinyal palsu yang menyebabkan kerugian yang tidak perlu.

  2. ATR parameter yang tidak tepat, terlalu dekat atau terlalu jauh.

  3. Hal ini dikarenakan adanya risiko kerusakan yang terlalu sering terjadi.

  4. “Kembali ke masa lalu adalah hal yang sulit, dan terhenti di masa lalu”.

  5. Ada kemungkinan ada risiko over-fitting ketika parameter dioptimalkan.

Arah optimasi

  1. Uji kombinasi MACD dari parameter yang berbeda untuk mencari parameter optimal.

  2. Cobalah cara lain untuk menghentikan kerugian, seperti menelusuri kerugian.

  3. Mengoptimalkan parameter stop loss, menyeimbangkan frekuensi stop loss dan kontrol risiko.

  4. Menambahkan mekanisme penilaian tren untuk menghindari reversal stop loss.

  5. Mempertimbangkan dampak dari biaya transaksi dan mencegah overtrading.

  6. Menggunakan titik geser atau meningkatkan stop loss untuk memastikan stop loss berlaku.

Meringkaskan

Strategi ini didasarkan pada indikator MACD, menggunakan stop loss dinamis ATR yang beradaptasi. Memiliki risiko yang dapat dikontrol, dan fitur praktis yang sederhana. Namun, sinyal MACD mudah salah, dan mekanisme stop loss perlu terus dioptimalkan. Secara keseluruhan, dengan menyesuaikan parameter, mengoptimalkan strategi stop loss, dan lain-lain, dapat membuatnya menjadi sistem perdagangan pelacakan tren yang lebih kuat.

Kode Sumber Strategi
/*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)