Chiến lược xu hướng ATR-ADX thích ứng V2


Ngày tạo: 2023-12-05 18:08:14 sửa đổi lần cuối: 2023-12-05 18:08:14
sao chép: 0 Số nhấp chuột: 1056
1
tập trung vào
1619
Người theo dõi

Chiến lược xu hướng ATR-ADX thích ứng V2

Tổng quan

Chiến lược này là một chiến lược theo dõi xu hướng kết hợp với chỉ số ATR và chỉ số ADX. Nó sẽ điều chỉnh động số nhân của ATR theo tình trạng xu hướng của thị trường, để theo dõi xu hướng tốt hơn.

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

Chiến lược này chủ yếu dựa trên chỉ số ATR và ADX.

Đầu tiên, tính toán phạm vi biến động thực sự (ATR) và ADX. ATR phản ánh mức độ biến động của thị trường, ADX đánh giá cường độ của xu hướng.

Sau đó, dựa trên sự chênh lệch của chỉ số DX của ADX, đánh giá trạng thái trống của xu hướng hiện tại. Nếu DI + cao hơn DI - thì xu hướng đa đầu, nếu DI - cao hơn DI +, thì xu hướng không đầu.

Tiếp theo, khi ADX tăng, sử dụng một ATR lớn hơn ((m1)), khi ADX giảm, sử dụng một ATR nhỏ hơn ((m2)), để thực hiện điều chỉnh động. Đây là cốt lõi của chiến lược.

Cuối cùng, kết hợp giá trị trung bình của ATR và giá, tính ra đường lên đường xuống, sau đó đánh giá xu hướng. Xem nhiều khi giá phá vỡ đường lên, xem không khi giá phá vỡ đường xuống.

Vì vậy, chiến lược này kết hợp chỉ số ATR và chỉ số ADX, bằng cách điều chỉnh động các tham số ATR để có thể nắm bắt được xu hướng giao dịch tốt hơn.

Phân tích lợi thế

Chiến lược này có một số lợi thế rõ ràng:

  1. Có thể điều chỉnh các tham số động để nắm bắt xu hướng tốt hơn
  2. Kết hợp hai chỉ số ATR và ADX để đánh giá toàn diện hơn
  3. Sự rút lui có thể được kiểm soát ở một mức độ nhất định.
  4. Quá trình thực hiện đơn giản và dễ hiểu

Vì vậy, đây là một chiến lược theo dõi xu hướng rất thực tế, có khả năng kiểm soát lùi rất tốt và đáng được đề nghị.

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 bị tụt hậu, có thể bỏ lỡ điểm chuyển hướng
  2. ATR không được chọn đúng kích thước, có thể dẫn đến lợi nhuận thấp hoặc lỗ quá lớn
  3. Vụ tai nạn khiến đường ray bị phá vỡ nhanh chóng, gây thiệt hại

Vì vậy, cần chú ý đến việc tối ưu hóa tham số và kiểm soát rủi ro. Ngoài ra, sự cố Thiên nga đen cũng có thể gây ra tác động lớn đến chiến lược.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các hướng sau:

  1. Tối ưu hóa các tham số của ATR và ADX để nắm bắt được xu hướng tốt hơn
  2. Thêm xác nhận các chỉ số khác để tránh sự chậm trễ của ADX
  3. Xây dựng cơ chế dừng lỗ động để kiểm soát tổn thất đơn lẻ
  4. Điều chỉnh quản lý vị trí, sử dụng các chiến lược khác nhau trong các môi trường thị trường khác nhau

Vì vậy, chiến lược này vẫn còn rất nhiều không gian để tối ưu hóa, điều chỉnh các tham số và cơ chế để đáp ứng các vấn đề là rất cần thiết.

Tóm tắt

Chiến lược tự điều chỉnh xu hướng ATR-ADX V2 nói chung rất tốt, có thể nắm bắt xu hướng tốt bằng cách điều chỉnh các tham số ATR một cách động; đồng thời kết hợp hai chỉ số ATR và ADX, có khả năng chịu lỗi mạnh mẽ. Nhưng chúng ta cũng phải chú ý đến kiểm soát rủi ro và tối ưu hóa chiến lược để ngăn chặn sự trì trệ và mở rộng lỗ. Nói chung, chiến lược này đáng để học và áp dụng.

Mã nguồn chiến lược
/*backtest
start: 2022-11-28 00:00:00
end: 2023-12-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// From mortdiggiddy's indicator to strategy
// See also: https://www.tradingview.com/u/mortdiggiddy/

strategy(title = "Adaptive ATR-ADX Trend V2", shorttitle = "Adaptive ATR V2 Strategy", overlay = true)

//Mode
src = input(title = "Source",  defval = hlc3)
atrLen = input(title = "ATR",  defval = 21, minval = 1, maxval = 100)
m1 = input(title = "ATR Multiplier - ADX Rising", type = float, defval = 3.5, minval = 1, step = 0.1, maxval = 100)
m2 = input(title = "ATR Multiplier - ADX Falling", type = float, defval = 1.75, minval = 1, step = 0.1, maxval = 100)

adxLen = input(title = "ADX",  defval = 14, minval = 1, maxval = 100)
adxThresh = input(title = "ADX Threshold",  defval = 30, minval = 1)
aboveThresh = input(true, title = "ADX Above Threshold uses ATR Falling Multiplier Even if Rising?")
useHeiken = input(false, title = "Use Heiken-Ashi Bars (Source will be ohlc4)")
    
// DI-Pos, DI-Neg, ADX

hR = change(high)
lR = -change(low)

dmPos = hR > lR ? max(hR, 0) : 0
dmNeg = lR > hR ? max(lR, 0) : 0

sTR = nz(sTR[1]) - nz(sTR[1]) / adxLen + tr
sDMPos = nz(sDMPos[1]) - nz(sDMPos[1]) / adxLen + dmPos
sDMNeg = nz(sDMNeg[1]) - nz(sDMNeg[1]) / adxLen + dmNeg

DIP = sDMPos / sTR * 100
DIN = sDMNeg / sTR * 100
DX = abs(DIP - DIN) / (DIP + DIN) * 100
adx = sma(DX, adxLen)

// Heiken-Ashi

xClose = ohlc4
xOpen = (nz(xOpen[1]) + nz(close[1])) / 2
xHigh = max(high, max(xOpen, xClose))
xLow = min(low, min(xOpen, xClose))

// Trailing ATR

v1 = abs(xHigh - xClose[1])
v2 = abs(xLow - xClose[1])
v3 = xHigh - xLow

trueRange = max(v1, max(v2, v3))
atr = useHeiken ? rma(trueRange, atrLen) : atr(atrLen)

m = rising(adx, 1) and (adx < adxThresh or not aboveThresh) ? m1 : falling(adx, 1) or (adx > adxThresh and aboveThresh) ? m2 : nz(m[1])
mUp = DIP >= DIN ? m : m2
mDn = DIN >= DIP ? m : m2

src_ = useHeiken ? xClose : src
c = useHeiken ? xClose : close
t = useHeiken ? (xHigh + xLow) / 2 : hl2

up = t - mUp * atr
dn = t + mDn * atr

TUp = max(src_[1], c[1]) > TUp[1] ? max(up, TUp[1]) : up
TDown = min(src_[1], c[1]) < TDown[1] ? min(dn, TDown[1]) : dn

trend = min(src_, min(c, close)) > TDown[1] ? 1 : max(src_, max(c, close)) < TUp[1]? -1 : nz(trend[1], 1)
stop = trend == 1 ? TUp : TDown
trendChange = change(trend)

longCondition = (trendChange > 0)
if (longCondition)
    strategy.entry("long", strategy.long)
shortCondition = (trendChange < 0)
if (shortCondition)
    strategy.entry("short", strategy.short)    
    
// Plot

lineColor = not(trendChange) ? trend > 0 ? #00FF00DD : #FF0000DD : #00000000
shapeColor = trendChange ? trendChange > 0 ? #00FF00F8 : #FF0000F8 : #00000000

plot(stop, color = lineColor, style = line, linewidth = 1, title = "ATR Trend")
plotshape(trendChange ? stop : na, style = shape.circle, size = size.tiny, location = location.absolute, color = shapeColor, title = "Change")

alertcondition(trendChange > 0, title = "ATR-ADX Change Up", message = "ATR-ADX Change Up")
alertcondition(trendChange < 0, title = "ATR-ADX Change Down", message = "ATR-ADX Change Down")

// end