Chande Kroll 손절매 및 ADX 필터를 기반으로 한 추세 추종 전략


생성 날짜: 2023-11-06 14:52:27 마지막으로 수정됨: 2023-11-06 14:52:27
복사: 0 클릭수: 982
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

Chande Kroll 손절매 및 ADX 필터를 기반으로 한 추세 추종 전략

개요

이 전략은 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)