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.
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.
Lösungen:
Diese Strategie kann in mehreren Bereichen verbessert werden:
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.
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)