Chiến lược xu hướng động ADX

Tác giả:ChaoZhang, Ngày: 2024-01-15 15:32:45
Tags:

img

Tổng quan

Chiến lược xu hướng động ADX là một chiến lược giao dịch định lượng sử dụng chỉ số ADX để xác định sức mạnh và hướng của xu hướng thị trường. Nó tạo ra tín hiệu mua và bán bằng cách tính chỉ số hướng trung bình (ADX) để đánh giá liệu có xu hướng tồn tại trên thị trường hay không và bằng cách tính chỉ số hướng tích cực (DI +) và chỉ số hướng tiêu cực (DI-) để xác định hướng của xu hướng.

Logic giao dịch

Chiến lược này đầu tiên sử dụng chỉ số ADX để xác định liệu có xu hướng tồn tại trên thị trường hay không. Khi ADX vượt quá một mức chính được xác định bởi người dùng (bên mặc định 23), nó báo hiệu rằng xu hướng thị trường tương đối mạnh. Khi giá trị ADX hiện tại cao hơn giá trị ADX n ngày trước (n là thời gian xem lại được xác định bởi người dùng, mặc định 3 ngày), nó báo hiệu rằng ADX đang tăng và xu hướng đang hình thành trên thị trường.

Chiến lược sau đó sử dụng DI + và DI - để xác định hướng xu hướng thị trường. Khi DI + cao hơn DI-, nó báo hiệu xu hướng tăng trên thị trường. Khi DI + thấp hơn DI-, nó báo hiệu xu hướng giảm trên thị trường.

Cuối cùng, chiến lược kết hợp phân tích ADX và DI để tạo ra các tín hiệu mua và bán cụ thể:

  1. Khi ADX tăng và trên mức chính và DI + cao hơn DI-, một tín hiệu mua được tạo ra
  2. Khi ADX tăng và trên mức chính và DI + thấp hơn DI-, một tín hiệu bán được tạo ra
  3. Khi ADX quay để giảm, một tín hiệu vị trí phẳng được tạo ra

Chiến lược cũng cung cấp các tính năng như lọc trung bình động và phạm vi thời gian kiểm tra ngược có thể tùy chỉnh.

Phân tích lợi thế

Chiến lược xu hướng động ADX có những lợi thế sau:

  1. Tự động phát hiện sự tồn tại của xu hướng thị trường, tránh giao dịch không hiệu quả
  2. Tự động xác định hướng của xu hướng thị trường cho xu hướng sau
  3. Logic rõ ràng của mua trên sự tồn tại xu hướng và phẳng trên sự biến mất xu hướng
  4. Bộ lọc trung bình động có thể cấu hình tránh các sự đột phá sai
  5. Phạm vi thời gian thử nghiệm ngược có thể tùy chỉnh cho thử nghiệm lịch sử
  6. Các tham số chỉ số có thể điều chỉnh để tối ưu hóa trên các sản phẩm khác nhau

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Chỉ số ADX có tác dụng chậm trễ, có thể bỏ lỡ các cơ hội xu hướng ban đầu
  2. Sự phụ thuộc vào hướng xu hướng trên DI có thể tạo ra tín hiệu sai vì DI nhạy cảm
  3. Bộ lọc trung bình động có thể bỏ lỡ các cơ hội ngắn hạn
  4. Khung thời gian backtesting không phù hợp có thể gây ra quá phù hợp
  5. Các thông số chỉ số không chính xác có thể ảnh hưởng đến hiệu suất chiến lược

Để giảm thiểu rủi ro, các biện pháp sau đây có thể được xem xét:

  1. Giảm các thông số ADX để giảm chậm
  2. Loại bỏ hoặc điều chỉnh bộ lọc DI để ngăn chặn tín hiệu sai
  3. Giảm thời gian trung bình động
  4. Mở rộng khung thời gian backtesting cho kiểm tra mẫu đầy đủ
  5. Tối ưu hóa các tham số để tìm các thiết lập tốt nhất

Cơ hội gia tăng

Chiến lược có thể được tăng cường từ các khía cạnh sau:

  1. Kiểm tra danh mục đầu tư trên nhiều cổ phiếu để đa dạng hóa rủi ro một cổ phiếu
  2. Thêm logic dừng lỗ vào điều khiển mỗi lỗ giao dịch
  3. Kết hợp với các chỉ số khác để xác minh tín hiệu để cải thiện độ chính xác
  4. Đưa ra các thuật toán học máy để tạo tín hiệu mua / bán
  5. Thêm mô-đun điều chỉnh tham số tự động để điều chỉnh động

Kết luận

Chiến lược xu hướng động ADX sử dụng ADX để xác định sự tồn tại của xu hướng và DI cho hướng xu hướng. Nó tạo ra tín hiệu giao dịch khi xu hướng tồn tại và làm phẳng các vị trí khi xu hướng biến mất. Lý luận rõ ràng. Bằng cách tự động phát hiện và theo dõi xu hướng, giao dịch không hiệu quả có thể tránh được ở một mức độ nào đó ở các thị trường không có xu hướng. Với sự nâng cao thích hợp, chiến lược này có thể trở thành một công cụ mạnh mẽ cho giao dịch định lượng trung và dài hạn.


/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh with inspiration from @9e52f12edd034d28bdd5544e7ff92e 
//The intent behind this study is to look at ADX when it has an increasing slope and is above a user-defined key level (23 default). 
//This is to identify when it is trending.
//It then looks at the DMI levels.  If D+ is above D- and the ADX is sloping upwards and above the key level, it triggers a buy condition.  Opposite for short.
//Can use a user-defined moving average to filter long/short if desried.
// NOTE: THIS IS MEANT TO BE USED IN CONJUNCTION WITH MY "ATX TRIGGER" INDICATOR FOR VISUALIZATION. MAKE SURE SETTINGS ARE THE SAME FOR BOTH.

strategy("ADX | DMI Trend", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.04)

// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
// ADX Info
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(23, title="Keylevel for ADX")
adxLookback = input(3, title="Lookback Period for Slope")

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 200, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    close

// == USE BUILT-IN DMI FUNCTION TO DETERMINE ADX AND BULL/BEAR STRENGTH
[diplus, diminus, adx] = dmi(dilen, adxlen)

buySignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus > diminus  and close >= maFilterCheck
// buySignalValue = valuewhen(buySignal, close, 0)
shortSignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus < diminus  and close <= maFilterCheck
// shortSignalValue = valuewhen(shortSignal, close, 0)
sellCoverSignal = adx[0]-adx[adxLookback] < 0

// == ENTRY & EXIT CRITERIA
// Triggers to be TRUE for it to fire of the BUY Signal : (opposite for the SELL signal).
// (1): Price is over the 200 EMA line. (EMA level configurable by the user)
// (2): "D+" is OVER the "D-" line
// (3): RSI 7 is under 30 (for SELL, RSI 7 is over 70)
// 1* = The ultimate is to have a combination line of 3 EMA values, EMA 14, EMA 50 and EMA 200 - And if price is over this "combo" line, then it's a strong signal

// == STRATEGY ENTRIES/EXITS == 
strategy.entry("Long", strategy.long, when = buySignal)
strategy.close("Long", when = sellCoverSignal)
strategy.entry("Short", strategy.short, when = shortSignal)
strategy.close("Short", when = sellCoverSignal)
    
// == ALERTS == 
// alertcondition(buySignal, title='ADX Trigger Buy', message='ADX Trigger Buy')
// alertcondition(sellSignal, title='ADX Trigger Sell', message='ADX Trigger Sell')

Thêm nữa