Strategi ini adalah versi multi-frame dari strategi stop loss trailing sederhana saya sebelumnya. strategi sebelumnya hanya menggunakan stop loss trailing dasar untuk memasuki posisi. itu bekerja cukup baik jadi saya mencoba untuk memperbaikinya. saya berpikir apa yang akan terjadi jika saya menggunakan ATR trailing stop loss yang sama pada jangka waktu yang berbeda dan menggabungkannya menjadi satu sinyal.
Dalam strategi ini, Anda hanya dapat menggunakan stop ATR dan memilih 3 timeframe lebih tinggi lainnya selain timeframe saat ini. Stop loss trailing dari semua timeframe ini akan digambarkan pada grafik. Masukkan posisi panjang jika semua 4 timeframe setuju pada sinyal panjang. Tutup posisi panjang ketika setidaknya 2 timeframe tidak setuju pada sinyal panjang. Logika untuk posisi pendek sama.
Inti dari strategi ini terletak pada trailing stop loss dan trend following. Trailing stop loss digunakan untuk mengatur level stop loss berdasarkan nilai ATR, yang dapat secara efektif menghindari stop loss terpukul. Trend following menentukan entry berdasarkan mengamati arah trend di berbagai timeframe.
Secara khusus, strategi pertama menghitung nilai ATR pada jangka waktu yang berbeda dan menetapkan jarak stop loss. Kemudian menghasilkan sinyal panjang / pendek ketika harga melanggar level stop loss. Jika sinyal dari beberapa jangka waktu setuju, posisi akan diambil. Setelah itu, teruslah melacak tingkat stop loss per arah tren. Jika sinyal dari persentase tertentu dari jangka waktu terbalik, tutup posisi.
Dengan menggabungkan penilaian tren di periode yang berbeda, breakout palsu dapat disaring secara efektif.
Solusi:
Strategi dapat dioptimalkan dalam aspek berikut:
Strategi ini menggabungkan mengikuti tren dan pengendalian risiko melalui stop trailing ATR multi-frame. Dibandingkan dengan stop tunggal, ini mengidentifikasi arah tren dengan lebih jelas; dibandingkan dengan timeframe tunggal, ini menyaring banyak kebisingan. Konfigurasi yang tepat pada parameter stop dan timeframe adalah kunci untuk mencapai hasil terbaik. Ini cocok untuk investor yang dapat mentolerir penarikan tertentu dan memberikan pengembalian yang stabil. Ada juga ruang tambahan untuk peningkatan dan ekspansibilitas. Ini adalah ide strategi yang sangat menjanjikan.
/*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)