적응형 ATR-ADX 트렌드 전략 V2


생성 날짜: 2023-12-05 18:08:14 마지막으로 수정됨: 2023-12-05 18:08:14
복사: 0 클릭수: 1056
avatar of ChaoZhang ChaoZhang
1
집중하다
1619
수행원

적응형 ATR-ADX 트렌드 전략 V2

개요

이 전략은 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 파라미터를 동적으로 조정하여 트렌드를 더 잘 포착하고 거래할 수 있습니다.

우위 분석

이 전략에는 몇 가지 분명한 장점이 있습니다.

  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