Supertrendbasierte Multitimeframe Trendverfolgungsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-02-21 11:05:17
Tags:

img

Übersicht

Die Kernidee dieser Strategie besteht darin, mehrere Zeitrahmen zu kombinieren, um Markttrends zu identifizieren, den Supertrend-Indikator aus höheren Zeitrahmen als Filter zu verwenden und Kauf- und Verkaufssignale aus niedrigeren Zeitrahmen zu generieren.

Strategie Logik

Der Supertrend-Indikator besteht aus zwei Linien: der Supertrend-Linie und der Trendlinie. Die Supertrend-Linie über der Trendlinie ist ein Aufwärtssignal, während unten ein Bärensignal ist.

Die Richtung des Supertrend-Indikators aus dem höheren Zeitrahmen dient als Filterbedingung. Handelssignale werden nur generiert, wenn sich die Richtungen des Supertrends aus beiden Zeitrahmen ausrichten. Das bedeutet, dass Signale nur ausgelöst werden, wenn beide Zeitrahmen Signale in die gleiche Richtung geben.

Dies verhindert Störungen durch Marktlärm in kürzeren Zeitrahmen und verbessert die Signalzuverlässigkeit.

Vorteile

  • Filtert Lärm aus niedrigeren Zeitrahmen anhand von Marktstrukturinformationen aus höheren
  • Zuverlässigere Signale aus der Kombination von Analysen mehrerer Zeitrahmen
  • Anpassbare Supertrend-Parameter für die Strategieoptimierung
  • Eingebettete Datumsbereichseinstellungen zur Begrenzung der Backtestzeit

Risikoanalyse

  • Verzögerte Signale aus höheren Zeitrahmen können kurzfristige Chancen verpassen
  • Ungenauigkeiten bei Beurteilungen der Marktstruktur über längere Zeiträume
  • Potenzielle falsche Signale von Supertrend selbst
  • Zurücktestdatumsbeschränkungen können wichtige Daten weglassen und die Genauigkeit der Ergebnisse beeinträchtigen

Lösungen:

  • Feinstuning höherer Zeitrahmen-Einstellungen zur Verringerung der Signalverzögerung
  • Hinzufügen anderer Indikatoren zur Bestätigung höherer Zeitrahmen
  • Optimierung der Supertrend-Parameter zur Verbesserung der Signalqualität
  • Progressive Erweiterung der Rückprüfungsdauer für die Robustheit

Optimierungsrichtlinien

Diese Strategie kann in mehreren Bereichen verbessert werden:

  1. Optimieren der Supertrend-Parameter für die beste Parameterkombination
  2. Hinzufügen anderer Indikatoren zur Erstellung von Multifaktormodellen
  3. Verschiedene Kombinationen von hohen und niedrigen Zeitrahmen testen
  4. Einbeziehung von Stop-Loss-Mechanismen zur Risikokontrolle
  5. Nutzen Sie maschinelles Lernen, um Parameter dynamisch anzupassen

Durch die Optimierung von Parametern, die Kombination von Indikatoren, die Verbesserung von Stop-Loss und die Einführung von maschinellem Lernen kann eine signifikante Leistungssteigerung für diese Multi-Timeframe-Trend-Tracking-Strategie erzielt werden.

Schlussfolgerung

Diese Strategie nutzt klug höhere Zeitrahmen-Trendurteile, um die Handelsausführung in niedrigeren Zeitrahmen zu steuern. Ein solches Multitimeframe-Design kann effektiv Marktlärm filtern und klarere Trendrichtungen identifizieren. Die integrierten Dateneinstellungen machen das Backtesting auch flexibler. Insgesamt ist dies eine gut gestaltete Multitimeframe-Trendverfolgungsstrategie, die weitere Forschung und Anwendung verdient.


/*backtest
start: 2023-02-14 00:00:00
end: 2024-02-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Higher TF - Repainting", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

HTFMultiplier = input(4, minval=1, step=1)

SupertrendMult = input(1)
SupertrendPd = input(4, minval=4, step=4)

backtestBars = input(title="Backtest from ", defval=10, minval=1, maxval=30)
backtestFrom = input(title="Timeframe", defval="years", options=["days", "months", "years"])

repaintOption = input(title="Repaint", defval="Yes", options=["Yes", "No - set lookahead false", "No - do not use security"])

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_getBackTestTimeFrom(backtestFrom, backtestBars)=>
    byDate = backtestFrom == "days"
    byMonth = backtestFrom == "months"
    byYear = backtestFrom == "years"
    
    date = dayofmonth(timenow)
    mth = month(timenow)
    yr = year(timenow)
    
    leapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,29)
    nonleapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,28)
    
    restMonths = array.new_int(10,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,30)
    array.set(leapYearDaysInMonth,2,31)
    array.set(leapYearDaysInMonth,3,30)
    array.set(leapYearDaysInMonth,4,31)
    array.set(leapYearDaysInMonth,5,31)
    array.set(leapYearDaysInMonth,6,30)
    array.set(leapYearDaysInMonth,7,31)
    array.set(leapYearDaysInMonth,8,30)
    array.set(leapYearDaysInMonth,9,31)
    
    array.concat(leapYearDaysInMonth,restMonths)
    array.concat(nonleapYearDaysInMonth,restMonths)
    isLeapYear = yr % 4 == 0 and (year%100 != 0 or year%400 == 0)
    numberOfDaysInCurrentMonth = isLeapYear ? array.get(leapYearDaysInMonth, mth-2) : array.get(nonleapYearDaysInMonth, mth-2)
    if(byDate)
        mth := (date - backtestBars) < 0 ? mth - 1 : mth
        yr := mth < 1 ? yr - 1 : yr
        mth := mth < 1 ? 1 : mth
        date := (date - backtestBars) < 0 ? numberOfDaysInCurrentMonth - backtestBars + date + 1 : date - backtestBars + 1
    if(byMonth)
        date := 1
        yr := (mth - (backtestBars%12)) < 0 ? yr - int(backtestBars/12) - 1 : yr - int(backtestBars/12)
        mth := mth - (backtestBars%12) + 1
    if(byYear)
        date := 1
        mth := 1
        yr := yr - backtestBars
    [date, mth, yr]


repaint = repaintOption == "Yes"
useSecurityLookahead = repaintOption == "No - set lookahead false"

[SupertrendRepaint, DirRepaint] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = true, gaps=true)
[SupertrendNoLookahead, DirNoLookahead] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = false, gaps=false)

[SupertrendRegular, DirRegular] = supertrend(SupertrendMult, SupertrendPd)

[date, mth, yr] = f_getBackTestTimeFrom(backtestFrom, backtestBars)
inDateRange = time >= timestamp(syminfo.timezone, yr, mth, date, 0, 0)

longCondition = repaint ? DirRepaint == -1 : useSecurityLookahead? DirNoLookahead == -1 : DirRegular == -1
shortCondition = repaint ? DirRepaint == 1 : useSecurityLookahead? DirNoLookahead == 1 : DirRegular == 1
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange)
strategy.entry("Sell", strategy.short, when=shortCondition and inDateRange)


Mehr