Strategi Pembalikan Kerugian Stop Trailing

Penulis:ChaoZhang, Tarikh: 2023-12-01 13:41:41
Tag:

img

Ringkasan

Ini adalah strategi yang sangat mudah. Ia hanya terdiri daripada satu stop loss yang tertinggal. Apabila stop loss dicetuskan, kedudukan ditukar dan stop loss yang tertinggal ditetapkan untuk kedudukan baru.

Logika Strategi

Strategi ini dibina berdasarkan salah satu daripada tiga jenis stop loss: peratus stop loss, ATR stop loss, stop loss mutlak.

Secara khusus, strategi ini mula-mula mengira nilai stop loss berdasarkan jenis stop loss yang dipilih. Ia kemudian memeriksa isyarat masuk, pergi lama apabila tinggi di atas harga stop loss sebelumnya dan pergi pendek apabila rendah di bawah harga stop loss sebelumnya. Selepas memasuki, ia terus mengemas kini harga stop loss untuk mengikuti perubahan harga. Harga stop loss panjang adalah rendah dikurangkan nilai stop loss, harga stop loss pendek adalah tinggi ditambah nilai stop loss.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah kesederhanaannya, yang memerlukan penjejakan hanya satu stop loss tanpa perlu mempertimbangkan pilihan titik masuk dan keluar.

Berbanding dengan stop loss tetap, stop loss yang digunakan dapat mengunci keuntungan yang lebih besar sambil juga mengurangkan kebarangkalian stop loss yang dipukul.

Analisis Risiko

Risiko utama strategi ini mungkin berasal dari penentuan nilai stop loss yang tidak betul. Nilai stop loss yang terlalu besar boleh menyebabkan kerugian yang diperbesar, sementara nilai yang terlalu kecil boleh menyebabkan pemicu stop loss yang kerap. Ini memerlukan pengoptimuman adaptif berdasarkan keadaan pasaran.

Risiko lain adalah penilaian arah yang tidak tepat selepas pemicu stop loss apabila membalikkan kedudukan, sehingga kehilangan peluang pembalikan harga atau meningkatkan kerugian.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Tambah pertimbangan trend untuk mengelakkan perdagangan terhadap trend
  2. Mengoptimumkan pengiraan nilai stop loss untuk menjadikannya lebih dinamik mengesan pasaran
  3. Meningkatkan pengesahan pecah untuk isyarat pembalikan kemungkinan yang lebih tinggi
  4. Menggabungkan ukuran turun naik untuk mencari masa pembalikan yang terbaik

Kesimpulan

Strategi ini merealisasikan keuntungan melalui mekanisme stop loss yang mudah dan mudah difahami oleh pemula. Berbanding dengan strategi stop loss tradisional, ia menambah kedudukan pembalikan pemicu post stop loss untuk memperoleh keuntungan tambahan. Dengan ujian dan pengoptimuman yang berterusan, ia boleh menjadi program kuantitatif yang sangat praktikal.


/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

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

sl_type    = input("%", options = ["%", "ATR", "Absolute"])

sl_perc    = input(4,     title = "% SL",        type = input.float)
atr_length = input(10,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)
sl_absol   = input(10,    title = "Absolute SL", type = input.float)

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

// SL values
sl_val = sl_type == "ATR"      ? atr_mult * atr(atr_length) : 
         sl_type == "Absolute" ? sl_absol : 
         close * sl_perc / 100
         
// 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]) 

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

plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)

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

if (time_cond and pos != 1)
    strategy.entry("long",  true, stop = trailing_sl)
  
if (time_cond and pos != -1) 
    strategy.entry("short", false, stop = trailing_sl)

Lebih lanjut