Đâ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 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.
Chiến lược này có một số lợi thế rõ ràng:
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.
Chiến lược này cũng có một số rủi ro:
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.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
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 đề.
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