동적 상승 ADX 트렌드 전략

저자:차오장, 날짜: 2023-12-11 17:18:32
태그:

img

전반적인 설명

이 전략은 ADX 지표의 동적 변화를 추적하여 시기의 트렌드를 따라 시장 트렌드의 초기 변화를 포착합니다. ADX가 낮은 수준에서 빠르게 상승하면 진입할 수있는 좋은 기회를 제공하는 트렌드가 형성되고 있음을 신호합니다. 이동 평균의 도움으로 잘못된 신호를 효과적으로 필터링 할 수 있습니다.

전략 논리

이 전략의 핵심은 ADX 지표의 역동적 변화에 따라 트렌드 발전을 판단하는 데 있습니다. 낮은 ADX는 트렌드의 작은 변동을 의미합니다. ADX가 낮은 수준에서 빠르게 상승하면 트렌드가 형성되고 있음을 신호합니다. 전략은 ADX의 급격한 상승을 모니터링함으로써 트렌드 출현을 포착합니다.

특히, 입력 신호는 다음 요소로 구성됩니다.

  1. ADX가 임계값을 넘어서면 (예: 10)
  2. ADX는 급격히 상승합니다.
  3. 값은 단순 또는 기하급수적 이동 평균보다 높습니다.

위의 모든 조건이 충족되면, 그것은 길게 갈 상승 추세가 형성되고 있음을 신호합니다. 가격이 이동 평균 이하로 떨어지면, 포지션을 닫습니다. 두 개의 이동 평균은 추세를 더 정확하게 판단하는 데 사용됩니다.

스톱 로스 로직은 비슷합니다. ADX가 급격히 하락할 때 쇼트하고, 가격이 이동 평균보다 상승할 때 포지션을 닫습니다.

이점 분석

여기서 가장 큰 장점은 신흥 트렌드를 적시에 포착하는 것입니다. 절대 ADX 값을 보는 전통적인 방법은 종종 트렌드를 호출하기 위해 20 또는 25 이상의 확인을 필요로하므로 최적의 입시 시기를 놓치고 있습니다. 이 전략은 ADX의 급속한 상승을 추적함으로써 트렌드의 초기 발전을 파악합니다.

또한 이동 평균은 잘못된 신호를 효과적으로 필터링하여 전략의 안정성을 향상시킵니다.

위험 및 최적화 분석

가장 큰 위험은 ADX 자체의 후진성에서 비롯됩니다. 후진을 줄이기 위해 빠른 상승을 잡음에도 불구하고 여전히 약간의 지연이 있습니다. 이것은 빠르게 역전되는 일부 시장을 놓치게합니다.

또한 ADX 는 트렌드를 완벽하게 판단 할 수 없으며 필연적으로 때때로 잘못 진단합니다. 이동 평균은 약간의 잡음을 필터하지만 추가 최적화가 필요합니다.

이 전략의 최적화를 위해 여전히 많은 공간이 있으며, 주로 추세를 포착하는 ADX의 정확성을 향상시킵니다. 기계 학습과 같은 방법을 탐구 할 수 있으며, ADX 변화에 따라 확률 분포를 예측하는 훈련 모델을 테스트 할 수 있습니다. 매개 변수 조정, 추가 지표 등과 같은 다른 측면도 테스트 할 수 있습니다.

결론

이 동적인 상승 ADX 추세에 따른 전략은 급격한 ADX 상승을 식별하여 추세를 신속하게 파악하여 추세를 추적합니다. 가장 큰 장점은 초기 트렌드 발전을 효과적으로 포착하는 시간에 대한 민첩성입니다. 한편, 지속적인 최적화와 테스트를 요구하는 잘못된 판단의 위험이 남아 있습니다.


/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
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/
// © dhilipthegreat

//@version=4
//Rising ADX strategy

strategy(title="Rising ADX strategy", overlay=false)

adxlen = input(14, title="ADX Length", minval=1)
threshold = input(10, title="threshold", minval=5)

hline(threshold, color=color.black, linestyle=hline.style_dashed)

atype = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen=input(20, title="Moving average 1 ",minval=1, maxval=50)
avg = atype == 1 ? sma(close,malen) : atype == 2 ? ema(close,malen) : atype == 3 ? wma(close,malen) : atype == 4 ? hma(close,malen) : na

atype2 = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen2=input(20, title="Moving average 2",minval=1, maxval=200)
avg2 = atype2 == 1 ? sma(close,malen2) : atype2 == 2 ? ema(close,malen2) : atype2 == 3 ? wma(close,malen2) : atype2 == 4 ? hma(close,malen2) : na

//ADX&DI
dilen = 14
dirmov(len,_high,_low,_tr) =>
	up = change(_high)
	down = -change(_low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(_tr, len)
	
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)

	[plus, minus]

adx(dilen, adxlen,_high,_low,_tr) =>
	[plus, minus] = dirmov(dilen,_high,_low,_tr)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

[plus, minus] = dirmov(dilen,high,low,tr)
sig = adx(dilen, adxlen,high,low,tr)
prev_sig = adx(dilen, adxlen,high[1],low[1],tr)
plot(sig ? sig : na, color = rising(sig, 1) ? color.lime : falling(sig, 1) ? color.orange : color.purple, title="ADX",linewidth=2)

//////
longCondition=  sig > threshold  and rising(sig, 1) and falling(prev_sig, 1) and close > avg and close > avg2
barcolor(longCondition ? color.yellow: na)
Long_side = input(true, "Long side")
if Long_side
    strategy.entry(id="Long", long=true,  when= longCondition  and strategy.position_size<1)
    exitCondition=  (rising(prev_sig, 1) and falling(sig, 1)) or close < avg and close < avg2
    strategy.close(id="Long",comment="L exit",    qty=strategy.position_size ,   when= exitCondition)   //close all

shortCondition=  sig > threshold  and rising(sig, 1) and falling(prev_sig, 1) and close < avg and close < avg2
barcolor(shortCondition ? color.gray: na)
Short_side = input(true, "Short side")
if Short_side
    strategy.entry(id="Short", long=false,  when= shortCondition  and strategy.position_size<1)
    sell_exitCondition=  (rising(prev_sig, 1) and falling(sig, 1)) or close > avg and close > avg2
    strategy.close(id="Short",comment="S exit",    qty=strategy.position_size ,   when= sell_exitCondition)   //close all

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

barcolor(strategy.position_size<0 ? color.orange: na)
bgcolor(strategy.position_size<0 ? color.orange: na)

더 많은