Momentum Breakout Mengidentifikasi Strategi

Penulis:ChaoZhang, Tanggal: 2023-11-02 14:39:22
Tag:

img

Gambaran umum

Strategi ini mengidentifikasi saham yang meningkat dengan cepat dan mengambil posisi panjang ketika harga menembus level tertinggi baru.

Prinsip

Strategi ini terutama didasarkan pada dua indikator:

  1. RSI cepat: Menghitung kenaikan dan penurunan 3 bar baru-baru ini untuk menilai momentum harga.

  2. Filter tubuh: Ini menghitung ukuran tubuh rata-rata 20 bar terakhir. Ketika ukuran tubuh lebih besar dari 2,5 kali ukuran tubuh rata-rata, itu dianggap sebagai penyemburan yang valid.

Ketika RSI cepat di bawah 10 dan filter body berlaku, posisi panjang akan dibuka. Setelah itu, keuntungan tetap 20% ditetapkan. Ketika harga melebihi harga terbuka * (1 + persentase keuntungan), posisi akan ditutup.

Keuntungan dari strategi ini adalah dapat menangkap peluang breakout pada awal tren. RSI cepat menilai tingkat oversold dan filter tubuh menghindari breakout palsu. Persentase tetap mengambil keuntungan mengunci keuntungan dari setiap perdagangan dan terus menangkap tren.

Analisis Keuntungan

Keuntungan dari strategi ini:

  1. RSI cepat mengidentifikasi tingkat oversold dan meningkatkan akurasi entri.

  2. Filter tubuh mencegah pecah palsu yang disebabkan oleh fluktuasi.

  3. Persentase tetap mengambil keuntungan mencapai keuntungan yang stabil dan menangkap tren.

  4. Logikanya sederhana dan jelas, mudah dimengerti dan diterapkan.

  5. Struktur kode yang elegan dengan ekstensibilitas besar, mudah dioptimalkan.

  6. Pengembalian positif yang stabil dan tingkat kemenangan tinggi dalam backtest.

Analisis Risiko

Beberapa risiko yang perlu diperhatikan:

  1. Tidak ada mekanisme stop loss, risiko peningkatan kerugian.

  2. Tingkat mengambil keuntungan yang tidak tepat dapat menyebabkan keluar prematur atau terlalu dalam.

  3. Kerugian kecil berturut-turut dapat terjadi di pasar yang bergolak.

  4. Biaya pembiayaan tidak dipertimbangkan, pengembalian yang sebenarnya mungkin lebih rendah.

  5. Optimasi parameter yang tidak cukup di berbagai produk.

Arahan Optimasi

Beberapa aspek dapat dioptimalkan:

  1. Tambahkan stop loss untuk mengendalikan kerugian perdagangan tunggal.

  2. Mengoptimalkan dinamis mengambil keuntungan untuk mengikuti tren.

  3. Tingkatkan logik penarikan untuk meningkatkan akurasi entri.

  4. Tambahkan modul ukuran posisi untuk mengoptimalkan penggunaan modal.

  5. Tambahkan modul optimasi parameter untuk produk yang berbeda.

  6. Tambahkan filter untuk menghindari kerugian di pasar bergolak.

  7. Pertimbangkan untuk menambahkan manajemen biaya rata-rata.

Kesimpulan

Singkatnya, ini adalah strategi tren yang elegan dan sederhana. Ini menggunakan RSI cepat untuk mengidentifikasi tingkat oversold, filter tubuh untuk mengkonfirmasi breakout yang valid, dan persentase tetap mengambil keuntungan untuk menghasilkan pengembalian yang stabil. Meskipun ada ruang untuk optimasi, strategi ini responsif dan cocok untuk pasar yang berubah dengan cepat, menjadikannya strategi perdagangan yang sangat praktis. Dengan optimasi berkelanjutan, itu bisa menjadi strategi jangka panjang yang kuat.


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// this is based on https://www.tradingview.com/v/PbQW4mRn/
strategy(title = "ONLY LONG V4 v1", overlay = true, initial_capital = 1000, pyramiding = 1000,
   calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 50, commission_value = 0.075)

//study(title = "ONLY LONG V4 v1", overlay = true)

//Fast RSI
src = close
fastup = rma(max(change(src), 0), 3)
fastdown = rma(-min(change(src), 0), 3)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
body = abs(close - open)
abody = sma(body, 20)

mac = sma(close, 20)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)
up = close < open and len > sma * 2 and min < min[1] and fastrsi < 10 and body > abody * 2.5

// Strategy
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

var bool longCondition = na

longCondition := up == 1 ? 1 : na

// Get the price of the last opened long

var float last_open_longCondition = na

last_open_longCondition := longCondition ? close : nz(last_open_longCondition[1])

// Get the bar time of the last opened long

var int last_longCondition = 0

last_longCondition := longCondition ? time : nz(last_longCondition[1])

// Take profit
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

tp = input(20, "TAKE PROFIT %", type = input.float, minval = 0, step = 0.5)

long_tp = crossover(high, (1+(tp/100))*last_open_longCondition) and not longCondition

// Get the time of the last tp close

var int last_long_tp = na

last_long_tp := long_tp ? time : nz(last_long_tp[1])

Final_Long_tp = long_tp and last_longCondition > nz(last_long_tp[1])

// Count your long conditions

var int sectionLongs = 0

sectionLongs := nz(sectionLongs[1])

var int sectionTPs = 0

sectionTPs := nz(sectionTPs[1])

// Longs Counter

if longCondition
    sectionLongs := sectionLongs + 1
    sectionTPs := 0

if Final_Long_tp
    sectionLongs := 0
    sectionTPs := sectionTPs + 1
    
// Signals
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// Long

// label.new(
//    x = longCondition[1] ? time : na, 
//    y = na, 
//    text = 'LONG'+tostring(sectionLongs), 
//    color=color.lime, 
//    textcolor=color.black,  
//    style = label.style_labelup, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.belowbar,
//    size = size.tiny)
   
// Tp

// label.new(
//    x = Final_Long_tp ? time : na, 
//    y = na, 
//    text = 'PROFIT '+tostring(tp)+'%', 
//    color=color.orange, 
//    textcolor=color.black,  
//    style = label.style_labeldown, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.abovebar,
//    size = size.tiny) 

ltp = iff(Final_Long_tp, (last_open_longCondition*(1+(tp/100))), na), plot(ltp, style=plot.style_cross, linewidth=3, color = color.white, editable = false)

// Backtesting
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

testStartYear = input(2019, "BACKTEST START YEAR", minval = 1, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

strategy.entry("long", strategy.long, when = longCondition and (time >= testPeriodStart))
strategy.exit("TP", "long", limit = (last_open_longCondition*(1+(tp/100))))

// Alerts
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

alertcondition(longCondition[1], title="Long Alert", message = "LONG")
alertcondition(Final_Long_tp, title="Long TP Alert", message = "LONG TP")


Lebih banyak