Strategi trailing stop multi-kerangka waktu


Tanggal Pembuatan: 2024-01-08 11:24:24 Akhirnya memodifikasi: 2024-01-08 11:24:24
menyalin: 0 Jumlah klik: 644
1
fokus pada
1617
Pengikut

Strategi trailing stop multi-kerangka waktu

Ringkasan

Strategi ini adalah versi multi-frame dari strategi simple tracking stop loss yang saya terbitkan sebelumnya. Strategi sebelumnya hanya menggunakan tracking stop loss dasar untuk masuk ke posisi.

Dalam strategi ini, Anda hanya dapat menggunakan ATR stop loss dan memilih 3 frame waktu yang lebih tinggi lainnya, serta frame waktu saat ini. Tracking stop loss pada frame waktu ini akan dipetakan pada grafik. Jika semua 4 frame waktu mengeluarkan sinyal multihead, masuk lebih banyak.

Prinsip Strategi

Inti dari strategi ini adalah untuk melacak stop loss dan trend follow. Tracking stop loss digunakan untuk mengatur stop loss, dan berdasarkan perhitungan nilai ATR, stop loss dapat secara efektif dihindari dari penembusan. Trend follow adalah untuk menentukan entry dengan melihat arah tren pada frame waktu yang berbeda.

Secara khusus, strategi pertama menghitung nilai ATR pada berbagai kerangka waktu dan mengatur jarak stop loss. Kemudian, jika harga memutuskan untuk melakukan sinyal over atau under ketika harga melewati titik stop loss. Jika sinyal pada beberapa kerangka waktu sesuai, maka masuklah.

Dengan mengkombinasikan penilaian tren dari berbagai siklus, Anda dapat secara efektif memfilter false breakout. Sementara melacak stop loss dapat mengunci keuntungan dan secara efektif mengendalikan risiko.

Keunggulan Strategis

  1. Menggunakan penilaian multi-frame waktu untuk menyaring kebisingan dan mengidentifikasi arah tren
  2. ATR melacak stop loss yang dapat secara dinamis menyesuaikan jarak stop loss untuk mengurangi probabilitas terdegradasi
  3. Kombinasi dari trend following dan stop loss management, memungkinkan untuk melakukan Following Trend dan stop loss tepat waktu.
  4. Parameter yang lebih sedikit, mudah dipahami dan disesuaikan

Analisis risiko

  1. Stop loss ATR Jika parameter tidak disetel dengan benar, mungkin terlalu dekat atau jauh dari harga, mudah untuk terobosan atau stop loss jarak terlalu besar
  2. Kombinasi multi-frame timeframe mungkin tidak berfungsi secara efektif atau membuat kesalahan penilaian jika parameternya tidak disetel dengan benar
  3. Anda perlu mengkonfigurasi parameter stop loss dan parameter timeframe secara bersamaan, jika tidak, Anda mungkin tidak akan mencapai hasil yang optimal

Solusi:

  1. Uji ulang kombinasi dan varietas yang berbeda untuk menemukan yang terbaik
  2. Mengoptimalkan proporsi dan kuantitas dari kerangka waktu untuk memastikan penilaian tren yang dapat dipercaya
  3. Mengatur perkalian ATR stop loss untuk menemukan keseimbangan antara stop loss yang tidak ditembus dan jarak yang tidak terlalu besar

Arah optimasi

Strategi ini dapat dioptimalkan dengan cara:

  1. Meningkatkan atau mengurangi jumlah kerangka waktu untuk menemukan kombinasi kerangka waktu yang menentukan tren terbaik
  2. Uji coba berbagai ATR untuk menentukan jarak penghentian yang optimal
  3. Menambahkan mekanisme re-entry untuk membangun lebih banyak posisi jika tren berlanjut
  4. Filter waktu masuk dalam kombinasi dengan indikator lain, seperti indikator kuantitas dan harga.
  5. Optimalisasi untuk parameter varietas yang berbeda

Meringkaskan

Strategi ini melalui multi-frame ATR cara melacak stop loss, mencapai kombinasi organik dari trend mengikuti dan pengendalian risiko. Dibandingkan dengan single stop loss, itu dapat lebih jelas menilai arah tren; dibandingkan dengan single time frame, itu menyaring banyak kebisingan.

Kode 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)