
Strategi ini adalah versi pelbagai kerangka masa strategi simple tracking stop loss yang saya terbitkan sebelum ini. Strategi sebelum ini hanya menggunakan tracking stop loss asas untuk memasuki kedudukan. Ia berfungsi dengan baik, jadi saya cuba membuat beberapa penambahbaikan padanya.
Dalam strategi ini, anda boleh hanya menggunakan ATR stop loss dan memilih 3 lagi time frame yang lebih tinggi, dan juga time frame semasa. Tracking stop loss pada time frame ini akan digambarkan pada carta. Jika semua 4 time frame mengeluarkan isyarat multihead, masuk lebih banyak.
Inti strategi ini adalah untuk mengesan halangan dan trend mengikut. Tracking halangan digunakan untuk menetapkan titik berhenti, dan berdasarkan nilai ATR yang dikira, ia dapat dengan berkesan mengelakkan halangan daripada ditembusi. Trend mengikut adalah untuk membuat keputusan masuk dengan melihat arah trend pada bingkai masa yang berbeza.
Khususnya, strategi pertama mengira nilai ATR pada pelbagai bingkai masa dan menetapkan jarak berhenti. Kemudian, apabila harga memutuskan untuk menembusi titik berhenti, ia akan memberi isyarat lebih atau kurang. Jika isyarat pada beberapa bingkai masa adalah sama, ia akan masuk.
Dengan menggabungkan penilaian trend dari pelbagai kitaran, anda dapat menyaring penembusan palsu dengan berkesan. Pada masa yang sama, penjejakan hentian boleh mengunci keuntungan dan mengawal risiko dengan berkesan.
Penyelesaian:
Strategi ini boleh dioptimumkan dengan:
Strategi ini mewujudkan kombinasi organik antara trend mengikuti dan kawalan risiko dengan cara ATR yang mengesan hentian dalam pelbagai jangka masa. Ia dapat menilai arah trend dengan lebih jelas berbanding dengan hentian tunggal; ia menyaring banyak kebisingan berbanding dengan jangka masa tunggal. Parameter hentian dan konfigurasi yang munasabah dalam jangka masa adalah kunci untuk mencapai kesan terbaik.
/*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)