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

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

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

Thông tin chi tiết

Ý 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 các chỉ số vượt qua trên khung thời gian cao cấp như một bộ lọc để phát tín hiệu mua và bán trên khung thời gian thấp hơn. Chiến lược này nhằm mục đích sử dụng thông tin cấu trúc thị trường được cung cấp bởi khung thời gian cao để cải thiện chất lượng quyết định giao dịch.

Nguyên tắc chiến lược

Chiến lược này lấy giá trị của chỉ số vượt qua khung thời gian cao cấp (bất định là 4 lần khung thời gian hiện tại) bằng cách gọi hàm an ninh. Chỉ số vượt qua bao gồm hai đường: đường vượt qua và đường xu hướng.

Chiến lược này sử dụng hướng siêu xu hướng trong khung thời gian cao như một điều kiện lọc, chỉ khi hướng siêu xu hướng trong khung thời gian thấp phù hợp với khung thời gian cao, chỉ khi đó các tín hiệu giao dịch sẽ được phát ra.

Điều này giúp tránh sự gián đoạn của tiếng ồn thị trường khung thời gian thấp và tăng độ tin cậy của tín hiệu. Trong khi đó, sử dụng khung thời gian cao để đánh giá cấu trúc thị trường và đưa ra phán đoán tổng thể đúng.

Lợi thế chiến lược

  • Sử dụng thông tin cấu trúc thị trường được cung cấp bởi khung thời gian cao, lọc ra tiếng ồn của khung thời gian thấp, cải thiện chất lượng quyết định giao dịch
  • Kết hợp nhiều phân tích khung thời gian để làm cho tín hiệu giao dịch đáng tin cậy hơn
  • Các tham số siêu xu hướng có thể được tùy chỉnh để tối ưu hóa chiến lược mua bán
  • Thiết lập phạm vi ngày tích hợp để giới hạn thời gian xem lại

Phân tích rủi ro

  • Các tín hiệu khung thời gian cao bị trễ, có thể bỏ lỡ cơ hội đường ngắn
  • Khả năng sai cấu trúc thị trường trong khung thời gian cao
  • Chỉ số siêu xu hướng có thể là tín hiệu sai
  • Các hạn chế về thời gian kiểm tra lại có thể bỏ qua các dữ liệu quan trọng, ảnh hưởng đến độ chính xác của kết quả thử nghiệm

Cách giải quyết:

  • Điều chỉnh thiết lập khung thời gian cao thích hợp để giảm độ trễ tín hiệu
  • Kết hợp với các chỉ số khác xác nhận các phán đoán cấu trúc khung thời gian cao
  • Tối ưu hóa các tham số siêu xu hướng để cải thiện chất lượng tín hiệu
  • Tiếp tục mở rộng phạm vi thời gian kiểm tra lại, kiểm tra tính bền vững của chiến lược

Chiến lược tối ưu hóa hướng

Chiến lược này có thể được tối ưu hóa từ một số khía cạnh sau:

  1. Tối ưu hóa các thông số siêu xu hướng để tìm ra các kết hợp tốt nhất
  2. Thêm các chỉ số khác để kết hợp, tạo ra mô hình đa nhân tố
  3. Kiểm tra các kết hợp khung thời gian cao và thấp khác nhau
  4. Tăng cơ chế ngăn chặn để kiểm soát rủi ro
  5. Kết hợp các thuật toán học máy điều chỉnh siêu tham số động

Các phương pháp như tối ưu hóa các tham số, kết hợp các chỉ số, cải thiện dừng lỗ và giới thiệu học máy có thể cải thiện đáng kể hiệu quả của chiến lược theo dõi xu hướng nhiều khung thời gian.

Tóm lại

Chiến lược này sử dụng một cách khéo léo sự phán đoán về xu hướng của khung thời gian cao để hướng dẫn việc thực hiện giao dịch trong khung thời gian thấp. Thiết kế khung thời gian đa dạng nà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. Đồng thời, tính năng đặt ngày tích hợp làm cho việc kiểm tra lại linh hoạt hơn. Nhìn chung, đây là một chiến lược theo dõi xu hướng nhiều khung thời gian được thiết kế kỹ lưỡng và đá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)


Nhiều hơn nữa