Sumber daya yang dimuat... Pemuatan...

Strategi Pengimbangan Tren MACD

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

img

Gambaran umum

Ini adalah strategi mengikuti tren yang mengidentifikasi arah bullish dan bearish menggunakan indikator MACD. Ini menghasilkan garis utama MACD dengan menghitung perbedaan antara rata-rata bergerak cepat dan lambat. Strategi ini menggunakan salib emas dari garis utama MACD dan garis sinyal untuk menghasilkan sinyal beli, dan salib kematian untuk menghasilkan sinyal jual, mencapai pelacakan tren yang seimbang.

Logika Strategi

Kode pertama menetapkan jangka waktu backtesting untuk menguji kinerja historis strategi.

Indikator MACD kemudian dihitung, termasuk pengaturan panjang untuk rata-rata bergerak cepat, rata-rata bergerak lambat, dan rata-rata bergerak MACD. Garis cepat bereaksi lebih sensitif dan garis lambat bereaksi lebih stabil. Perbedaannya membentuk garis utama MACD, yang kemudian dihaluskan oleh rata-rata bergerak untuk membentuk garis sinyal MACD. Ketika perbedaan melintasi di atas garis nol, sinyal bullish dihasilkan. Ketika melintasi di bawah, sinyal bearish dihasilkan.

Berdasarkan sinyal bullish dan bearish, catat terakhir kali sinyal dihasilkan. Ketika garis cepat dan lambat bersilang, konfirmasi dan catat sinyal beli/jual, maka posisi dapat dibuka.

Setelah memasuki posisi, terus melacak harga tertinggi dan terendah dari posisi.

Keuntungan

  1. Indikator MACD dapat secara efektif mengidentifikasi tren dan merupakan salah satu indikator teknis klasik.

  2. Perbedaan antara rata-rata bergerak cepat dan lambat dapat menangkap awal momentum harga dan perubahan arah.

  3. Efek penyaringan rata-rata bergerak membantu menyaring beberapa sinyal palsu.

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

Risiko

  1. MACD cenderung menghasilkan sinyal palsu dengan ruang optimasi terbatas.

  2. Penempatan stop loss yang tidak benar dapat terlalu aktif atau konservatif, yang membutuhkan optimasi individu di seluruh produk.

  3. Ukuran posisi tetap dapat dengan mudah menyebabkan leverage yang berlebihan, pertimbangkan ukuran posisi berdasarkan ukuran akun.

  4. Alasan untuk jangka waktu backtest perlu divalidasi untuk mencegah overfit.

Optimalisasi

  1. Mengoptimalkan kombinasi rata-rata bergerak cepat dan lambat untuk menemukan parameter terbaik yang sesuai dengan produk yang berbeda.

  2. Tambahkan indikator lain seperti candlesticks, Bollinger Bands, RSI untuk menyaring sinyal.

  3. Evaluasi tingkat stop loss yang berbeda berdasarkan drawdown, rasio Sharpe.

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

  5. Uji ukuran posisi dinamis berdasarkan ekuitas, volatilitas.

Kesimpulan

Strategi keseimbangan tren MACD didasarkan pada indikator MACD klasik. Ini memiliki kemampuan untuk menangkap momentum harga secara sensitif dan dapat disesuaikan dengan baik dengan produk yang berbeda melalui optimasi parameter. Peningkatan lebih lanjut pada sinyal penyaringan, teknik stop loss dan ukuran posisi dinamis dapat terus meningkatkan stabilitas dan profitabilitas.


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