Diese Strategie ist eine Multi-Zeitrahmen-Version meiner vorherigen einfachen Trailing Stop-Loss-Strategie. Die vorherige Strategie verwendet nur grundlegende Trailing Stop-Loss-Positionen zu betreten. Es funktionierte ziemlich gut, so dass ich versuchte, es zu verbessern. Ich dachte, was passieren würde, wenn ich die gleiche ATR Trailing Stop-Loss auf verschiedenen Zeitrahmen verwenden und kombinieren sie in einem Signal.
In dieser Strategie können Sie nur ATR-Stopps verwenden und zusätzlich zu Ihrem aktuellen Zeitrahmen 3 weitere höhere Zeitrahmen auswählen. Der nachfolgende Stop-Loss aus all diesen Zeitrahmen wird auf dem Chart dargestellt. Geben Sie eine Long-Position ein, wenn alle 4 Zeitrahmen auf Long-Signal übereinstimmen. Schließen Sie Long-Positionen, wenn mindestens 2 Zeitrahmen auf Long-Signal uneins sind. Die Logik für Short-Positionen ist die gleiche.
Der Kern dieser Strategie liegt im Trailing Stop Loss und im Trend Following. Der Trailing Stop Loss wird verwendet, um das Stop Loss-Niveau basierend auf dem ATR-Wert festzulegen, das effektiv verhindern kann, dass der Stop Loss getroffen wird. Trend Following bestimmt den Eintritt basierend auf der Beobachtung der Trendrichtung über verschiedene Zeitrahmen.
Speziell berechnet die Strategie zuerst den ATR-Wert auf verschiedenen Zeitrahmen und setzt die Stop-Loss-Distanz fest. Es erzeugt dann lange/kurze Signale, wenn der Preis durch das Stop-Loss-Niveau bricht. Wenn Signale aus mehreren Zeitrahmen übereinstimmen, wird die Position eingenommen. Danach verfolgt man das Stop-Loss-Niveau pro Trendrichtung. Wenn Signale aus einem bestimmten Prozentsatz der Zeitrahmen umkehren, schließt man die Position.
Durch die Kombination von Trendbeurteilungen über verschiedene Zeiträume hinweg können gefälschte Ausbrüche effektiv herausgefiltert werden.
Lösungen:
Die Strategie kann in folgenden Aspekten optimiert werden:
Diese Strategie kombiniert Trendverfolgung und Risikokontrolle über Multi-Timeframe ATR Trailing Stops. Im Vergleich zu Single Stop identifiziert sie die Trendrichtung klarer; im Vergleich zu Single Timeframe filtert sie viel Lärm aus. Eine richtige Konfiguration von Stopparametern und Zeitrahmen ist der Schlüssel zum Erreichen der besten Ergebnisse. Sie eignet sich für Anleger, die bestimmte Drawdowns tolerieren können und eine stabile Rendite bieten. Es gibt auch weitere Möglichkeiten zur Verbesserung und Erweiterung. Es ist eine sehr vielversprechende Strategieidee.
/*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)