Trendfolgestrategien basierend auf transzendentalen Zeitrahmen


Erstellungsdatum: 2024-02-21 11:05:17 zuletzt geändert: 2024-02-21 11:05:17
Kopie: 0 Klicks: 690
1
konzentrieren Sie sich auf
1617
Anhänger

Trendfolgestrategien basierend auf transzendentalen Zeitrahmen

Überblick

Die Kernidee der Strategie besteht darin, Markttrends in Kombination mit mehreren Zeitrahmen zu identifizieren, überschreitende Indikatoren in höheren Zeitrahmen als Filter zu verwenden und auf niedrigeren Zeitrahmen Kauf- und Verkaufssignale zu senden. Die Strategie zielt darauf ab, die Informationen über die Marktstruktur, die von hohen Zeitrahmen bereitgestellt werden, zu nutzen, um die Qualität der Handelsentscheidungen zu verbessern.

Strategieprinzip

Die Strategie erhält die Überschreitung des Indikators für den höheren Zeitrahmen (default 4x der aktuellen Zeitrahmen) durch Aufruf der Security-Funktion. Die Überschreitung des Indikators besteht aus zwei Linien: Überschreitung und Trendlinie. Die Überschreitung ist ein Positivsignal, wenn sie sich über der Trendlinie befindet, und ein Bewegungssignal, wenn sie sich darunter befindet.

Die Strategie verwendet die Richtung des Übertrends im oberen Zeitrahmen als Filterbedingung und sendet nur dann ein Handelssignal aus, wenn die Richtung des Übertrends im unteren Zeitrahmen mit der des oberen Zeitrahms übereinstimmt. Das heißt, die Strategie macht nur dann zu viel oder zu wenig, wenn die Übertrendindikatoren in beiden Zeitrahmen einseitige Signale senden.

Auf diese Weise wird der Lärm des Marktes in den niedrigen Zeitrahmen vermieden und die Signalsicherheit erhöht. Gleichzeitig wird die Struktur des Marktes in den hohen Zeitrahmen beurteilt, um die richtige Gesamtbeurteilung zu treffen.

Strategische Vorteile

  • Nutzung von Informationen über die Marktstruktur der hohen Zeitrahmen, um den Lärm der niedrigen Zeitrahmen zu filtern und die Qualität der Handelsentscheidungen zu verbessern
  • Mehrfache Zeitrahmenanalysen in Kombination machen Handelssignale zuverlässiger
  • Benutzerdefinierte Parameter für Übertrend-Indikatoren zur Optimierung von Kauf- und Verkaufstrategien
  • Eingebaute Datumsbereichs-Einstellungen, die den Zeitrahmen der Rückdaten einschränken

Risikoanalyse

  • Hochzeitssignal verspätet, möglicherweise verpasste Kurzstrecken-Gelegenheiten
  • Hohe Wahrscheinlichkeit von Fehlern bei der Beurteilung der Marktstruktur
  • Der Übertrendindikator selbst könnte ein falsches Signal aussenden
  • Die Beschränkung des Zeitrahmens kann wichtige Daten vernachlässigen und die Genauigkeit der Testergebnisse beeinträchtigen

Die Lösung:

  • Anpassung der hohen Zeitrahmen-Einstellungen zur Verringerung der Signalverzögerung
  • In Kombination mit anderen Indikatoren bestätigte hohe Zeitrahmenstrukturentscheidungen
  • Optimierung der Übertrend-Indikatorparameter zur Verbesserung der Signalqualität
  • Schrittweise Erweiterung der Rückmesszeiten und Teststrategie Stabilität

Richtung der Strategieoptimierung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Optimierung der Hypertrend-Indikatorparameter und Suche nach der optimalen Kombination
  2. Hinzufügen anderer Indikatoren in Kombinationen, um ein Multifaktormodell zu bilden
  3. Verschiedene Kombinationen von hohen und niedrigen Zeitrahmen testen
  4. Erhöhung der Stop-Loss-Mechanismen zur Risikokontrolle
  5. Dynamische Anpassung von Hyperparametern in Kombination mit maschinellen Lernalgorithmen

Durch die Optimierung von Parametern, die Kombination von Indikatoren, die Verbesserung von Stop-Loss-Methoden und die Einführung von Machine Learning kann die Wirksamkeit der Multi-Time-Frame Trend-Tracking-Strategie erheblich verbessert werden.

Zusammenfassen

Die Strategie nutzt die Trendentscheidung in hohen Zeitrahmen geschickt, um die Handelsausführung in niedrigen Zeitrahmen zu leiten. Diese Multi-Zeitrahmen-Konstruktion filtert effektiv Marktlärm und identifiziert eine klarere Trendrichtung. Die integrierte Datums-Setting-Funktion macht die Rückmeldung flexibler.

Strategiequellcode
/*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)