Chiến lược này thực hiện theo dõi xu hướng kịp thời bằng cách theo dõi sự thay đổi động lực của chỉ số ADX, nắm bắt sự thay đổi ban đầu của xu hướng thị trường. Khi ADX tăng nhanh từ mức thấp, điều này cho thấy xu hướng đang hình thành, đây là thời điểm tốt để tham gia.
Chiến lược này chủ yếu dựa trên sự thay đổi động lực của chỉ số ADX để đánh giá sự phát triển của xu hướng. Khi chỉ số ADX ở mức thấp, nó đại diện cho sự thay đổi xu hướng không lớn; khi ADX tăng nhanh từ mức thấp, nó cho thấy xu hướng đang hình thành. Chiến lược này nắm bắt sự phát triển của xu hướng bằng cách theo dõi sự tăng nhanh của ADX.
Cụ thể hơn, chiến lược này được đánh giá dựa trên một số điều kiện:
Khi các điều kiện trên được đáp ứng cùng một lúc, đại diện cho xu hướng đang hình thành, làm nhiều hơn; khi hiện tại đi qua đường trung bình di chuyển, bằng phẳng. Sử dụng hai đường trung bình di chuyển, bạn có thể đánh giá chính xác hơn về sự phát triển của xu hướng.
Các điều kiện dừng lỗ cũng tương tự, khi ADX giảm nhanh xuống, nó sẽ tháo dỡ; khi giá phá vỡ đường trung bình di chuyển, nó sẽ tháo dỡ.
Lợi thế lớn nhất của chiến lược này là bắt kịp sự phát triển của xu hướng. Phương pháp truyền thống chỉ nhìn vào giá trị ADX, thường phải chờ ADX tăng lên 20 hoặc 25 để xác nhận xu hướng, điều này đã bỏ lỡ thời gian nhập cảnh tốt nhất. Chiến lược này có thể nắm bắt được sự phát triển của xu hướng bằng cách theo dõi sự gia tăng nhanh chóng của ADX.
Ngoài ra, chiến lược cũng giới thiệu các trung bình di chuyển để hỗ trợ, có thể lọc một số trường hợp chẩn đoán sai và cải thiện tính ổn định của chiến lược.
Rủi ro lớn nhất của chiến lược này là sự chậm trễ của chỉ số ADX. Mặc dù có thể thu hẹp sự chậm trễ bằng cách theo dõi các giai đoạn tăng nhanh, nhưng vẫn còn một số sự chậm trễ. Điều này sẽ khiến một số thị trường đảo ngược nhanh chóng không thể bị bắt.
Ngoài ra, chỉ số ADX cũng không chính xác 100% trong việc đánh giá xu hướng, và chắc chắn sẽ có một số chẩn đoán sai. Mặc dù giới thiệu trung bình di chuyển có thể lọc một số tiếng ồn, nhưng vẫn cần tối ưu hóa hơn nữa.
Chiến lược này vẫn còn rất nhiều không gian tối ưu hóa, chìa khóa là nâng cao hơn nữa độ chính xác chụp các chỉ số ADX. Các phương pháp như giới thiệu học máy, mô hình đào tạo để đánh giá phân bố xác suất sau khi thay đổi ADX có thể được xem xét. Ngoài ra, bạn cũng có thể thử các kết hợp tham số khác nhau, các phương pháp hỗ trợ khác để tối ưu hóa thử nghiệm.
Chiến lược theo dõi xu hướng ADX tăng động này, bằng cách nắm bắt các điểm thay đổi của thị trường khi ADX tăng nhanh, để theo dõi xu hướng kịp thời. Ưu điểm lớn nhất là thời gian cực kỳ nhanh chóng, có thể nắm bắt xu hướng hiệu quả sớm.
/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
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/
// © dhilipthegreat
//@version=4
//Rising ADX strategy
strategy(title="Rising ADX strategy", overlay=false)
adxlen = input(14, title="ADX Length", minval=1)
threshold = input(10, title="threshold", minval=5)
hline(threshold, color=color.black, linestyle=hline.style_dashed)
atype = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen=input(20, title="Moving average 1 ",minval=1, maxval=50)
avg = atype == 1 ? sma(close,malen) : atype == 2 ? ema(close,malen) : atype == 3 ? wma(close,malen) : atype == 4 ? hma(close,malen) : na
atype2 = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen2=input(20, title="Moving average 2",minval=1, maxval=200)
avg2 = atype2 == 1 ? sma(close,malen2) : atype2 == 2 ? ema(close,malen2) : atype2 == 3 ? wma(close,malen2) : atype2 == 4 ? hma(close,malen2) : na
//ADX&DI
dilen = 14
dirmov(len,_high,_low,_tr) =>
up = change(_high)
down = -change(_low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = rma(_tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen,_high,_low,_tr) =>
[plus, minus] = dirmov(dilen,_high,_low,_tr)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
[plus, minus] = dirmov(dilen,high,low,tr)
sig = adx(dilen, adxlen,high,low,tr)
prev_sig = adx(dilen, adxlen,high[1],low[1],tr)
plot(sig ? sig : na, color = rising(sig, 1) ? color.lime : falling(sig, 1) ? color.orange : color.purple, title="ADX",linewidth=2)
//////
longCondition= sig > threshold and rising(sig, 1) and falling(prev_sig, 1) and close > avg and close > avg2
barcolor(longCondition ? color.yellow: na)
Long_side = input(true, "Long side")
if Long_side
strategy.entry(id="Long", long=true, when= longCondition and strategy.position_size<1)
exitCondition= (rising(prev_sig, 1) and falling(sig, 1)) or close < avg and close < avg2
strategy.close(id="Long",comment="L exit", qty=strategy.position_size , when= exitCondition) //close all
shortCondition= sig > threshold and rising(sig, 1) and falling(prev_sig, 1) and close < avg and close < avg2
barcolor(shortCondition ? color.gray: na)
Short_side = input(true, "Short side")
if Short_side
strategy.entry(id="Short", long=false, when= shortCondition and strategy.position_size<1)
sell_exitCondition= (rising(prev_sig, 1) and falling(sig, 1)) or close > avg and close > avg2
strategy.close(id="Short",comment="S exit", qty=strategy.position_size , when= sell_exitCondition) //close all
barcolor(strategy.position_size>1 ? color.lime: na)
bgcolor(strategy.position_size>1 ? color.lime: na)
barcolor(strategy.position_size<0 ? color.orange: na)
bgcolor(strategy.position_size<0 ? color.orange: na)