
Ini adalah strategi yang sangat mudah. Ia hanya terdiri daripada satu tracking stop loss. Apabila stop loss dicetuskan, kedudukan akan dibalikkan dan satu tracking stop loss akan ditetapkan untuk kedudukan baru.
Strategi ini dibina berdasarkan salah satu daripada tiga jenis stop loss: stop loss peratusan, stop loss ATR, dan stop loss mutlak. Apabila stop loss dicetuskan, kedudukan akan dibalikkan dan stop loss pengesanan akan ditetapkan untuk kedudukan baru.
Khususnya, strategi pertama mengira nilai hentian mengikut jenis hentian yang dipilih. Kemudian ia akan menilai sama ada ada ada isyarat untuk meletakkan, iaitu apabila tinggi lebih besar daripada harga hentian sebelumnya, dan rendah lebih kecil daripada harga hentian sebelumnya. Setelah masuk, ia akan mengemas kini harga hentian secara langsung, sehingga ia mengesan perubahan harga.
Kelebihan terbesar strategi ini adalah sangat mudah, hanya perlu mengesan satu stop loss, tidak perlu mempertimbangkan pilihan tempat masuk dan pilihan tempat keluar. Tetapan fleksibel nilai stop loss juga menjadikannya lebih luas.
Berbanding dengan halangan tetap, ia menggunakan tracking stop loss yang dapat mengunci keuntungan yang lebih besar, dan juga mengurangkan kebarangkalian halangan untuk diserang. Setiap kali stop loss dicetuskan, kedudukan reversal dapat menangkap peluang untuk membalikkan harga.
Risiko utama yang mungkin ada dalam strategi ini adalah risiko yang disebabkan oleh penetapan harga berhenti yang tidak betul. Penetapan nilai berhenti yang terlalu besar boleh menyebabkan kerugian meluas; penetapan nilai berhenti yang terlalu kecil boleh menyebabkan berhenti sering dipicu. Ini memerlukan pengoptimuman yang disasarkan mengikut keadaan pasaran.
Risiko lain ialah penilaian arah kedudukan reversal selepas penangguhan tidak tepat, sehingga kehilangan peluang untuk membalikkan harga atau meningkatkan kerugian. Ini memerlukan penilaian trend dan sokongan untuk menentukan masa pembalikan yang terbaik.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Strategi ini menghasilkan keuntungan melalui mekanisme berhenti yang mudah untuk mengesan kerugian, merupakan strategi kuantitatif yang sesuai untuk pemula. Berbanding dengan strategi berhenti tradisional, ia menambah mekanisme untuk memulihkan kedudukan selepas penangguhan yang dicetuskan, dan dengan itu memperoleh keuntungan tambahan. Dengan ujian dan pengoptimuman yang berterusan, strategi ini boleh menjadi prosedur 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)