
Эта стратегия является стратегией отслеживания тенденций в сочетании с показателями ATR и ADX. Она динамически корректирует кратность ATR в зависимости от состояния тенденций на рынке, что позволяет лучше отслеживать тенденции.
Стратегия основана на показателях ATR и ADX.
Во-первых, рассчитывается реальный диапазон колебаний (ATR) и ADX. ATR отражает степень колебаний рынка, а ADX определяет силу тренда.
Затем, исходя из разницы между ADX и показателем DX, оценить текущий тренд. Если DI+ выше DI-, то это многоголовый тренд, если DI- выше DI+, то это пустой тренд.
Затем, когда ADX повышается, используется больший ATR-множитель ((m1)), а когда ADX снижается, используется меньший ATR-множитель ((m2)), что позволяет осуществлять динамическую корректировку. Это лежит в основе стратегии.
Наконец, среднее значение ATR и цены, рассчитанное вверх и вниз, определяет направление тенденции. Посмотрите на то, когда цена пробивает вверх, и смотрите на то, когда цена пробивает вниз.
Таким образом, стратегия объединяет показатели ATR и ADX, динамически регулируя параметры ATR, чтобы лучше улавливать тенденции для торговли.
Эта стратегия имеет несколько очевидных преимуществ:
Таким образом, это очень полезная стратегия для отслеживания трендов, а также отличная возможность отмены контроля.
Однако эта стратегия также несет в себе некоторые риски:
Поэтому необходимо обратить внимание на оптимизацию параметров и управление рисками. Кроме того, события с черными лебедями могут оказать большое влияние на стратегию.
Эта стратегия может быть оптимизирована в следующих направлениях:
Таким образом, в этой стратегии остается много возможностей для оптимизации, и необходимо скорректировать параметры и механизмы в соответствии с проблемами.
Стратегия ATR-ADX, адаптирующаяся к тенденциям, в целом отлична для V2, она может хорошо улавливать тенденции путем динамической корректировки параметров ATR; при этом в сочетании с двумя показателями ATR и ADX, она имеет высокую погрешность. Но мы также должны обратить внимание на контроль риска и оптимизацию стратегии, чтобы предотвратить отставание и увеличение убытков. В целом, эта стратегия стоит изучения и применения.
/*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