
이 전략은 이동 지수 평균 ((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 및 평균선 지표와 결합하여 시장 추세 전환점을 효과적으로 판단할 수 있다. 다음과 같은 장점이 있다:
이 전략에는 몇 가지 위험도 있습니다.
이러한 위험에는 ADX 및 평균 변수를 최적화하고, 중지 수준을 조정하고, 다른 지표 확인 신호와 결합하여 개선 할 수 있습니다.
이 전략에는 더 많은 최적화 가능성이 있습니다:
이 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