
이 전략은 평균 실제 범위 ((ATR) 지표와 평균 방향 지표 ((ADX) 에 기반한 자기 적응 가격 통로 전략이다. 그것은 가격 운동에서 시장과 추세를 파악하고 그에 따라 거래하는 것을 목표로 한다.
가장 가까운 lengthroot K 선의 최고값 ((HH) 과 최저값 ((LL) 을 계산한다. 또한 lengthroot K 선의 ATR도 계산한다.
가격 상승과 하락에 따라 +DI와-DI를 계산하고 ADX를 계산한다.
만약 ADX<25이면, 평준화 시장으로 판단한다. 이 시점에 만약 종결 가격이 가격 채널 상단보다 높다면 ((HH - ATR 곱하기*ATR), 더 많은 일을 할 수 있습니다.*ATR), 공백.
만약 ADX>=25이고+DI>-DI라면, 황소시장이라고 판단한다. 이 시점에서는 종결가치가 가격 통로의 상한보다 높으면 더 많이 한다.
만약 ADX>=25이고+DI<-DI라면, 공수 시장으로 판단한다. 이 때 만약 종결 가격이 가격 통로 하위선 이하라면, 공수한다.
포지션에 들어간 후, exit_length 루트 K 라인을 넘어서도 상쇄되지 않으면, 강제적으로 상쇄된 포지션을 니다.
이 전략은 시장 환경에 자동으로 적응할 수 있다. 시장을 정리할 때 가격 통로 전략을 채택하고, 트렌드 시장에서 트렌드 방향에 따라 거래한다.
ATR 및 ADX 지표의 사용은 전략의 자율성을 보장한다. ATR은 가격 채널의 폭을 조정하는 데 사용되며, ADX는 시장의 흐름을 판단하는 데 사용됩니다.
강제적 손실 제도는 전략의 안정성에 도움이 됩니다.
ADX 판단이 잘못된 신호를 생성할 확률이 높습니다.
ATR 및 ADX 지표 설정이 잘못되면 전략 효과가 떨어질 수 있습니다.
“사실, 우리는 이런 상황을 피할 수 없습니다.
ATR 및 ADX 지표의 매개 변수를 최적화하여 자율 적응 효과를 더 향상시킵니다.
손실을 줄이기 위해 스톱 라인을 늘리십시오.
필터 조건을 추가하여 오류 신호를 필터링하십시오.
자기 적응 가격 통로 전략은 다양한 지표와 메커니즘을 종합적으로 사용하고, 다른 상황 환경에서 다른 전략을 취하고, 어느 정도의 자기 적응성과 안정성을 가지고 있다. 그러나 지표 설정과 매개 변수 선택의 한계로 인해 이 전략은 어느 정도의 잘못된 판단 위험에 직면해 있다. 미래 최적화 방향은 매개 변수 최적화, 위험 제어 등에 있다.
/*backtest
start: 2023-11-03 00:00:00
end: 2023-12-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Adaptive Price Channel Strategy", overlay=true)
length = input(20, title="Length")
exit_length = input(10, title="Exit After X Periods")
atr_multiplier = input(3.2, title="ATR Multiplier")
startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date")
endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date")
hh = ta.highest(high, length)
ll = ta.lowest(low, length)
atr = ta.atr(length)
// calculate +DI and -DI
upMove = high - high[1]
downMove = low[1] - low
plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0)
minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0)
plusDI = ta.rma(plusDM, length) / atr * 100
minusDI = ta.rma(minusDM, length) / atr * 100
// calculate ADX
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adx = ta.rma(dx, length)
var int barSinceEntry = na
if (not na(close[length]) )
if (adx < 25) // Sideways market
if (close > hh - atr_multiplier * atr)
strategy.entry("PChLE", strategy.long, comment="PChLE")
barSinceEntry := 0
else if (close < ll + atr_multiplier * atr)
strategy.entry("PChSE", strategy.short, comment="PChSE")
barSinceEntry := 0
else if (adx >= 25 and plusDI > minusDI) // Bullish market
if (close > hh - atr_multiplier * atr)
strategy.entry("PChLE", strategy.long, comment="PChLE")
barSinceEntry := 0
else if (adx >= 25 and plusDI < minusDI) // Bearish market
if (close < ll + atr_multiplier * atr)
strategy.entry("PChSE", strategy.short, comment="PChSE")
barSinceEntry := 0
if (na(barSinceEntry))
barSinceEntry := barSinceEntry[1] + 1
else if (barSinceEntry >= exit_length)
strategy.close("PChLE")
strategy.close("PChSE")
barSinceEntry := na
plot(hh, title="Highest High", color=color.green, linewidth=2)
plot(ll, title="Lowest Low", color=color.red, linewidth=2)