ADX 크로스오버 트렌드 거래 전략

저자:차오장, 날짜: 2023-12-08 15:49:12
태그:

img

전반적인 설명

이 전략은 시장 방향 및 보유 기간을 결정하기 위해 방향 움직임 지표 (ADX), 더 나아가 방향 지표 (DI +) 및 빠르고 느린 이동 평균을 결합합니다. 트렌드 다음 거래 전략에 속합니다. 이 전략은 중장기 및 단기간에 반전 지점을 효과적으로 포착 할 수 있으며 낮은 변동성과 명백한 트렌딩 시장에서 잘 수행합니다.

원칙

이 전략의 핵심 논리는 +DI 라인이 ADX 라인의 위를 밑에서 위로 넘을 때 구매 신호를 생성하고, +DI 라인이 ADX 라인의 아래를 위에서 아래로 넘을 때 판매 신호를 생성하는 것입니다. 따라서 이 전략은 시장 추세와 반전 지점을 결정하기 위해 DI와 ADX 사이의 교차에 의존합니다. 동시에 빠른 및 느린 이동 평균 사이의 관계는 전체 시장 추세를 결정하는 데 사용됩니다. 빠른 EMA가 느린 EMA보다 높을 때만 거래 신호가 고려됩니다.

특히 다음 조건이 충족되면 구매 신호가 발사됩니다.

  1. 빠른 EMA는 느린 EMA보다 높습니다.
  2. +DI 선이 ADX 선을 위쪽으로 가로 지르면
  3. ADX 값은 30의 기준 이하입니다.

다음 조건이 충족되면 판매 신호가 발사됩니다.

  1. ADX 값이 30의 기준을 초과합니다.
  2. +DI 선은 ADX 선을 아래로 가로지릅니다.

이 전략은 또한 스톱 로스 로직을 적용하여 가격이 스톱 로스 수준 이하로 떨어지면 모든 포지션을 종료합니다.

장점

이 전략은 DI, ADX 및 이동 평균 지표를 결합하여 시장 동향의 전환을 효과적으로 결정합니다. 주요 장점은 다음과 같습니다.

  1. 입구와 출구 지점을 정확하게 결정하기 위해 DI와 ADX 교차로를 사용
  2. 빠른 및 느린 EMA 필터 시스템으로 전체 시장 트렌드를 결정하고 나쁜 거래를 피합니다.
  3. ADX 값을 사용하여 트렌드 강도를 결정하고 트렌드가 약할 때만 거래하여 가짜 브레이크오웃을 피합니다.
  4. 하락위험을 통제하기 위한 스톱 로스 메커니즘을 포함
  5. 엄격한 입시 조건으로 상단 구매와 하단 판매를 피합니다.
  6. 명확한 탈퇴 규칙은 적시에 손실을 멈추고 이익을 취득 할 수 있습니다.

위험성

이 전략에는 몇 가지 위험 요소가 있습니다.

  1. ADX 지표는 뒤떨어진 효과를 가지고 있으며 가격 반전을위한 최고의 타이밍을 놓칠 수 있습니다.
  2. 시장 변동성이 높을 때 더 많은 잘못된 신호가 발생할 수 있습니다.
  3. 부적절한 빠르고 느린 EMA 설정은 거래가 빠질 수 있거나 유효한 신호를 필터링 할 수 있습니다.
  4. 너무 큰 스톱 로스 레벨 설정으로 위험을 효과적으로 제어할 수 없습니다.

이러한 위험은 ADX 및 이동 평균 매개 변수를 최적화하고, 스톱 손실 수준을 조정하고, 확인을 위한 필터를 추가하여 해결할 수 있습니다.

더 나은 기회

더 많은 개선이 가능합니다.

  1. 최적의 조합을 찾기 위해 다양한 길이의 ADX를 테스트합니다.
  2. 신호 확인을 위해 RSI, 볼링거 밴드 같은 다른 지표를 추가
  3. 자동으로 매개 변수와 규칙을 최적화하기 위해 기계 학습 알고리즘을 활용
  4. 늦은 단계의 위험을 완화하기 위해 중지 손실 수준을 동적으로 조정합니다.
  5. 입국 및 출입 기준을 더 견고하게 만들기 위해 다중 요소 점수 모델을 구축

결론

일반적으로 이 ADX 크로스오버 트렌드 전략은 매우 안정적이며, 초기부터 반전을 효과적으로 포착할 수 있지만, 위험 통제는 매우 중요합니다. 매개 변수를 더 이상 최적화하고, 입시 규칙을 엄격히 준수하고, 스톱 로스를 사용하면 좋은 위험 조정 수익을 얻을 수 있습니다. 이 전략은 중~단기 포지션을 보유한 장기 계정에 적합합니다.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mohanee

//@version=4
//ADX strategy
SmoothedTrueRange=0.00
SmoothedDirectionalMovementPlus=0.00
SmoothedDirectionalMovementMinus=0.00


strategy(title="ADX strategy", overlay=false,pyramiding=3, default_qty_type=strategy.fixed, default_qty_value=3,    initial_capital=10000, currency=currency.USD)

len = input(11, title="ADX Length", minval=1)
threshold = input(30, title="threshold", minval=5)

fastEma=input(13, title="Fast EMA",minval=1, maxval=50)
slowEma=input(55, title="Slow EMA",minval=10, maxval=200)
stopLoss =input(8, title="Stop Loss",minval=1)   //


TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0


SmoothedTrueRange:= nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange

SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus:= nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus

DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)

plot(DIPlus, color=color.green, title="DI+")
//plot(DIMinus, color=color.red, title="DI-")
plot(ADX, color=color.black, title="ADX")
hline(threshold, color=color.black, linestyle=hline.style_dashed)

fastEmaVal=ema(close,fastEma)
slowEmaVal=ema(close,slowEma)




//long condition
longCondition=  ADX < threshold  and crossover(DIPlus,ADX)  and fastEmaVal > slowEmaVal


barcolor(longCondition ? color.yellow: na)

strategy.entry(id="ADXLE", long=true,  when= longCondition  and strategy.position_size<1) 

barcolor(strategy.position_size>1 ? color.blue: na)
bgcolor(strategy.position_size>1 ? color.blue: na)



//Add
strategy.entry(id="ADXLE", comment="Add", long=true,  when= strategy.position_size>1 and close<strategy.position_avg_price and crossover(DIPlus,ADX) ) 


//calculate stop Loss
stopLossVal =  strategy.position_avg_price -  (strategy.position_avg_price*stopLoss*0.01)

strategy.close(id="ADXLE",comment="SL Exit",    when=close<stopLossVal)   //close all on stop loss


//exit condition
exitCondition=  ADX > threshold  and crossunder(DIPlus,ADX) // and fastEmaVal > slowEmaVal
strategy.close(id="ADXLE",comment="TPExitAll",    qty=strategy.position_size ,   when= exitCondition)   //close all     

더 많은