
Strategi momentum breakout adalah strategi perdagangan kuantitatif yang mengikuti tren pasar. Strategi ini menangkap tren garis tengah pasar dengan menghitung indikator dinamika harga historis, menilai tren dan intensitas pergerakan harga pasar, untuk menangkap tren garis tengah pasar. Strategi ini berlaku untuk pasar dengan tren yang jelas, dan dapat menghasilkan keuntungan tambahan.
Strategi ini didasarkan pada indikator momentum. Indikator momentum adalah harga penutupan siklus saat ini dikurangi dengan harga penutupan sebelum siklus N. Ketika harga penutupan garis K terbaru lebih tinggi dari sebelum siklus N, momentum adalah positif, menunjukkan momentum naik; Ketika harga penutupan garis K terbaru lebih rendah dari sebelum siklus N, momentum adalah negatif, menunjukkan momentum turun.
Strategi pertama menghitung dinamika dengan panjang 18 siklus, yaitu harga penutupan saat ini dikurangi dengan harga penutupan sebelum 18 siklus, untuk mendapatkan mom0 ≠. Kemudian menghitung dinamika satu siklus mom0 untuk mendapatkan mom1 ≠.
Ketika mom0>0 dan mom1>0 menghasilkan sinyal melakukan banyak, ini menunjukkan bahwa harga naik dengan momentum yang kuat; Ketika mom0 dan mom1 menghasilkan sinyal melakukan short, ini menunjukkan bahwa harga turun dengan momentum yang kuat.
Strategi akan mencatat waktu sinyal over dan under terakhir, memegang posisi over ketika waktu sinyal over lebih besar dari waktu sinyal under, memegang posisi under ketika waktu sinyal under lebih besar dari waktu sinyal under.
Strategi ini memiliki keuntungan sebagai berikut:
Strategi yang jelas dan sederhana, mudah dipahami, cocok untuk pemula dalam trading kuantitatif.
Indikator momentum mampu menangkap tren dan intensitas pasar, melacak tren garis tengah dan panjang memiliki tingkat kemenangan yang tinggi.
Dengan menggunakan filter dua kali lipat, dapat disaring sebagian dari kerusakan yang disebabkan oleh penembusan palsu.
Setelah sinyal perdagangan muncul, posisi tren akan dibuat dan keuntungan tambahan akan diperoleh dari tren.
Pengunduran diri yang tepat waktu dapat mengontrol kerugian tunggal dan menghindari kerugian yang terlalu besar akibat pembalikan.
Strategi ini juga memiliki beberapa risiko yang perlu diperhatikan:
Penyesuaian jangka pendek dalam perdagangan multihead menyebabkan stop loss exit, tidak dapat menangkap perdagangan seluruh siklus. Anda dapat dengan tepat melonggarkan jangkauan stop loss.
Seringnya pembukaan posisi dalam situasi yang tidak stabil dapat meningkatkan biaya transaksi dan kehilangan slippage. Kondisi penyaringan dapat dilepaskan secara tepat dan mengurangi frekuensi transaksi.
Setelah trend reversal masih memegang posisi arah asli menyebabkan kerugian meluas. Dapat dikombinasikan dengan indikator tren untuk menilai trend reversal.
Setting parameter yang tidak tepat dapat menyebabkan sinyal perdagangan yang salah atau menghasilkan sinyal yang salah. Parameter perlu disesuaikan untuk pasar yang berbeda.
Strategi ini dapat dioptimalkan dalam beberapa hal:
Optimalkan parameter momentum, menghitung panjang momentum untuk siklus yang berbeda dan penyesuaian pasar, dan meningkatkan kualitas sinyal.
Menambahkan filter untuk indikator lain seperti MACD, KD, dan lain-lain untuk menghindari kerugian akibat pembalikan tren.
Optimalkan strategi stop loss, trading trend dengan stop loss yang lebih longgar; non-trending market dengan stop loss yang lebih ketat.
Meningkatkan strategi manajemen posisi, mengurangi posisi di luar tren; meningkatkan posisi di tren untuk mendapatkan lebih banyak keuntungan.
Optimalkan parameter untuk varietas yang berbeda dan tingkatkan adaptasi parameter.
Menambahkan algoritma pembelajaran mesin untuk mengoptimalkan parameter strategi secara dinamis.
Overall adalah strategi pelacakan tren yang sederhana dan intuitif. Ini dapat secara efektif menangkap tren garis tengah pasar, dan mendapatkan keuntungan yang lebih baik dalam situasi tren. Selain itu, perlu memperhatikan kontrol risiko, mengoptimalkan strategi stop loss, dan membantu menilai tren dengan indikator lain. Dengan terus mengoptimalkan, strategi ini dapat dibuat menjadi sistem perdagangan kuantitatif yang menguntungkan secara stabil.
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_0 = input(false, "════════ Test Period ═══════")
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
///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close
momentum(seria, length) =>
mom = seria - seria[length]
mom
mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)
/////////////// Strategy ///////////////
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 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])
/////////////// Stop Losses Long ///////////////
_5 = input(false, "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1l = atr(atrLkbl)
longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]
slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na
/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1s = atr(atrLkbs)
shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]
slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na
_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")
/////////////// Execution ///////////////
if testPeriod()
if useLongs
strategy.entry("L", strategy.long, when=long)
strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
if useShorts
strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
strategy.entry("S", strategy.short, when=short)
if not useShorts
strategy.close("L", when=short)
if not useLongs
strategy.close("S", when=long)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)