ADX 지표에 기반한 트렌드 추적 및 단기 거래 전략

저자:차오장, 날짜: 2024-01-22 17:10:55
태그:

img

전반적인 설명

이 전략은 슈퍼 트렌드, 피보트 포인트 및 평균 참 범위 (ATR) 를 결합하여 동적인 스톱 로스 라인을 형성하고, 트렌드를 판단하고 추적하기 위해 평균 방향 움직임 지표 (ADX) 지표를 결합합니다. 이 전략은 단기 거래에 적합하며 범위가 끝난 후 트렌드 지속을 포착 할 수 있습니다. 드라다운 컨트롤도 괜찮습니다.

원칙

슈퍼 트렌드 (Super Trend) 는 피보트 포인트 (Pivot Points) 와 ATR 스톱 로스 (stop loss) 와 결합하여 동적 스톱 로스 (dynamic stop loss) 라인을 통과한 가격의 방향을 판단하여 개척 방향을 결정합니다. 동시에 ADX 지표는 트렌드의 강도를 판단하고 트렌드가 충분히 강할 때만 거래 신호를 발산합니다.

특히, 피보트 포인트는 먼저 최신 지지와 저항을 얻고, 그 다음 전날의 수학적 평균과 함께 동적 중간 가격을 형성합니다. 그 다음 ATR은 계산되고 ATR 인수로 곱되고, 상위와 하위 레일을 얻기 위해 동적 중간 가격에 더하거나 빼습니다. 가격이 상위 레일을 통과하면 상승합니다. 하위 레일을 통과하면 하향합니다. ADX 지표는 트렌드의 힘을 판단하고, 트렌드가 충분히 강할 때만 거래에 참여합니다.

스톱 로스 라인은 최신 가격과 ATR 값에 따라 동적으로 조정되며 트렌드를 매우 잘 추적 할 수 있습니다.

이점 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 슈퍼 트렌드 지표를 사용하여 트렌드의 방향을 추적하여 오스실레이션 시장으로 수익을 차단하지 않도록하십시오.

  2. ADX 지표의 도움으로 트렌드의 강도를 판단하여 통합 과정에서 거래에서 오류를 피하십시오.

  3. 스톱 로스 라인은 로크 인 수익을 극대화하기 위해 동적으로 조정됩니다.

  4. RSI를 결합해서 과잉 구매와 과잉 판매를 피합니다.

  5. 전체적으로 전략 매개 변수 설정은 합리적입니다. dframe의 선택은 연속성을 고려합니다. 이익 취하고 손실을 멈추는 설정도 좋습니다.

위험 분석

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

  1. 슈퍼 트렌드 및 MA 지표는 상반된 신호를 발산할 수 있습니다.

  2. ADX 지표는 14 회로로 설정되어 있습니다. 갑작스러운 사건에 대한 민감도가 충분하지 않습니다.

  3. RSI 매개 변수는 기본으로 설정되어 있습니다. 이는 과반 구매와 과반 판매를 완전히 피하는 데 실패할 수 있습니다.

  4. 주요 나쁜 소식/좋은 소식과 같은 갑작스러운 사건의 영향은 고려되지 않았습니다.

대응 솔루션:

  1. MA 주기를 슈퍼 트렌드 지표와 일치하도록 조정합니다.

  2. 갑작스러운 사건에 대한 감수성을 높이기 위해 ADX 주기를 단축하려고 노력하십시오.

  3. 최적의 값을 찾기 위해 RSI 매개 변수를 최적화합니다.

  4. 주요 뉴스 발표를 피하기 위해 뉴스 필터 모듈을 추가합니다.

최적화

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

  1. 트렌드를 판단하기 위해 머신러닝 모델을 추가하여 더 지능적인 거래 결정을 내립니다.

  2. ADX 대신 다른 감정 지표를 도입하여 트렌드의 강도를 판단해보세요.

  3. 스톱 손실을 더 역동적이고 정확하게 만들기 위해 적응 스톱 손실 모듈을 증가시킵니다.

  4. 전체 전략을 최적화하기 위해 딥러닝 기술을 통해 더 많은 기능을 추출합니다.

  5. 전략 개발을 위해 파이썬과 같은 고급 언어를 사용하여 전략 확장성을 높입니다.

요약

전체적으로, 이 전략은 매우 실용적입니다. 핵심은 트렌드 실행의 방향을 추적하고 트렌드가 충분히 강할 때 참여하는 것입니다. 손실을 피하면서 수익을 최대화하기 위해 스톱 로스 및 수익을 취하는 설정도 매우 적합합니다. 물론, 여전히 최적화 할 여지가 있습니다. 머신 러닝과 딥 러닝 기술을 추가하면 전략을 더 효과적이고 확장 할 수 있습니다.


/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Bendre ADX STrend", overlay = true)

///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period")
AtrFactor=input(defval = 2, title = "ATR Factor")
AtrPd=input(defval = 21, title = "ATR Period")

StartDate = input(timestamp("1 Dec 2023"), title="Start Date")
EndDate = input(timestamp("12 Jan 2024"), title="End Date")
window()  => true

var float ph = na
var float pl = na
ph := ta.pivothigh(PPprd, PPprd)
pl :=ta.pivotlow(PPprd, PPprd)

float center = na
center := center[1]
// float lastpp = ph ? ph : pl ? pl : 0.0
float lastpp = na(ph) ? na(pl) ? na : pl : ph

if lastpp > 0
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

Up = center - (AtrFactor * ta.atr(AtrPd))
Dn = center + (AtrFactor * ta.atr(AtrPd))

var float TUp = na
var float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor ,  linewidth = 2, title = "PP SuperTrend")

bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl


///////
// ADX
//////

lenADX = 14
th = 14
TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = ta.sma(DX, lenADX)


//////
// MA
/////

lenMA = 21
srcMA = input(close, title="Source")
// offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
offsetMA = input(0, title="Offset")
outMA = ta.sma(srcMA, lenMA)

//
// RSI
//
length = input( 14 )
overSold = input( 30 )
overBought = input( 65 )
price = close
vrsi = ta.rsi(price, length)

//
// DMI - Direction Movement Index
// 
[diplus1, diminus1, adx] = ta.dmi(14, 14)

// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP 


if (buy and vrsi > overBought and adx > 19)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long, when = window())
    // strategy.close("Sell", "close Sell")

if (sell) and (strategy.position_size > 0)
    // strategy.entry("Sell", strategy.short)
    strategy.close("Buy", "Close Buy")

if(sell and vrsi < overSold and adx > 25)
    strategy.entry("Sell", strategy.short, when = window())

if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) )
    strategy.close("Sell", "close Sell")

// if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold)
//     strategy.entry("Sell", strategy.short, when = window())

// if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0  and (buy))
//     strategy.close("Sell", "close Sell")





더 많은