Strategi Stop Loss Trailing Multi-Timeframe

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

img

Gambaran umum

Strategi ini adalah versi multi-frame dari strategi stop loss trailing sederhana saya sebelumnya. strategi sebelumnya hanya menggunakan stop loss trailing dasar untuk memasuki posisi. itu bekerja cukup baik jadi saya mencoba untuk memperbaikinya. saya berpikir apa yang akan terjadi jika saya menggunakan ATR trailing stop loss yang sama pada jangka waktu yang berbeda dan menggabungkannya menjadi satu sinyal.

Dalam strategi ini, Anda hanya dapat menggunakan stop ATR dan memilih 3 timeframe lebih tinggi lainnya selain timeframe saat ini. Stop loss trailing dari semua timeframe ini akan digambarkan pada grafik. Masukkan posisi panjang jika semua 4 timeframe setuju pada sinyal panjang. Tutup posisi panjang ketika setidaknya 2 timeframe tidak setuju pada sinyal panjang. Logika untuk posisi pendek sama.

Logika Strategi

Inti dari strategi ini terletak pada trailing stop loss dan trend following. Trailing stop loss digunakan untuk mengatur level stop loss berdasarkan nilai ATR, yang dapat secara efektif menghindari stop loss terpukul. Trend following menentukan entry berdasarkan mengamati arah trend di berbagai timeframe.

Secara khusus, strategi pertama menghitung nilai ATR pada jangka waktu yang berbeda dan menetapkan jarak stop loss. Kemudian menghasilkan sinyal panjang / pendek ketika harga melanggar level stop loss. Jika sinyal dari beberapa jangka waktu setuju, posisi akan diambil. Setelah itu, teruslah melacak tingkat stop loss per arah tren. Jika sinyal dari persentase tertentu dari jangka waktu terbalik, tutup posisi.

Dengan menggabungkan penilaian tren di periode yang berbeda, breakout palsu dapat disaring secara efektif.

Keuntungan

  1. Menggunakan beberapa kerangka waktu membantu menyaring kebisingan dan mengidentifikasi arah tren
  2. ATR trailing stop menyesuaikan jarak stop secara dinamis, menurunkan kemungkinan dihentikan
  3. Menggabungkan tren mengikuti dan stop loss manajemen, Anda dapat mengikuti tren dan berhenti di waktu
  4. Beberapa parameter, mudah dipahami dan dioptimalkan

Analisis Risiko

  1. ATR berhenti mungkin terlalu dekat atau terlalu jauh jika parameter tidak diatur dengan benar, rentan terkena atau berhenti jarak terlalu besar
  2. Kombinasi beberapa kerangka waktu mungkin tidak bekerja secara efektif atau menilai salah jika parameter tidak ditetapkan dengan benar
  3. Perlu mengkonfigurasi kedua parameter stop loss dan timeframe dengan benar, jika tidak mungkin tidak mencapai hasil terbaik

Solusi:

  1. Uji berbagai set parameter dan produk untuk menemukan optimal
  2. Optimalkan rasio dan jumlah kerangka waktu untuk memastikan penilaian tren yang dapat diandalkan
  3. Sesuaikan pengganda ATR untuk menyeimbangkan antara tidak terkena dan jarak yang tepat

Arahan Optimasi

Strategi dapat dioptimalkan dalam aspek berikut:

  1. Tambahkan/kurangi jumlah kerangka waktu untuk menemukan kombinasi terbaik untuk penilaian tren
  2. Uji perkalian ATR yang berbeda untuk menentukan jarak pemberhentian optimal
  3. Tambahkan mekanisme re-entry untuk membangun lebih banyak posisi karena tren terus berlanjut
  4. Masukkan filter lain pada sinyal masuk misalnya indikator volume dll
  5. Pengaturan parameter untuk produk yang berbeda

Kesimpulan

Strategi ini menggabungkan mengikuti tren dan pengendalian risiko melalui stop trailing ATR multi-frame. Dibandingkan dengan stop tunggal, ini mengidentifikasi arah tren dengan lebih jelas; dibandingkan dengan timeframe tunggal, ini menyaring banyak kebisingan. Konfigurasi yang tepat pada parameter stop dan timeframe adalah kunci untuk mencapai hasil terbaik. Ini cocok untuk investor yang dapat mentolerir penarikan tertentu dan memberikan pengembalian yang stabil. Ada juga ruang tambahan untuk peningkatan dan ekspansibilitas. Ini adalah ide strategi yang sangat menjanjikan.


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