Strategi Pengimbangan Trend MACD

Penulis:ChaoZhang, Tarikh: 2023-10-17 16:15:53
Tag:

img

Ringkasan

Ini adalah strategi trend berikut yang mengenal pasti arah bullish dan bearish menggunakan penunjuk MACD. Ia menjana garis utama MACD dengan mengira perbezaan antara purata bergerak cepat dan perlahan. Strategi ini menggunakan salib emas garis utama MACD dan garis isyarat untuk menjana isyarat beli, dan salib kematian untuk menjana isyarat jual, mencapai penjejakan trend yang seimbang.

Logika Strategi

Kod pertama menetapkan jangka masa backtesting untuk menguji prestasi sejarah strategi.

Indikator MACD kemudiannya dikira, termasuk tetapan panjang untuk purata bergerak pantas, purata bergerak perlahan, dan purata bergerak MACD. Garis pantas bertindak balas lebih sensitif dan garis perlahan bertindak balas lebih mantap. Perbezaannya membentuk garis utama MACD, yang kemudiannya dilansir oleh purata bergerak untuk membentuk garis isyarat MACD. Apabila perbezaan melintasi di atas garis sifar, isyarat menaik dihasilkan. Apabila melintasi di bawah, isyarat menurun dihasilkan.

Berdasarkan isyarat menaik dan menurun, rakam kali terakhir isyarat dihasilkan. Apabila garis cepat dan perlahan bersilang, mengesahkan dan merakam isyarat beli / jual, maka kedudukan boleh dibuka.

Selepas memasuki kedudukan, terus-menerus mengesan harga tertinggi dan terendah kedudukan. Tetapkan peratusan stop loss, apabila kerugian mencapai peratusan ini, keluar dengan stop loss.

Kelebihan

  1. Indikator MACD dapat mengenal pasti trend dengan berkesan dan merupakan salah satu penunjuk teknikal klasik.

  2. Perbezaan antara purata bergerak cepat dan perlahan boleh menangkap pergerakan harga dan perubahan arah pada peringkat awal.

  3. Kesan penapisan purata bergerak membantu menapis beberapa isyarat palsu.

  4. Strategi ini menggabungkan mekanisme stop loss untuk mengawal risiko.

Risiko

  1. MACD cenderung menghasilkan isyarat palsu dengan ruang pengoptimuman yang terhad.

  2. Penempatan stop loss yang tidak betul boleh terlalu aktif atau konservatif, memerlukan pengoptimuman individu di seluruh produk.

  3. Ukuran kedudukan tetap boleh dengan mudah membawa kepada leverage yang berlebihan, pertimbangkan saiz kedudukan berdasarkan saiz akaun.

  4. Rasional untuk jangka masa backtest perlu disahkan untuk mengelakkan pemasangan berlebihan.

Pengoptimuman

  1. Mengoptimumkan kombinasi purata bergerak pantas dan perlahan untuk mencari parameter terbaik yang sesuai dengan produk yang berbeza.

  2. Tambah penunjuk lain seperti lilin, Bollinger Bands, RSI untuk menapis isyarat.

  3. Menilai tahap stop loss yang berbeza berdasarkan pengeluaran, nisbah Sharpe.

  4. Terokai teknik stop loss seperti trailing stop loss, limit order.

  5. Uji saiz kedudukan dinamik berdasarkan ekuiti, turun naik.

Kesimpulan

Strategi penyeimbangan trend MACD adalah berdasarkan penunjuk MACD klasik. Ia mempunyai keupayaan untuk menangkap momentum harga dengan sensitif dan boleh disesuaikan dengan baik dengan produk yang berbeza melalui pengoptimuman parameter. Penambahbaikan lanjut pada isyarat penapisan, teknik hentian kerugian dan saiz kedudukan dinamik dapat terus meningkatkan kestabilan dan keuntungan.


/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

/////////////// Component Code Start ///////////////
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)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true

///////////////  MACD Component - Default settings for one day. /////////////// 
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12)  // 12 for 4hr

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

long = crossover(delta, 0) 
short = crossunder(delta, 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 = 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 = 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 = 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])

sl_inp = input(5.0, title='Stop Loss %', type=float)/100

/////////////// Strategy Component /////////////// 
// Strategy Entry
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long_signal)
    strategy.entry("Short Entry", strategy.short, when=short_signal)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy SL Exit
if testPeriod()
    strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
    strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)

//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)

Lebih lanjut