Chiến lược theo dõi xu hướng đa khung thời gian dựa trên siêu xu hướng

Tác giả:ChaoZhang, Ngày: 2024-02-21 11:05:17
Tags:

img

Tổng quan

Ý 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 logic

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.

Ưu điểm

  • lọc tiếng ồn từ khung thời gian thấp hơn bằng cách sử dụng thông tin cấu trúc thị trường từ tf cao hơn
  • Các tín hiệu đáng tin cậy hơn từ việc kết hợp phân tích nhiều khung thời gian
  • Các tham số Supertrend có thể tùy chỉnh để tối ưu hóa chiến lược
  • Cài đặt phạm vi ngày tích hợp để hạn chế thời gian backtest

Phân tích rủi ro

  • Các tín hiệu chậm từ khung thời gian cao hơn có thể bỏ lỡ các cơ hội ngắn hạn
  • Sự không chính xác trong các phán đoán về cấu trúc thị trường theo khung thời gian dài hơn
  • Các tín hiệu sai tiềm năng từ chính Supertrend
  • Các hạn chế về ngày kiểm tra ngược có thể bỏ qua dữ liệu quan trọng và ảnh hưởng đến độ chính xác kết quả

Giải pháp:

  • Chỉnh chỉnh các thiết lập khung thời gian cao hơn để giảm độ trễ tín hiệu
  • Thêm các chỉ số khác để xác nhận các đánh giá khung thời gian cao hơn
  • Tối ưu hóa các thông số Supertrend để cải thiện chất lượng tín hiệu
  • Tiến bộ mở rộng thời gian backtest để kiểm tra độ bền

Hướng dẫn tối ưu hóa

Chiến lược này có thể được cải thiện trong một số lĩnh vực:

  1. Tối ưu hóa các tham số Supertrend cho kết hợp tham số tốt nhất
  2. Thêm các chỉ số khác để tạo ra các mô hình đa yếu tố
  3. Kiểm tra các kết hợp khung thời gian cao và thấp khác nhau
  4. Kết hợp các cơ chế dừng lỗ để kiểm soát rủi ro
  5. Sử dụng máy học để điều chỉnh các tham số một cách năng động

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.

Kết luận

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)


Thêm nữa