Ý tưởng cốt lõi của chiến lược này là kết hợp nhiều khung thời gian để xác định xu hướng thị trường, sử dụng chỉ số Supertrend từ các khung thời gian cao hơn như một bộ lọc và tạo ra tín hiệu mua và bán từ các khung thời gian thấp hơn.
Chiến lược lấy các giá trị chỉ số Supertrend từ một khung thời gian cao hơn (mất mặc định 4 lần khung thời gian hiện tại) bằng cách gọi hàm bảo mật. Chỉ số Supertrend bao gồm hai đường: đường Supertrend và đường xu hướng. Đường Supertrend trên đường xu hướng là tín hiệu tăng, trong khi bên dưới là tín hiệu giảm.
Hướng của chỉ số Supertrend từ khung thời gian cao hơn phục vụ như một điều kiện lọc. Các tín hiệu giao dịch chỉ được tạo ra khi các hướng của Supertrend từ cả hai khung thời gian liên kết. Điều đó có nghĩa là tín hiệu chỉ được kích hoạt khi cả hai khung thời gian đưa ra tín hiệu theo cùng một hướng.
Điều này tránh sự can thiệp từ tiếng ồn thị trường trong khung thời gian ngắn hơn và cải thiện độ tin cậy tín hiệu.
Giải pháp:
Chiến lược này có thể được cải thiện trong một số lĩnh vực:
Thông qua tối ưu hóa tham số, kết hợp các chỉ số, cải thiện dừng lỗ và giới thiệu máy học, cải thiện hiệu suất đáng kể có thể đạt được cho chiến lược theo dõi xu hướng đa khung thời gian này.
Chiến lược này thông minh tận dụng các đánh giá xu hướng khung thời gian cao hơn để hướng dẫn thực hiện giao dịch trong khung thời gian thấp hơn. Thiết kế khung thời gian đa dạng như vậy có thể lọc hiệu quả tiếng ồn thị trường và xác định hướng xu hướng rõ ràng hơn. Cài đặt ngày tích hợp cũng làm cho kiểm tra ngược linh hoạt hơn. Nhìn chung, đây là một chiến lược theo dõi xu hướng khung thời gian đa dạng được thiết kế tốt đáng để nghiên cứu và áp dụng thêm.
/*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)