
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.
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.
Chiến lược này có một số lợi thế rõ ràng:
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ị.
Chiến lược này cũng có một số rủi ro:
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.
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
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.
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.
/*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