Strategi ini adalah versi multi-frame dari strategi stop loss trailing sederhana saya. Strategi sebelumnya hanya menggunakan stop loss trailing asas untuk memasuki kedudukan. Ia berfungsi dengan baik jadi saya cuba memperbaikinya. Saya berfikir apa yang akan berlaku jika saya menggunakan ATR yang sama pada jangka masa yang berbeza dan menggabungkannya menjadi satu isyarat.
Dalam strategi ini, anda hanya boleh menggunakan hentian ATR dan memilih 3 jangka masa yang lebih tinggi selain jangka masa semasa anda. Hentian kehilangan hentian dari semua jangka masa ini akan dicatatkan pada carta. Masukkan kedudukan panjang jika semua 4 jangka masa bersetuju dengan isyarat panjang. Tutup kedudukan panjang apabila sekurang-kurangnya 2 jangka masa tidak bersetuju dengan isyarat panjang. Logik untuk kedudukan pendek adalah sama.
Inti strategi ini terletak pada penutupan stop loss dan trend berikut. Penutupan stop loss digunakan untuk menetapkan tahap stop loss berdasarkan nilai ATR, yang secara berkesan dapat mengelakkan stop loss daripada dipukul.
Secara khusus, strategi ini mula-mula mengira nilai ATR pada jangka masa yang berbeza dan menetapkan jarak stop loss. Kemudian ia menghasilkan isyarat panjang / pendek apabila harga memecahkan tahap stop loss. Jika isyarat dari beberapa jangka masa bersetuju, kedudukan akan diambil. Selepas itu, teruskan mengesan tahap stop loss mengikut arah trend. Jika isyarat dari peratusan jangka masa tertentu terbalik, tutup kedudukan.
Dengan menggabungkan pertimbangan trend dalam tempoh yang berbeza, pecah palsu dapat disaring dengan berkesan. Pada masa yang sama, penghentian penguncian keuntungan dan kawalan risiko.
Penyelesaian:
Strategi ini boleh dioptimumkan dalam aspek berikut:
Strategi ini menggabungkan trend berikut dan kawalan risiko melalui stop trailing ATR pelbagai jangka masa. Berbanding dengan berhenti tunggal, ia mengenal pasti arah trend dengan lebih jelas; berbanding dengan jangka masa tunggal, ia menapis banyak bunyi bising. Konfigurasi yang betul pada parameter berhenti dan jangka masa adalah kunci untuk mencapai hasil yang terbaik. Ia sesuai untuk pelabur yang dapat mentolerir penarikan tertentu dan memberikan pulangan yang stabil.
/*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)