
동적 범위 필터링과 ATR 위험 관리 수치화 전략은 기술 분석과 위험 통제를 결합한 거래 시스템이다. 이 전략은 가격의 변동 범위에 대한 위치에 따라 잠재적인 트렌드 전환점을 식별하고 평균 실제 파도 (ATR) 를 사용하여 동적 스톱 손실 수준을 설정하여 각 거래의 위험을 효과적으로 관리한다. 이 방법은 가격 돌파구를 포착할 수 있을 뿐만 아니라 시장의 현재 변동성에 따라 자동으로 위험 매개 변수를 조정할 수 있으며, 전략은 다양한 시장 환경에서 잘 적응할 수 있다.
이 전략의 핵심 논리는 두 가지 주요 구성 요소를 중심으로 펼쳐진다. 범주 필터와 ATR 위험 관리 시스템이다.
범주 필터 부분은 우선 가격의 간단한 이동 평균 ((SMA) 을 계산하고, 중앙선으로 니다. 그리고, 가격에 기반한 표준 차이는 하나의 배수로 곱하여 상하의 채널 밴드를 만듭니다. 가격이 상하의 채널을 뚫을 때, 시스템은 잠재적인 상승 트렌드의 시작으로 인식하고, 여러 신호를 유발합니다. 가격이 하하의 채널을 뚫을 때, 시스템은 잠재적인 하향 트렌드의 시작으로 인식하고, 빈 신호를 유발합니다.
코드의 핵심 계산은 다음과 같습니다.
smooth = ta.sma(src, length)
dev = mult * ta.stdev(src, length)
upper = smooth + dev
lower = smooth - dev
위험 관리 부분은 ATR 지표를 사용하여 동적인 중지 (Take Profit) 및 중지 (Stop Loss) 수준을 설정합니다. ATR은 시장의 변동성을 측정하는 중요한 지표이며, 그 값이 더 큰 것은 시장의 변동성이 더 강하다는 것을 나타냅니다. ATR을 특정 배수로 곱하여 중단과 중지의 거리를 결정하는 전략으로, 변동성이 높은 시장에서 중지 중지 손해 지점은 자동으로 더 멀리 설정되며, 변동성이 적은 시장에서 중지 중지 손해 지점은 입시 가격에 더 가깝게 설정됩니다.
코드는 다음과 같이 구현됩니다.
takeProfitLong = strategy.position_avg_price + (atr * tpMultiplier)
stopLossLong = strategy.position_avg_price - (atr * slMultiplier)
takeProfitShort = strategy.position_avg_price - (atr * tpMultiplier)
stopLossShort = strategy.position_avg_price + (atr * slMultiplier)
입시 조건의 판단은 가격이 범주 필터의 상하 통로를 뚫었는지 여부를 판단하여 결정된다:
longCondition = ta.crossover(close, upper) and not uptrend[1]
shortCondition = ta.crossunder(close, lower) and not downtrend[1]
여기서 주목할 점은 전략에 추가적인 조건이 추가되었다는 것입니다.not uptrend[1]그리고not downtrend[1]“이번 경기에서, 우리는 이미 확인된 트렌드에서 반복되는 입장을 피하고, 잘못된 신호를 줄이는 데 도움이 될 것입니다”.
적응력: ATR을 통해 동적으로 중지 중지 수준을 조정, 전략은 자동으로 다양한 시장의 변동적 특성에 적응할 수 있습니다, 높은 변동성 시장에서 더 넓은 중지 중지 공간을 제공 하 고 낮은 변동성 시장에서 위험 통제를 강화.
개선된 위험 관리: 각 거래에는 명확한 스톱 스톱 손실 수준이 설정되어 있으며, 이는 단일 거래의 최대 손실을 제한할 뿐만 아니라, 예상 목표에 도달했을 때 수익이 적시에 잠금될 수 있도록 보장합니다.
최적화 가능한 변수전략은 범위 필터 길이, 배수 및 ATR 계산 길이 및 스톱 스톱 손실 배수를 포함한 여러 조정 가능한 매개 변수를 제공하며, 거래자는 다른 시장과 개인 위험 선호도에 따라 최적화 할 수 있습니다.
기술 지표 조합이 전략은 이동 평균, 표준 격차 및 ATR과 같은 여러 기술 지표를 결합하여 가격 돌파구뿐만 아니라 시장의 변동성을 고려한 포괄적인 거래 시스템을 형성합니다.
시각화 효과도 좋네요.이 전략은 상향과 하향의 경로, 중심선, 그리고 현재 보유한 위치의 스톱 스톱 손실 수준을 도표에 그리며, 거래자가 전략의 수행을 직관적으로 모니터링 할 수 있도록 해줍니다.
시장의 위조적 돌파구: 명확한 추세가 없는 불안정한 시장에서, 가격이 상하 채널을 자주 뚫을 수 있으며, 이는 여러 가지 잘못된 신호와 불필요한 거래 비용으로 이어집니다. 해결책은 확인 지표를 추가하거나 필터 길이를 길게 하는 것이 민감성을 줄일 수 있습니다.
매개변수 민감도전략의 성능은 파라미터 설정에 크게 의존하며, 다른 시장 환경에는 다른 파라미터 조합이 필요할 수 있습니다. 잘못된 파라미터 설정은 전략의 부실한 성능을 초래할 수 있습니다. 특정 시장에 가장 적합한 파라미터를 찾기 위해 재검토를 사용하는 것이 좋습니다.
너무 큰 위험을 감수하는 것: 극도로 변동하는 시장에서 ATR 기반의 중지 손실이 너무 멀리 설정되어 단일 거래의 손실이 예상보다 높을 수 있습니다. 이러한 위험을 제한하기 위해 절대 최대 중지 값을 설정하는 것이 고려 될 수 있습니다.
이 추세는 뒤집을 수 없습니다.: 이 전략은 트렌드를 인식하기 시작했을 때 잘 작동하지만, 트렌드 반전이 있을 때 반응이 늦어져 수익이 반전되는 경우가 있다. 이를 개선하기 위해 트렌드 반전 지표를 추가하는 것을 고려할 수 있다.
거래량 확인 부족: 현재 전략은 거래량 변화를 고려하지 않고 가격 데이터에만 기반합니다. 일부 시장에서 거래량이 충분히 지원되지 않으면 가격 돌파구가 거짓 신호일 수 있습니다. 거래량을 추가 확인 요소로 고려하는 것이 좋습니다.
거래량 필터를 추가합니다.: 거래량을 추가 확인 지표로 고려할 수 있습니다. 예를 들어, 가격 돌파시에 거래량이 크게 증가하도록 요구하면 낮은 품질의 돌파 신호를 필터링하는 데 도움이 됩니다. 구체적인 구현은 거래량을 계산하는 이동 평균이 될 수 있으며, 돌파시에 거래량이 평균보다 높은 비율을 요구합니다.
트렌드 확인 지표예를 들어, 장기 이동 평균 방향 판단을 추가할 수 있으며, 가격 돌파구가 장기 추세와 일치하는 방향으로만 진입하는 것이 역동적인 거래를 피하는 데 도움이 됩니다.
정지 손실 전략의 최적화계단형 정지 (trailing stop) 를 고려할 수 있습니다. 즉, 가격이 유리한 방향으로 이동함에 따라 중지 위치를 점진적으로 높여서 수익의 일부를 잠금하고 동시에 가격에 충분한 활동 공간을 제공합니다.
시간 필터: 특정 시장은 특정 기간 동안의 변동성과 트렌드 특성이 뚜렷하게 다르기 때문에 시간 필터를 추가하여 전략에 가장 적합한 기간 동안 거래 할 수 있습니다.
다주기 분석: 여러 시간 주기에 적용되는 범위 필터를 고려하고, 여러 시간 주기의 신호가 일치할 때만 거래를 실행하는 것이 가짜 신호를 줄이는 데 도움이됩니다.
변수 적응 메커니즘: 전략이 최근 시장의 성과에 따라 자동으로 매개 변수를 조정할 수 있는 메커니즘을 개발합니다. 예를 들어, 변동성이 증가하면 배수를 증가시키고, 변동성이 감소하면 배수를 감소시킵니다.
시장 환경 필터를 추가합니다.: ADX ((평균 방향 지수) 과 같은 지표를 사용하여 시장이 트렌드 환경이나 충격 환경인지 판단하고 그에 따라 전략의 실행 방식을 조정할 수 있습니다. 예를 들어, 충격적인 시장에서 거래를 완전히 피할 수 있습니다.
동적 범위 필터링과 ATR 리스크 관리 수량화 전략은 가격 돌파구 식별과 동적 위험 관리를 결합한 통합 거래 시스템이다. 범위 필터링을 통해 잠재적인 트렌드 전환점을 식별하고, ATR을 사용하여 시장의 변동성에 적합한 스톱 스톱 손실 수준을 설정하는 전략은 위험을 잘 통제하면서 시장의 돌파구를 포착할 수 있다.
이 전략의 주요 장점은 자율성과 완벽한 위험 관리 메커니즘이지만, 동시에 위기 시장에서 가짜 돌파구 및 변수 민감성 등의 도전에 직면합니다. 거래량 확인, 트렌드 필터링, 중지 중지 메커니즘을 최적화하는 등의 방법으로 이 전략에는 큰 최적화 공간이 있습니다.
거래자는 전략의 논리 원리를 이해하고 자신의 거래의 특정 시장과 위험 선호도에 따라 매개 변수를 조정하는 것이 전략을 성공적으로 적용하는 데 중요합니다. 동시에, 전략의 성능을 지속적으로 모니터링하고 평가하고, 필요한 조정과 최적화를 적절하게 수행하는 것은 전략의 장기적인 효과를 유지하는 데 중요한 조치입니다.
/*backtest
start: 2024-05-27 00:00:00
end: 2024-12-17 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy("Range Filter Strategy with ATR TP/SL", overlay=true, margin_long=100, margin_short=100)
// Inputs
length = input.int(20, title="Range Filter Length")
mult = input.float(1.5, title="Range Filter Multiplier")
atrLength = input.int(14, title="ATR Length")
tpMultiplier = input.float(1.5, title="Take Profit Multiplier")
slMultiplier = input.float(1.5, title="Stop Loss Multiplier")
// Range Filter Calculation
src = close
smooth = ta.sma(src, length)
dev = mult * ta.stdev(src, length)
upper = smooth + dev
lower = smooth - dev
// ATR Calculation
atr = ta.atr(atrLength)
// Trend Direction
var bool uptrend = na
var bool downtrend = na
uptrend := close > upper and (na(uptrend[1]) or uptrend[1])
downtrend := close < lower and (na(downtrend[1]) or downtrend[1])
// Entry Conditions
longCondition = ta.crossover(close, upper) and not uptrend[1]
shortCondition = ta.crossunder(close, lower) and not downtrend[1]
// Exit Conditions (ATR-based)
takeProfitLong = strategy.position_avg_price + (atr * tpMultiplier)
stopLossLong = strategy.position_avg_price - (atr * slMultiplier)
takeProfitShort = strategy.position_avg_price - (atr * tpMultiplier)
stopLossShort = strategy.position_avg_price + (atr * slMultiplier)
// Strategy Execution
if (longCondition)
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", "Long", limit=takeProfitLong, stop=stopLossLong)
if (shortCondition)
strategy.entry("Short", strategy.short)
strategy.exit("Exit Short", "Short", limit=takeProfitShort, stop=stopLossShort)
// Plotting
plot(upper, color=color.green, title="Upper Range")
plot(lower, color=color.red, title="Lower Range")
plot(smooth, color=color.blue, title="Smooth Line")
// Plot TP/SL levels when in position
plot(strategy.position_size > 0 ? takeProfitLong : na, color=color.green, style=plot.style_circles, linewidth=2, title="TP Long")
plot(strategy.position_size > 0 ? stopLossLong : na, color=color.red, style=plot.style_circles, linewidth=2, title="SL Long")
plot(strategy.position_size < 0 ? takeProfitShort : na, color=color.red, style=plot.style_circles, linewidth=2, title="TP Short")
plot(strategy.position_size < 0 ? stopLossShort : na, color=color.green, style=plot.style_circles, linewidth=2, title="SL Short")