Strategi Stop Loss Berbilang Jangka Masa

Penulis:ChaoZhang, Tarikh: 2024-01-08 11:24:24
Tag:

img

Ringkasan

Strategi ini adalah versi multi-frame dari strategi stop loss trailing sederhana saya. Strategi sebelumnya hanya menggunakan stop loss trailing asas untuk memasuki kedudukan. Ia berfungsi dengan baik jadi saya cuba memperbaikinya. Saya berfikir apa yang akan berlaku jika saya menggunakan ATR yang sama pada jangka masa yang berbeza dan menggabungkannya menjadi satu isyarat.

Dalam strategi ini, anda hanya boleh menggunakan hentian ATR dan memilih 3 jangka masa yang lebih tinggi selain jangka masa semasa anda. Hentian kehilangan hentian dari semua jangka masa ini akan dicatatkan pada carta. Masukkan kedudukan panjang jika semua 4 jangka masa bersetuju dengan isyarat panjang. Tutup kedudukan panjang apabila sekurang-kurangnya 2 jangka masa tidak bersetuju dengan isyarat panjang. Logik untuk kedudukan pendek adalah sama.

Logika Strategi

Inti strategi ini terletak pada penutupan stop loss dan trend berikut. Penutupan stop loss digunakan untuk menetapkan tahap stop loss berdasarkan nilai ATR, yang secara berkesan dapat mengelakkan stop loss daripada dipukul.

Secara khusus, strategi ini mula-mula mengira nilai ATR pada jangka masa yang berbeza dan menetapkan jarak stop loss. Kemudian ia menghasilkan isyarat panjang / pendek apabila harga memecahkan tahap stop loss. Jika isyarat dari beberapa jangka masa bersetuju, kedudukan akan diambil. Selepas itu, teruskan mengesan tahap stop loss mengikut arah trend. Jika isyarat dari peratusan jangka masa tertentu terbalik, tutup kedudukan.

Dengan menggabungkan pertimbangan trend dalam tempoh yang berbeza, pecah palsu dapat disaring dengan berkesan. Pada masa yang sama, penghentian penguncian keuntungan dan kawalan risiko.

Kelebihan

  1. Menggunakan pelbagai jangka masa membantu menapis bunyi bising dan mengenal pasti arah trend
  2. ATR penghentian belakang menyesuaikan jarak berhenti secara dinamik, mengurangkan kebarangkalian dihentikan
  3. Menggabungkan trend berikut dan pengurusan kehilangan berhenti, anda boleh mengikuti trend dan berhenti keluar pada masa
  4. Beberapa parameter, mudah difahami dan optimum

Analisis Risiko

  1. Hentikan ATR mungkin terlalu dekat atau terlalu jauh jika parameter tidak ditetapkan dengan betul, cenderung untuk dipukul atau berhenti jarak terlalu besar
  2. Gabungan pelbagai jangka masa mungkin tidak berfungsi dengan berkesan atau menilai dengan salah jika parameter tidak ditetapkan dengan betul
  3. Perlu mengkonfigurasi kedua-dua parameter stop loss dan jangka masa dengan betul, jika tidak mungkin tidak mencapai hasil yang terbaik

Penyelesaian:

  1. Uji pelbagai set parameter dan produk untuk mencari optimum
  2. Mengoptimumkan nisbah dan bilangan jangka masa untuk memastikan penilaian trend yang boleh dipercayai
  3. Sesuaikan pengganda ATR untuk keseimbangan antara tidak dipukul dan jarak yang betul

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Tambah/kurangkan bilangan jangka masa untuk mencari kombinasi terbaik untuk penilaian trend
  2. Uji pengganda ATR yang berbeza untuk menentukan jarak berhenti yang optimum
  3. Tambah mekanisme kemasukan semula untuk membina lebih banyak kedudukan kerana trend berterusan
  4. Masukkan penapis lain pada isyarat masuk e.g. penunjuk jumlah dan lain-lain
  5. Penyesuaian parameter untuk produk yang berbeza

Kesimpulan

Strategi ini menggabungkan trend berikut dan kawalan risiko melalui stop trailing ATR pelbagai jangka masa. Berbanding dengan berhenti tunggal, ia mengenal pasti arah trend dengan lebih jelas; berbanding dengan jangka masa tunggal, ia menapis banyak bunyi bising. Konfigurasi yang betul pada parameter berhenti dan jangka masa adalah kunci untuk mencapai hasil yang terbaik. Ia sesuai untuk pelabur yang dapat mentolerir penarikan tertentu dan memberikan pulangan yang stabil.


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


Lebih lanjut