Chiến lược này tính toán chỉ số chuyển động theo hướng (DI) của hàng hóa và kết hợp nó với các tham số giới hạn để thực hiện giao dịch hai hướng. Nó đi dài khi DI + lớn hơn DI - bằng một tham số giới hạn và đi ngắn khi DI - lớn hơn DI + bằng một tham số giới hạn.
Chỉ số cốt lõi của chiến lược này là chỉ số chuyển động theo hướng (DI).
DI+ = (DM+ / True Range) × 100 DI- = (DM- / True Range) × 100
Trong đó DM + đại diện cho Di chuyển hướng tích cực, DM- đại diện cho Di chuyển hướng âm. Phạm vi thực sự đại diện cho sự biến động gần đây bằng cách tính toán giá trị tối đa của giá cao nhất, giá thấp nhất và giá đóng của ngày trước trong ba ngày.
Theo định nghĩa của DI, khi DI + > DI-, điều đó có nghĩa là động lực thị trường hiện tại mạnh hơn, thuộc về thị trường tăng; khi DI- > DI+, điều đó có nghĩa là động lực gấu mạnh hơn động lực tăng, thuộc về thị trường giảm.
Chiến lược này sử dụng tính năng này và thiết lập một tham số giới hạn. Khi DI + lớn hơn DI - bằng một tham số giới hạn, nó xác định rằng thị trường hiện tại là thị trường tăng và đi dài. Khi DI - lớn hơn DI + bằng một tham số giới hạn, nó xác định rằng thị trường hiện tại là thị trường gấu và đi ngắn.
Ví dụ: nếu tham số giới hạn được đặt là 3, các quy tắc giao dịch cụ thể là:
Vì thường có sự khác biệt dao động nhỏ giữa DI + và DI-, việc thiết lập một tham số giới hạn có thể lọc một số giao dịch mà không có định hướng đáng kể và giảm giao dịch không cần thiết.
Những lợi thế chính của chiến lược này là:
DI đáng tin cậy trong việc đánh giá hướng thị trường
DI trực tiếp đánh giá xu hướng thị trường bằng cách tính toán sức mạnh của bò và gấu.
Các thông số giới hạn có thể lọc hiệu quả tín hiệu
Các thông số giới hạn lọc các biến động nhỏ mà không có định hướng đáng kể, chỉ chọn các phần có định hướng đáng kể để giao dịch, tránh bị mắc kẹt.
Đạt được giao dịch hai hướng tự động
Các vị trí dài và ngắn có thể tự động chuyển đổi dựa trên chỉ số DI mà không cần đánh giá bằng tay, làm giảm khó khăn giao dịch.
Khung thời gian giao dịch có thể tùy chỉnh
Hỗ trợ thiết lập chỉ giao dịch trong phạm vi ngày tùy chỉnh và đóng tất cả các vị trí tự động sau đó, linh hoạt và thuận tiện.
Chỉ có thể chọn dài hoặc ngắn
Thông qua các công tắc dài và ngắn, chỉ có thể chọn tín hiệu một chiều để thực hiện các chiến lược dài hoặc ngắn phù hợp với các môi trường thị trường khác nhau.
Ngoài ra còn có một số rủi ro với chiến lược này:
Khả năng DI đưa ra tín hiệu sai
DI có thể cung cấp tín hiệu sai ngắn hạn khi biến động thị trường mạnh mẽ xảy ra, dẫn đến giao dịch thất bại.
Cài đặt tham số giới hạn không chính xác
Các thiết lập tham số giới hạn cao hoặc thấp không đúng có thể dẫn đến quá ít hoặc quá nhiều tín hiệu giao dịch. Các tham số cần phải được điều chỉnh theo thị trường.
Không thể xác định điểm cuối xu hướng
DI chỉ có thể xác định hướng xu hướng hiện tại và không thể đánh giá liệu xu hướng đã kết thúc hay đảo ngược.
Các giải pháp cho các rủi ro bao gồm:
Kết hợp trung bình động và các chỉ số khác để lọc tín hiệu DI
Điều chỉnh các thông số giới hạn dựa trên kết quả backtest
Kết hợp khối lượng, MACD v.v. để xác định xem sự đảo ngược xu hướng
Chiến lược có thể được tối ưu hóa thêm theo các cách sau:
Kết hợp các chỉ số đánh giá xu hướng khác như Market Profile
Kết hợp các chỉ số như Market Profile, cũng đánh giá trực quan sức mạnh ngắn dài với DI có thể cải thiện độ chính xác đánh giá.
Thêm các chiến lược dừng lợi nhuận và dừng lỗ
Thiết lập dừng lợi nhuận, thời gian hoặc tỷ lệ dừng lỗ có thể khóa lợi nhuận và giảm lỗ.
Điều chỉnh các thông số cho các sản phẩm cụ thể
Điều chỉnh các thông số giới hạn và thời gian giao dịch theo các đặc điểm sản phẩm khác nhau có thể cải thiện hiệu suất chiến lược.
Tối ưu hóa năng động sử dụng máy học
Áp dụng các thuật toán học tăng cường để tối ưu hóa động các thiết lập tham số dựa trên tín hiệu trực tiếp.
Tóm lại, chiến lược này tương đối đơn giản và thực tế. Nó sử dụng tính toán DI
/*backtest start: 2022-12-12 00:00:00 end: 2023-12-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Noro's DI Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") len = input(title="Length", defval=14) limit = input(3, title = "limit, %") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //DI TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementMinus = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 //Trend trend = 0 trend := DIPlus > DIMinus + limit ? 1 : DIPlus < DIMinus - limit ? -1 : trend[1] //Background col = trend == 1 ? lime : red bgcolor(col, transp = 80) //Lines plot(DIPlus, color=lime, title="DI+", linewidth = 3) plot(DIMinus, color=red, title="DI-", linewidth = 3) //Trading size = strategy.position_size lot = 0.0 lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1] if trend == 1 strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if trend == -1 strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()