
이 전략은 Chande Kroll 중지 지표와 평균 트렌드 지표 ((ADX) 지표를 결합하여 비교적 간단한 트렌드 추적 전략을 구현한다. Chande Kroll 중단은 장단한 입점 신호를 생성하는 데 사용되며, ADX는 명백한 추세가없는 시장 상황을 필터링하여 방향없는 흔들림 시장으로 인해 중단이 반복적으로 유발되는 것을 방지한다.
이 전략은 먼저 Chande Kroll 스톱의 긴 라인 stop_long과 짧은 라인 stop_short을 계산한다. 긴 라인은 지난 p 주기 동안의 최고 가격으로 계산하고, 짧은 라인은 지난 p 주기 동안의 최저 가격으로 계산한다. 그리고는 지난 q 주기 동안의 긴 짧은 라인의 최고점과 최저점을 현재의 긴 짧은 스톱 라인으로 사용한다.
종결 가격 위에 짧은 선을 넘으면 stop_short, 다중 신호를 생성한다. 종결 가격 아래 긴 선을 넘으면 stop_long, 공백 신호를 생성한다.
또한, 전략에 ADX 지표가 포함되면 추세가 강하거나 약하다고 판단한다. ADX가 하락보다 크면만 스톱 신호가 발동된다. 이것은 평형 흔들림에서 스톱의 잘못된 보고를 필터링 할 수 있다.
이 전략은 트렌드 지표와 스톱 지표의 장점을 결합하여 트렌드 회전을 적시에 포착하고 방향없는 시장의 휘프 사우를 피할 수 있습니다. Chande Kroll의 스톱 지수의 최적화는 파도를 평형화하여 트렌드 회전 때만 스톱을 보장합니다. ADX 지표는 트렌드가 분명할 때만 진입하여 흔들리는 시장의 스톱 점프를 피할 수 있습니다.
ADX 파라미터를 잘못 설정하면 트렌드 시작 기회를 놓칠 수 있다. ADX 임계값이 너무 높게 설정되면 트렌드 시작 단계에서 ADX 값이 너무 낮아 진입 기회를 놓칠 수 있다.
스톱포스트가 지나치게 가까워지면 전략 포지션이 자주 열리고 닫힐 수도 있다. 이는 거래비용과 슬라이드포스트 비용을 증가시킨다. 스톱포스트는 합리적인 설정이 필요하며, 트렌드에 일정한 관점을 부여한다.
ADX가 어떤 하위치를 넘으면만 스톱 신호가 트리핑될 수 있도록 허용하는 것을 고려할 수 있으며, 이는 진입 시기의 신뢰성을 높일 수 있다. 또한 다른 트렌드 지표와 결합하여 조합 판단을 할 수 있다. 예를 들어 ADX 값과 EMA 기울기를 결합한다.
스톱 라인은 또한 ATR에 따라 동적 조정, 시장의 변동이 증가 할 때 스톱 공간을 확장, 너무 민감하지 않도록 고려 할 수 있습니다. 또는 MACD와 같은 보조 지표 평가 경향 강약, 동적 조정 스톱 라인을 결합 할 수 있습니다.
이 전략은 Chande Kroll 중지 및 ADX 지표의 장점을 통합하여, 비교적 간단하고 실용적인 트렌드 추적 전략을 구현한다. 변수를 최적화하면 전략의 안정성과 수익성을 더욱 향상시킬 수 있다. 그러나 너무 민감한 중지 및 ADX 필터링이 너무 느슨하게 발생하는 위험을 방지하는 데 주의를 기울여야 한다.
/*backtest
start: 2022-10-30 00:00:00
end: 2023-06-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title = "Chande Kroll Stop", overlay=true)
p = input.int(10, minval=1)
x = input.int(1, minval=1)
q = input.int(9, minval=1)
first_high_stop = ta.highest(high, p) - x * ta.atr(p)
first_low_stop = ta.lowest(low, p) + x * ta.atr(p)
stop_short = ta.highest(first_high_stop, q)
stop_long = ta.lowest(first_low_stop, q)
plot(stop_long, color=color.blue)
plot(stop_short, color=color.orange)
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
ADX_sig = input.int(20, title="minimum ADX threshold for signal")
dirmov(len) =>
up = ta.change(high)
down = -ta.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 = ta.rma(ta.tr, len)
plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
if ta.crossunder(close, stop_long) and sig>ADX_sig
strategy.entry("long", strategy.long)
if ta.crossover(close, stop_short) and sig>ADX_sig
strategy.entry("short", strategy.short)