Strategi dagangan MACD berdasarkan stop loss ATR adaptif


Tarikh penciptaan: 2023-09-20 15:23:00 Akhirnya diubah suai: 2023-09-20 15:23:00
Salin: 1 Bilangan klik: 870
1
fokus pada
1621
Pengikut

Gambaran keseluruhan

Strategi ini menggunakan indikator MACD untuk menghasilkan isyarat perdagangan dan mengawal risiko dengan menggunakan stop adjustment berasaskan ATR. Ia adalah strategi mengikut trend.

Prinsip Strategi

  1. Garis delta deflection MACD menembusi paksi 0 untuk menghasilkan isyarat beli dan jual.

  2. Stop loss dinamik ATR dikira berdasarkan N kitaran terakhir. ATR boleh mencerminkan kadar turun naik pasaran.

  3. Tahap penangguhan menyesuaikan diri dengan perubahan kadar turun naik, dan apabila turun naik meningkat, penangguhan akan diperlahankan.

  4. Mengemas kini kedudukan hentian dalam masa nyata semasa memegang isyarat untuk mengunci keuntungan dan mengawal risiko.

  5. Keluar dari pegangan apabila stop loss tercetus dan selesaikan kawalan risiko.

Analisis kelebihan

  1. Indeks MACD lebih sensitif terhadap trend.

  2. Hentian dinamik boleh menyesuaikan diri dengan keadaan pasaran, mengelakkan hentian terlalu dekat atau terlalu jauh.

  3. Garis pinggir kerugian berhenti yang dapat dilihat, mencerminkan keadaan risiko secara langsung.

  4. Peraturan-peraturan strategi adalah mudah difahami dan mudah difahami.

  5. Penarikan balik boleh dikawal, pengurusan risiko berkesan.

Analisis risiko

  1. Indeks MACD mungkin menghasilkan isyarat palsu yang menyebabkan kerugian yang tidak perlu.

  2. ATR parameter yang ditetapkan tidak betul, masalah terlalu dekat atau terlalu jauh.

  3. Kemalangan yang terlalu kerap berlaku.

  4. “Kembali ke arah yang lebih baik adalah lebih sukar dan lebih sukar untuk dihentikan.

  5. Mungkin terdapat risiko terlalu sesuai apabila parameter dioptimumkan.

Arah pengoptimuman

  1. Uji kombinasi MACD dengan parameter yang berbeza untuk mencari parameter yang optimum.

  2. Cubalah cara lain untuk menghentikan kerugian, seperti menjejaki kerugian.

  3. Mengoptimumkan parameter hentian, keseimbangan frekuensi hentian dan kawalan risiko.

  4. Menambah mekanisme penilaian trend untuk mengelakkan terbalikkan stop loss.

  5. Mengambil kira kesan kos transaksi untuk mengelakkan perdagangan berlebihan.

  6. Menggunakan titik slider atau meningkatkan penghentian untuk memastikan penghentian berlaku

ringkaskan

Strategi ini berdasarkan kepada penunjuk MACD untuk memberi isyarat, menggunakan stop loss dinamik ATR yang menyesuaikan diri. Ia mempunyai ciri-ciri yang boleh dikawal risiko dan mudah digunakan. Tetapi isyarat MACD mudah disalahpahami, dan mekanisme stop loss perlu terus dioptimumkan. Secara keseluruhan, ia boleh menjadi sistem perdagangan yang lebih stabil dengan mengikuti trend dengan menyesuaikan parameter, mengoptimumkan strategi stop loss dan sebagainya.

Kod 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)