
Strategi ini merupakan strategi pelacakan tren yang menggabungkan indikator ATR dan indikator ADX. Strategi ini akan secara dinamis menyesuaikan kelipatan ATR sesuai dengan kondisi tren pasar, sehingga memungkinkan pelacakan tren yang lebih baik.
Strategi ini didasarkan pada indikator ATR dan ADX.
Pertama, menghitung rentang fluktuasi yang sebenarnya (ATR) dan ADX. ATR mencerminkan tingkat fluktuasi pasar, dan ADX menilai kekuatan tren.
Kemudian, berdasarkan perbedaan ADX dengan indikator DX, menilai kondisi kosong tren saat ini. Jika DI+ lebih tinggi dari DI-, maka tren multihead, jika DI- lebih tinggi dari DI+, maka tren headless.
Selanjutnya, menggunakan ATR yang lebih besar (m1) saat ADX naik dan ATR yang lebih kecil (m2) saat ADX turun, untuk melakukan penyesuaian dinamis. Inilah inti dari strategi ini.
Akhirnya, dengan menggabungkan ATR dan nilai rata-rata harga, perhitungan naik turun, dan kemudian menilai arah tren. Lihatlah lebih banyak ketika harga menembus tren naik, dan lihatlah lebih sedikit ketika harga menembus tren turun.
Jadi, strategi ini menggabungkan indikator ATR dan indikator ADX, dan dengan menyesuaikan parameter ATR secara dinamis, dapat menangkap tren yang lebih baik untuk perdagangan.
Strategi ini memiliki beberapa keuntungan yang jelas:
Jadi, ini adalah strategi pelacakan tren yang sangat praktis, dengan kemampuan kontrol mundur yang sangat baik dan sangat disarankan.
Strategi ini juga memiliki beberapa risiko:
Oleh karena itu, perlu diperhatikan pengoptimalan parameter dan pengendalian risiko. Selain itu, peristiwa Black Swan juga akan berdampak besar pada strategi.
Strategi ini dapat dioptimalkan dari beberapa arah:
Oleh karena itu, strategi ini masih memiliki banyak ruang untuk pengoptimalan, dan perlu untuk menyesuaikan parameter dan mekanisme untuk masalah tersebut.
Strategi tren ATR-ADX yang beradaptasi secara otomatis sangat bagus untuk V2 secara keseluruhan, dengan menyesuaikan parameter ATR secara dinamis, dapat menangkap tren dengan baik; dan memiliki toleransi kesalahan yang kuat dalam kombinasi penilaian kedua indikator ATR dan ADX. Namun, kita juga harus memperhatikan pengendalian risiko dan pengoptimalan strategi untuk mencegah keterlambatan dan perluasan kerugian. Secara keseluruhan, strategi ini layak untuk dipelajari dan diterapkan.
/*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