Strategi perdagangan MACD dengan Stop Loss ATR adaptif

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

Gambaran umum

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

Logika Strategi

  1. Crossover garis delta MACD 0 menghasilkan sinyal beli dan jual.

  2. Hal ini berarti bahwa nilai volatilitas yang tidak dapat dihitung adalah nilai volatilitas yang tidak dapat dihitung.

  3. Stop loss menyesuaikan secara adaptif dengan perubahan volatilitas, memperluas ketika volatilitas melonjak.

  4. Perbarui stop loss secara real time saat berada di posisi, untuk mengunci keuntungan dan mengendalikan risiko.

  5. Posisi keluar ketika stop loss dipicu untuk mengelola risiko.

Keuntungan

  1. MACD sensitif dalam melacak tren.

  2. Stop adaptif cocok dengan lingkungan pasar yang berbeda, menghindari stop yang terlalu ketat atau longgar.

  3. Garis stop visual secara intuitif mencerminkan status risiko.

  4. Aturan strategi yang sederhana dan jelas, mudah dimengerti dan diterapkan.

  5. Pengambilan yang terkontrol dan manajemen risiko yang efektif.

Risiko

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

  2. Parameter ATR yang tidak tepat menyebabkan berhenti terlalu ketat atau longgar.

  3. Resiko berhenti terlalu sering.

  4. Sulit untuk berhenti tepat waktu ketika tren berbalik.

  5. Risiko overfitting saat mengoptimalkan parameter.

Peningkatan

  1. Uji parameter MACD untuk kombinasi optimal.

  2. Cobalah metode lain seperti trailing stops.

  3. Mengoptimalkan pemberhentian untuk menyeimbangkan frekuensi dan pengendalian risiko.

  4. Tambahkan filter tren untuk mencegah reversal berhenti.

  5. Pertimbangkan dampak biaya perdagangan untuk menghindari overtrading.

  6. Gunakan slippage atau stop yang ditingkatkan untuk memastikan stop dipicu.

Kesimpulan

Strategi ini memperdagangkan sinyal MACD dengan berhenti dinamis ATR adaptif. Ini memiliki risiko dan kesederhanaan yang dapat dikontrol. Tetapi sinyal MACD mungkin salah, dan berhenti membutuhkan optimasi terus menerus. Secara keseluruhan, dengan penyesuaian parameter, optimasi berhenti dll, ini dapat menjadi sistem trend berikut yang kuat.


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