Pembebasan momentum mengenal pasti strategi

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

img

Ringkasan

Strategi ini mengenal pasti stok yang meningkat pesat dan mengambil kedudukan panjang apabila harga memecahkan paras tertinggi baru. Ia menggunakan peratusan tetap mengambil keuntungan untuk mengunci keuntungan. Strategi ini tergolong dalam strategi trend berikut.

Prinsip

Strategi ini terutamanya berdasarkan dua penunjuk:

  1. RSI pantas: Ia mengira kenaikan dan kejatuhan 3 bar baru-baru ini untuk menilai momentum harga. Apabila RSI pantas di bawah 10, ia dianggap status oversold.

  2. Penapis badan: Ia mengira saiz badan purata 20 bar terakhir. Apabila saiz badan lebih besar daripada 2.5 kali daripada saiz badan purata, ia dianggap penembusan yang sah.

Apabila RSI cepat di bawah 10 dan penapis badan sah, kedudukan panjang akan dibuka. Selepas itu, keuntungan tetap diambil sebanyak 20% ditetapkan. Apabila harga melebihi harga terbuka * (1 + mengambil peratusan keuntungan), kedudukan akan ditutup.

Kelebihan strategi ini ialah ia dapat menangkap peluang pecah pada permulaan trend. RSI yang cepat menilai tahap oversold dan penapis badan mengelakkan pecah palsu. Peratusan tetap mengambil keuntungan mengunci keuntungan setiap perdagangan dan terus menangkap trend.

Analisis Kelebihan

Kelebihan strategi ini:

  1. RSI pantas mengenal pasti tahap oversold dan meningkatkan ketepatan kemasukan.

  2. Penapis badan mengelakkan kebocoran palsu yang disebabkan oleh turun naik.

  3. Peratusan tetap mengambil keuntungan mencapai keuntungan yang stabil dan menangkap trend.

  4. Logiknya mudah dan jelas, mudah difahami dan dilaksanakan.

  5. Struktur kod yang elegan dengan kebolehluasan yang besar, mudah dioptimumkan.

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

Analisis Risiko

Beberapa risiko yang perlu diperhatikan:

  1. Tiada mekanisme stop loss, risiko peningkatan kerugian.

  2. Tahap mengambil keuntungan yang tidak betul boleh menyebabkan keluar terlalu awal atau terlalu jauh.

  3. Kerugian kecil berturut-turut mungkin berlaku di pasaran yang bergelombang.

  4. Kos pembiayaan tidak dipertimbangkan, pulangan sebenar mungkin lebih rendah.

  5. Pengoptimuman parameter yang tidak mencukupi di seluruh produk yang berbeza.

Arahan pengoptimuman

Beberapa aspek boleh dioptimumkan:

  1. Tambah stop loss untuk mengawal kerugian perdagangan tunggal.

  2. Mengoptimumkan dinamik mengambil keuntungan untuk mengikuti trend.

  3. Tingkatkan logik untuk meningkatkan ketepatan entri.

  4. Tambah modul saiz kedudukan untuk mengoptimumkan penggunaan modal.

  5. Tambah modul pengoptimuman parameter untuk produk yang berbeza.

  6. Tambah penapis untuk mengelakkan kerugian dalam pasaran bergelombang.

  7. Pertimbangkan untuk menambah pengurusan kos purata.

Kesimpulan

Ringkasnya, ini adalah strategi trend berikut yang elegan dan mudah. Ia menggunakan RSI cepat untuk mengenal pasti tahap oversold, penapis badan untuk mengesahkan penembusan yang sah, dan peratusan tetap mengambil keuntungan untuk menjana pulangan yang stabil. Walaupun terdapat ruang untuk pengoptimuman, strategi ini responsif dan sesuai untuk pasaran yang berubah dengan cepat, menjadikannya strategi perdagangan yang sangat praktikal. Dengan pengoptimuman berterusan, ia boleh menjadi strategi jangka panjang yang kukuh.


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