적응 가능한 ATR-ADX 트렌드 전략 V2

저자:차오장, 날짜: 2023-12-05 18:08:14
태그:

img

전반적인 설명

이것은 ATR 지표와 ADX 지표를 결합한 트렌드 다음 전략입니다. 더 나은 트렌드 추적을 달성하기 위해 시장 트렌드 조건에 따라 ATR 곱셈자를 동적으로 조정합니다.

전략 논리

이 전략은 주로 ATR 지표와 ADX 지표에 기반합니다.

첫째, True Range (ATR) 와 ADX를 계산합니다. ATR은 시장의 변동성을 반영하고 ADX는 트렌드 강도를 판단합니다.

둘째, ADX 지표의 DI+와 DI-의 차이에 따라 현재 트렌드 방향을 결정합니다. DI+가 DI-보다 높다면 상승 추세입니다. DI-가 DI+보다 높다면 하락 추세입니다.

ADX가 상승할 때, 더 큰 ATR 곱셈 (m1) 을 사용합니다. ADX가 떨어질 때, 더 작은 ATR 곱셈 (m2) 을 사용하여 동적 조정을 달성합니다. 이것은 전략의 핵심입니다.

마지막으로, ATR 및 가격의 중간점과 결합하여 상위 및 하위 대역을 계산하여 트렌드 방향을 결정합니다. 가격이 상위 대역을 넘으면 길게됩니다. 가격이 하위 대역을 넘으면 짧게됩니다.

그래서 전략은 ATR와 ADX를 통합하고, 동적으로 ATR 매개 변수를 조정함으로써 거래 트렌드를 더 잘 파악할 수 있습니다.

이점 분석

이 전략은 몇 가지 명백한 장점을 가지고 있습니다.

  1. 더 나은 트렌드 포착을 위해 매개 변수를 동적으로 조정 할 수 있습니다.
  2. 더 포괄적인 판단을 위해 ATR와 ADX를 결합합니다.
  3. 통제된 채용을 기대합니다.
  4. 간단하고 이해하기 쉬운 구현

따라서, 이것은 좋은 유출 통제와 함께 전략을 따르는 매우 실용적인 추세입니다. 추천 할 가치가 있습니다.

위험 분석

이 전략은 또한 몇 가지 위험을 안고 있습니다.

  1. ADX가 지연 문제, 트렌드 반전 지점을 놓칠 수 있습니다
  2. 부적절한 ATR 크기의 선택은 적당한 이익 또는 너무 큰 스톱 로스로 이어질 수 있습니다.
  3. 블랙 스완 사건으로 인한 밴드들에 대한 급속한 탈출은 손실로 이어질 수 있습니다.

그래서 매개 변수 최적화와 위험 통제는 주의가 필요합니다. 또한 블랙 스완 사건은 더 큰 영향을 줄 수 있습니다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 더 나은 트렌드 포착을 위해 ATR 및 ADX의 매개 변수를 최적화
  2. ADX 후속 문제를 피하기 위해 확인을 위한 다른 지표를 추가합니다.
  3. 단일 거래 손실을 통제하기 위해 동적 스톱 로스 메커니즘을 구축
  4. 다른 시장 환경에 대한 위치 크기를 조정합니다.

따라서 문제들에 따라 매개 변수와 메커니즘을 조정함으로써 최적화할 여지가 여전히 많습니다.

결론

일반적으로, 이 적응성 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

더 많은