이 전략은 시장 방향 및 보유 기간을 결정하기 위해 방향 움직임 지표 (ADX), 더 나아가 방향 지표 (DI +) 및 빠르고 느린 이동 평균을 결합합니다. 트렌드 다음 거래 전략에 속합니다. 이 전략은 중장기 및 단기간에 반전 지점을 효과적으로 포착 할 수 있으며 낮은 변동성과 명백한 트렌딩 시장에서 잘 수행합니다.
이 전략의 핵심 논리는 +DI 라인이 ADX 라인의 위를 밑에서 위로 넘을 때 구매 신호를 생성하고, +DI 라인이 ADX 라인의 아래를 위에서 아래로 넘을 때 판매 신호를 생성하는 것입니다. 따라서 이 전략은 시장 추세와 반전 지점을 결정하기 위해 DI와 ADX 사이의 교차에 의존합니다. 동시에 빠른 및 느린 이동 평균 사이의 관계는 전체 시장 추세를 결정하는 데 사용됩니다. 빠른 EMA가 느린 EMA보다 높을 때만 거래 신호가 고려됩니다.
특히 다음 조건이 충족되면 구매 신호가 발사됩니다.
다음 조건이 충족되면 판매 신호가 발사됩니다.
이 전략은 또한 스톱 로스 로직을 적용하여 가격이 스톱 로스 수준 이하로 떨어지면 모든 포지션을 종료합니다.
이 전략은 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