Trends-Tracking-Strategien basierend über einen Zeitrahmen hinaus

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

基于超越时间框架的趋势追踪策略

Übersicht

Der Kerngedanke der Strategie ist es, Markttrends in Kombination mit mehreren Zeitrahmen zu identifizieren, und überschreitende Indikatoren auf dem höheren Zeitrahmen als Filter zu verwenden, um Kauf- und Verkaufssignale auf dem niedrigeren Zeitrahmen auszusenden. Die Strategie zielt darauf ab, die Marktstrukturinformationen, die von den höheren Zeitrahmen bereitgestellt werden, zu nutzen, um die Qualität der Handelsentscheidungen zu verbessern.

Die Strategie

Die Strategie erhält den Wert eines Überschreitungsindikators für einen höheren Zeitrahmen (default 4x aktueller Zeitrahmen) durch Aufrufen der Security-Funktion. Der Überschreitungsindikator besteht aus zwei Linien: einer Überschreitungslinie und einer Trendlinie. Wenn die Überschreitungslinie oberhalb der Trendlinie liegt, ist sie ein Aufwärtssignal, wenn sie darunter liegt, ist sie ein Abwärtssignal.

Die Strategie verwendet die Richtung des Übertrends in einem höheren Zeitrahmen als Filterbedingungen und sendet nur dann ein Handelssignal, wenn die Richtung des Übertrends in einem niedrigeren Zeitrahmen mit der Richtung des Übertrends in einem höheren Zeitrahmen übereinstimmt. Das heißt, wenn nur zwei Übertrendindikatoren in einem anderen Zeitrahmen ein ähnliches Signal senden, wird die Strategie mehr oder weniger tun.

Dies vermeidet die Störung durch Marktlärm in niedrigen Zeitrahmen und verbessert die Signalzuverlässigkeit. Gleichzeitig wird die Marktstruktur in hohen Zeitrahmen beurteilt, um die richtigen Gesamturteile zu treffen.

Strategische Vorteile

  • Verwenden Sie Marktstrukturinformationen, die von hohen Zeitrahmen zur Verfügung gestellt werden, um den Lärm von niedrigen Zeitrahmen zu filtern und die Qualität von Handelsentscheidungen zu verbessern
  • Kombination von mehreren Zeitrahmenanalysen, um Handelssignale zu verlässlichen
  • Die Parameter für die Supertendenzindikatoren können angepasst werden, um die Kauf- und Verkaufsstrategie zu optimieren.
  • Eingebettete Datumsbereiche, um den Zeitrahmen der Nachprüfung zu begrenzen

Risikoanalyse

  • Hochzeit-Frame-Signal-Verzögerung, möglicherweise verpasste Kurzzeit-Chancen
  • Hohe Zeitrahmen für falsche Marktstrukturbeurteilung
  • Der Hypertrend kann auch die falschen Signale auslösen
  • Restriktionen der Repräsentationszeit können wichtige Daten übersehen und die Genauigkeit der Testresultate beeinträchtigen.

Die Lösung:

  • Richten Sie die Einstellungen für hohe Zeitrahmen entsprechend an, um die Signalverzögerung zu reduzieren
  • Strukturelle Beurteilungen in Verbindung mit anderen Indikatoren für die Feststellung des hohen Zeitrahmens
  • Optimierung der Parameter der Supertendenzindikatoren und Verbesserung der Signalqualität
  • Schrittweise Erweiterung der Zeitspanne der Nachprüfungen und Tests der Strategiebeständigkeit

Strategische Optimierung

Die Strategie kann in folgenden Bereichen optimiert werden:

  1. Optimieren Sie die Parameter für Supertrendindikatoren und finden Sie die beste Kombination von Parametern
  2. Zusätzliche Indikatoren werden kombiniert, um ein Multifaktormodell zu bilden
  3. Verschiedene Kombinationen von hohen und niedrigen Zeitrahmen testen
  4. Erhöhung der Stopp-Mechanismen zur Risikokontrolle
  5. Dynamische Anpassung von Hyperparametern in Kombination mit maschinellen Lernalgorithmen

Methoden wie Parameteroptimierung, Kombination von Indikatoren, Verbesserung von Stop-Loss-Methoden und Einführung von Machine Learning können die Wirksamkeit dieser Strategien für die Verfolgung von Trends in mehreren Zeitrahmen erheblich verbessern.

Zusammenfassung

Die Strategie nutzt geschickt die Trendfindung eines hohen Zeitrahmens, um die Handelsausführung eines niedrigeren Zeitrahmens zu steuern. Dieses Multi-Zeitrahmen-Design kann Marktlärm effektiv filtern und eine klarere Trendrichtung erkennen. Die integrierte Datums-Einstellungsfunktion macht die Rückmessung flexibler.


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


Weitere Informationen