Strategi hentian jejak rangka masa berbilang masa


Tarikh penciptaan: 2024-01-08 11:24:24 Akhirnya diubah suai: 2024-01-08 11:24:24
Salin: 0 Bilangan klik: 644
1
fokus pada
1617
Pengikut

Strategi hentian jejak rangka masa berbilang masa

Gambaran keseluruhan

Strategi ini adalah versi pelbagai kerangka masa strategi simple tracking stop loss yang saya terbitkan sebelum ini. Strategi sebelum ini hanya menggunakan tracking stop loss asas untuk memasuki kedudukan. Ia berfungsi dengan baik, jadi saya cuba membuat beberapa penambahbaikan padanya.

Dalam strategi ini, anda boleh hanya menggunakan ATR stop loss dan memilih 3 lagi time frame yang lebih tinggi, dan juga time frame semasa. Tracking stop loss pada time frame ini akan digambarkan pada carta. Jika semua 4 time frame mengeluarkan isyarat multihead, masuk lebih banyak.

Prinsip Strategi

Inti strategi ini adalah untuk mengesan halangan dan trend mengikut. Tracking halangan digunakan untuk menetapkan titik berhenti, dan berdasarkan nilai ATR yang dikira, ia dapat dengan berkesan mengelakkan halangan daripada ditembusi. Trend mengikut adalah untuk membuat keputusan masuk dengan melihat arah trend pada bingkai masa yang berbeza.

Khususnya, strategi pertama mengira nilai ATR pada pelbagai bingkai masa dan menetapkan jarak berhenti. Kemudian, apabila harga memutuskan untuk menembusi titik berhenti, ia akan memberi isyarat lebih atau kurang. Jika isyarat pada beberapa bingkai masa adalah sama, ia akan masuk.

Dengan menggabungkan penilaian trend dari pelbagai kitaran, anda dapat menyaring penembusan palsu dengan berkesan. Pada masa yang sama, penjejakan hentian boleh mengunci keuntungan dan mengawal risiko dengan berkesan.

Kelebihan Strategik

  1. Menggunakan penghakiman jangka masa berbilang untuk menyaring kebisingan dan mengenal pasti arah trend
  2. ATR menjejaki hentian yang boleh menyesuaikan jarak hentian secara dinamik untuk mengurangkan kebarangkalian tertimbang
  3. Gabungan trend dan pengurusan hentian, kedua-dua mengikut trend dan hentian tepat pada masanya
  4. Parameter yang lebih sedikit, mudah difahami dan disesuaikan

Analisis risiko

  1. ATR Stop Jika parameter yang ditetapkan tidak betul, mungkin terlalu dekat atau jauh dari harga, mudah untuk ditembusi atau berhenti terlalu jauh
  2. Kombinasi pelbagai bingkai masa mungkin tidak berfungsi dengan berkesan atau membuat keputusan yang salah jika parameter tidak ditetapkan dengan betul
  3. Parameter Hentikan Kerosakan dan Parameter Rangka Masa perlu dikonfigurasikan secara serentak, jika tidak, anda mungkin tidak dapat mencapai kesan yang optimum

Penyelesaian:

  1. Uji ulang kombinasi parameter dan varieti yang berbeza untuk mencari parameter terbaik
  2. Mengoptimumkan perkadaran dan kuantiti jangka masa untuk memastikan trend yang boleh dipercayai
  3. Menyesuaikan kelipatan ATR untuk mencari keseimbangan antara stop loss yang tidak ditembusi dan jarak yang tidak terlalu jauh

Arah pengoptimuman

Strategi ini boleh dioptimumkan dengan:

  1. Meningkatkan atau mengurangkan jumlah bingkai masa untuk mencari kombinasi bingkai yang menentukan trend terbaik
  2. Uji perkalian ATR yang berbeza untuk menentukan jarak penghentian yang optimum
  3. Menambah mekanisme kemasukan semula untuk membina lebih banyak kedudukan jika trend berterusan
  4. Penapisan masa masuk dalam kombinasi dengan penunjuk lain, seperti penunjuk kuantiti dan harga
  5. Dioptimumkan untuk parameter yang berbeza

ringkaskan

Strategi ini mewujudkan kombinasi organik antara trend mengikuti dan kawalan risiko dengan cara ATR yang mengesan hentian dalam pelbagai jangka masa. Ia dapat menilai arah trend dengan lebih jelas berbanding dengan hentian tunggal; ia menyaring banyak kebisingan berbanding dengan jangka masa tunggal. Parameter hentian dan konfigurasi yang munasabah dalam jangka masa adalah kunci untuk mencapai kesan terbaik.

Kod sumber strategi
/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

////////////
// Inputs //

atr_length = input(14,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)

tf2 = input('120', title = "TF2", type = input.string)
tf3 = input('180', title = "TF3", type = input.string)
tf4 = input('240', title = "TF4", type = input.string)

// BACKTESTING RANGE
// From Date Inputs
fromDay   = input(defval = 1,    title = "From Day",   minval = 1, maxval = 31)
fromMonth = input(defval = 1,    title = "From Month", minval = 1, maxval = 12)
fromYear  = input(defval = 2016, title = "From Year",  minval = 1970)
 
// To Date Inputs
toDay   = input(defval = 1,    title = "To Day",   minval = 1, maxval = 31)
toMonth = input(defval = 1,    title = "To Month", minval = 1, maxval = 12)
toYear  = input(defval = 2100, title = "To Year",  minval = 1970)
 
// Calculate start/end date and time condition
startDate  = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear,   toMonth,   toDay,   00, 00)

time_cond = time >= startDate and time <= finishDate

//////////////////
// CALCULATIONS //


tsl() => 
    // SL values
    sl_val = atr_mult * atr(atr_length)
     
    // Init Variables
    pos         = 0
    trailing_sl = 0.0
    
    // Signals
    long_signal  = nz(pos[1]) !=  1 and high > nz(trailing_sl[1])
    short_signal = nz(pos[1]) != -1 and low  < nz(trailing_sl[1]) 
    
    // Calculate SL
    trailing_sl := short_signal     ? high + sl_val : 
                   long_signal      ? low  - sl_val : 
                   nz(pos[1]) ==  1 ? max(low  - sl_val, nz(trailing_sl[1])) :  
                   nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : 
                   nz(trailing_sl[1])
                   
    // Position var               
    pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 
    trailing_sl
    
    
trailing_sl1 = tsl()
trailing_sl2 = security(syminfo.tickerid, tf2, tsl())
trailing_sl3 = security(syminfo.tickerid, tf3, tsl())
trailing_sl4 = security(syminfo.tickerid, tf4, tsl())

pos1 = 0
pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1])

pos2 = 0
pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1])

pos3 = 0
pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1])

pos4 = 0
pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1])

total_pos = pos1 + pos2 + pos3 + pos4

//////////////
// PLOTINGS //

plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1")
plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25)
plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50)
plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75)

//////////////
// STRATEGY //

//strategy.entry("long",  true,  stop = trailing_sl1)
//strategy.entry("short", false, stop = trailing_sl1)

strategy.entry("long",    true, when = total_pos ==  4)
strategy.entry("short",  false, when = total_pos == -4)

strategy.close("long",  when = total_pos <= 0)
strategy.close("short", when = total_pos >= 0)