Mehrzeitrahmen-Stop-Loss-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-08 11:24:24
Tags:

img

Übersicht

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.

Strategie Logik

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.

Vorteile

  1. Die Verwendung mehrerer Zeitrahmen hilft, Lärm zu filtern und die Trendrichtung zu identifizieren
  2. ATR-Ausfahrtsstopp passt die Stoppdistanz dynamisch an und senkt die Wahrscheinlichkeit, dass er gestoppt wird
  3. Kombination von Trend folgen und Stop-Loss-Management, können Sie den Trend zu folgen und in der Zeit zu stoppen
  4. Wenige Parameter, leicht zu verstehen und zu optimieren

Risikoanalyse

  1. ATR-Stopp kann zu nah oder zu weit sein, wenn die Parameter nicht richtig eingestellt sind, anfällig für Schläge oder zu große Stoppdistanz
  2. Die Kombination von mehreren Zeitrahmen funktioniert möglicherweise nicht effektiv oder beurteilt falsch, wenn die Parameter nicht richtig eingestellt sind
  3. Notwendigkeit, sowohl Stop-Loss- als auch Timeframe-Parameter richtig zu konfigurieren, da sonst möglicherweise nicht die besten Ergebnisse erzielt werden

Lösungen:

  1. Verschiedene Parametermengen und Produkte testen, um optimale
  2. Optimierung des Verhältnisses und der Anzahl der Zeitrahmen zur Gewährleistung einer zuverlässigen Trendbeurteilung
  3. Einstellung des ATR-Multiplikators auf das Gleichgewicht zwischen Nicht-Schlag und angemessener Entfernung

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Hinzufügen/Reduzieren von Zeitrahmen zur Suche nach den besten Kombinationen für die Trendbeurteilung
  2. Versuche verschiedene ATR-Multiplikatoren zur Bestimmung der optimalen Stoppdistanz
  3. Hinzufügen eines Wiedereintrittsmechanismus, um weitere Positionen zu erzeugen, wenn der Trend anhält
  4. Einbeziehung anderer Filter an Eingangssignalen, z. B. Lautstärkenanzeiger usw.
  5. Parameter-Tuning für verschiedene Produkte

Schlussfolgerung

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)


Mehr