Momentum Breakout Strategi

Penulis:ChaoZhang, Tanggal: 2023-11-15 11:09:21
Tag:

img

Gambaran umum

Strategi momentum breakout adalah strategi perdagangan kuantitatif yang mengikuti tren pasar. Strategi ini menghitung indikator momentum berdasarkan harga historis untuk menentukan tren dan kekuatan pergerakan harga pasar, bertujuan untuk menangkap tren jangka menengah hingga panjang di pasar. Strategi ini panjang ketika momentum melintasi dari negatif ke positif, dan pendek ketika momentum melintasi dari positif ke negatif.

Logika Strategi

Inti dari strategi ini didasarkan pada indikator momentum. Indikator momentum adalah harga penutupan periode saat ini dikurangi harga penutupan N periode yang lalu. Ketika penutupan bar terakhir lebih tinggi dari N periode yang lalu, momentum positif, menunjukkan tren naik; ketika penutupan bar terakhir lebih rendah dari N periode yang lalu, momentum negatif, menunjukkan tren menurun.

Strategi pertama menghitung momentum periode 18, yang merupakan penutupan saat ini dikurangi penutupan 18 periode yang lalu, disimpan di mom0. Kemudian menghitung momentum periode 1 mom0, disimpan di mom1.

Ketika mom0>0 dan mom1>0, sinyal panjang dihasilkan, yang menunjukkan momentum naik yang kuat.

Strategi ini mencatat waktu sinyal panjang dan pendek terbaru. Ketika waktu sinyal panjang lebih baru dari waktu sinyal pendek, ia memegang posisi panjang. Ketika waktu sinyal pendek lebih baru dari waktu sinyal panjang, ia memegang posisi pendek.

Analisis Keuntungan

Keuntungan dari strategi ini meliputi:

  1. Logikanya sederhana dan mudah dimengerti, cocok untuk pemula dalam perdagangan kuantitatif.

  2. Indikator momentum dapat menangkap tren pasar dan kekuatan dengan tingkat kemenangan yang relatif tinggi ketika melacak tren jangka menengah hingga panjang.

  3. Filter momentum ganda membantu menghindari kerugian dari kebocoran palsu.

  4. Ini menambahkan posisi setelah sinyal untuk menetapkan posisi tren dan mencapai hasil yang berlebihan selama pasar tren.

  5. Stop loss exit tepat waktu mengendalikan ukuran kerugian perdagangan tunggal dan menghindari kerugian besar dari pembalikan.

Analisis Risiko

Beberapa risiko dari strategi ini untuk dicatat:

  1. Stop loss exit selama pullback jangka pendek dalam tren naik, tidak dapat menangkap seluruh tren.

  2. Sering membuka dan menutup perdagangan di pasar yang berbeda meningkatkan biaya dari komisi dan slippage.

  3. Tetap memegang di arah awal setelah pembalikan tren memperbesar kerugian.

  4. Pengaturan parameter yang tidak benar menyebabkan sinyal hilang atau menghasilkan sinyal palsu.

Arahan Optimasi

Beberapa cara untuk mengoptimalkan strategi:

  1. Mengoptimalkan parameter momentum dengan menyesuaikan perhitungan panjang momentum berdasarkan jangka waktu dan pasar.

  2. Tambahkan filter indikator lain seperti MACD, KD untuk menghindari kerugian dari pembalikan tren.

  3. Mengoptimalkan strategi stop loss dengan memperluas stop di tren dan memperketat stop di pasar non-trend.

  4. Tambahkan aturan ukuran posisi untuk mengurangi ukuran di non-trend dan meningkatkan ukuran dalam tren untuk menangkap lebih banyak keuntungan.

  5. Mengoptimalkan parameter secara terpisah untuk produk yang berbeda untuk meningkatkan kemampuan beradaptasi.

  6. Menggabungkan algoritma pembelajaran mesin untuk mengoptimalkan parameter secara dinamis.

Kesimpulan

Strategi Momentum Breakout adalah sistem trend berikut yang intuitif. Ini dapat secara efektif menangkap tren jangka menengah hingga panjang dan mencapai keuntungan yang baik selama pasar tren. Manajemen risiko melalui pengoptimalan stop loss dan menggunakan indikator lain untuk menilai tren juga penting. Dengan pengoptimalan berkelanjutan, strategi ini dapat dikembangkan menjadi sistem perdagangan kuantitatif yang menghasilkan keuntungan yang 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)

Lebih banyak