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

Tác giả:ChaoZhang, Ngày: 2023-12-05 18:08:14
Tags:

img

Tổng quan

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

Chiến lược logic

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

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

Thứ hai, nó xác định hướng xu hướng hiện tại theo sự khác biệt giữa DI + và DI- trong chỉ số ADX. Nếu DI + cao hơn DI-, đó là xu hướng tăng. Nếu DI- cao hơn DI+, đó là xu hướng giảm.

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

Cuối cùng, kết hợp với ATR và điểm trung bình của giá, nó tính toán các dải trên và dưới để xác định hướng xu hướng. Khi giá vượt qua dải trên, nó đi dài. Khi giá vượt qua dải dưới, nó đi ngắn.

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

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ố một cách động để nắm bắt xu hướng tốt hơn
  2. Kết hợp ATR và ADX để đánh giá toàn diện hơn
  3. Dự kiến thu hút được kiểm soát
  4. Thực hiện đơn giản và dễ hiểu

Do đó, đây là một xu hướng rất thực tế sau chiến lược với kiểm soát rút tiền tốt.

Phân tích rủi ro

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

  1. ADX có vấn đề chậm, có thể bỏ lỡ các điểm đảo ngược xu hướng
  2. Lựa chọn kích thước ATR không chính xác có thể dẫn đến lợi nhuận không đủ hoặc stop loss quá lớn
  3. Sự đột phá nhanh chóng chống lại các ban nhạc gây ra bởi các sự kiện thiên nga đen có thể dẫn đến tổn thất

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

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa các tham số của ATR và ADX để nắm bắt xu hướng tốt hơn
  2. Thêm các chỉ số khác để xác nhận để tránh các vấn đề chậm ADX
  3. Xây dựng các cơ chế dừng lỗ năng động để kiểm soát lỗ giao dịch duy nhất
  4. Điều chỉnh kích thước vị trí cho các môi trường thị trường khác nhau

Vì vậy, vẫn còn nhiều chỗ để tối ưu hóa bằng cách điều chỉnh các tham số và cơ chế theo các vấn đề.

Kết luận

Nhìn chung, Adaptive ATR-ADX Trend Strategy V2 hoạt động rất tốt. Bằng cách điều chỉnh động các thông số ATR, nó nắm bắt được xu hướng tốt đẹp. Ngoài ra, kết hợp hai chỉ số trong ATR và ADX làm cho nó mạnh mẽ hơn. Nhưng chúng ta vẫn cần chú ý đến kiểm soát rủi ro và tối ưu hóa để ngăn chặn sự tụt hậu và mất mát quá lớn. Nhìn chung, chiến lược này rất đáng để học và áp dụng.


/*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

Thêm nữa