
EMA 다중 트렌드 필터링과 ATR 트래킹 스톱을 혼합한 양적 전략은 기술 분석의 여러 핵심 요소를 결합한 포괄적인 거래 시스템이다. 이 전략의 핵심은 다중 주기 지수 이동 평균 (EMA) 을 트렌드 확인 필터로 사용하는 것과 평균 실제 범위 (ATR) 지표와 결합하여 동적 트래킹 스톱 시스템을 구축하는 것이다. 이 전략은 또한 거래 시간 필터 기능을 통합하여 거래자가 특정 시장의 활성 시간에 따라 거래를 최적화하도록 허용한다.
이 전략의 핵심 원칙은 다음과 같은 네 가지 핵심 구성 요소로 나눌 수 있습니다.
다중 EMA 트렌드 확인전략은 4개의 다른 기간의 (20, 50, 100, 200) 지수 이동 평균 (EMA) 을 사용하여 시장의 경향 방향을 결정한다. 가격이 모든 4개의 EMA를 동시에 상위에 있을 때만 상승 추세로 간주되며, 가격이 모든 4개의 EMA를 동시에 아래에 있을 때만 하락 추세로 간주된다. 이 여러 확인 메커니즘은 약한 추세와 흔들리는 시장에서 거짓 신호를어내는 데 도움이됩니다.
ATR 추적 중지 시스템: 전략은 평균 실제 범위에 기초한 동적 추적 스톱 라인을 사용합니다. ATR은 시장의 변동성을 반영하는 지표이며, 감수성 계수 (기본 3.0) 에 의해 증가하여 스톱 라인을 설정합니다. 추적 스톱 라인은 가격 변화에 따라 자동으로 조정되며, 가격이 상승하면 단계적으로 올라가고, 가격이 하락하면 고정되어 수익을 고정하고 손실을 제한합니다.
가격과 스톱 라인 교차 신호: 전략의 구매 신호는 가격이 ATR 추적 스톱 라인을 상향으로 넘어서 상승 트렌드 조건을 충족하면 발생한다. 판매 신호는 가격이 ATR 추적 스톱 라인을 상향으로 넘어서 하향 트렌드 조건을 충족하면 발생한다. 이러한 교차 신호 메커니즘은 트렌드 확인과 함께 트렌드 전환점을 잡는 데 도움이됩니다.
거래 시간 필터: 전략은 거래 시간 필터 기능을 도입하고, 기본 설정은 “0930-1600” (미국 표준 거래 시간) 이다. 필터는 거래 신호가 지정된 활성 거래 시간 동안만 생성되도록 보장하며, 낮은 유동성 또는 높은 변동성 시간대의 잠재적인 위험을 피한다.
다층적 추세 확인이 전략은 가격들이 4개의 다른 주기적 EMA의 같은 쪽에 동시에 위치하도록 요구함으로써 트렌드 확인의 신뢰성을 크게 향상시키고, 불안정한 시장에서 가짜 신호를 효과적으로 필터링하여 불필요한 거래의 빈도를 감소시킵니다.
동적 위험 관리: ATR 추적 스톱 시스템은 시장의 실제 변동성에 따라 자동으로 스톱 거리를 조정할 수 있습니다. 이것은 변동성이 큰 시장에서 가격에 더 많은 활동 공간을 부여하고, 변동성이 적은 시장에서 더 긴밀한 스톱을 사용하여 동적인 위험을 적응합니다.
고도의 사용자 정의이 전략은 ATR 주기, 감수성 계수 및 거래 시간 설정과 같은 여러 가지 조정 가능한 매개 변수를 제공하여 거래자가 다른 시장 특성과 개인 위험 선호도에 따라 최적의 조정을 할 수 있습니다.
시간 필터 최적화거래 시간 필터 기능은 전략이 시장에서 가장 활발하고 유동성이 가장 좋은 시간에 거래하는 데 집중할 수 있도록 해줍니다. 상장 전 상장 후 또는 다른 낮은 유동성 시간에 대한 잠재적인 위험을 피합니다.
직관적인 시각적 피드백: 전략은 EMA 라인을 차트에 명확하게 표시하고, 스톱 라인을 추적하고, 구매 신호를 제공하며, 기둥 모양의 색상의 변화를 통해 현재의 가격과 스톱 라인의 상대적 위치를 직관적으로 반영하여 거래자가 전략 상태를 실시간으로 모니터링 할 수 있습니다.
트렌드 전환 지연다중 EMA 필터링은 신호의 신뢰성을 높였지만, 트렌드 초기에 잠재적 인 수익을 놓치거나 트렌드 종료 시 너무 늦게 퇴출하는 데 영향을 미칠 수 있는 지연을 도입했습니다. 이것은 신뢰성과 시간적 사이의 필수적인 균형입니다.
상자 시장의 부진: 명확한 추세가 없는 상반기 정리 시장에서, 가격이 여러 EMA를 자주 통과하기 때문에, 전략이 모든 EMA 필터링 조건을 충족하는 것이 어려울 수 있으며, 잠재적인 거래 기회를 놓치거나 너무 많은 가짜 신호를 발생시킬 수 있습니다.
매개변수 민감도: 전략 성능은 ATR 감수성 계수, ATR 주기 등의 핵심 매개 변수의 설정에 크게 의존한다. 부적절한 매개 변수는 상쇄 손실을 너무 단단하게 (매우 자주 유발) 또는 너무 느슨하게 (매우 큰 손실) 할 수 있다. 이러한 매개 변수는 다양한 시장 조건에 대한 리테크를 통해 최적화하는 것이 좋습니다.
비상사태 위험: 중요한 뉴스 또는 블랙 스 사건으로 인한 가격 급등 또는 급격한 변동이 발생할 경우, ATR 추적 스톱은 적시에 대응하지 못할 수 있으며, 예상보다 실제 손실이 발생할 수 있습니다.
과도한 거래의 위험: 여러 계층의 필터링에도 불구하고, 높은 변동성이있는 시장에서 ATR 추적 스톱 라인과 가격이 자주 교차하는 것은 여전히 과도한 거래로 이어지고 거래 비용을 증가시킬 수 있습니다. 최소 지분 시간 요구 사항을 추가하는 것이 고려 될 수 있습니다.
동향 강도 지표: 현재 전략은 가격과 여러 EMA의 상대적인 위치에 의존하여 트렌드를 판단합니다. ADX (평균 방향 지수) 와 같은 트렌드 강도 지표를 추가하여 최소 트렌드 강도 소수점을 설정하여 약한 트렌드 환경의 신호를 더 필터링 할 수 있습니다.
트랜잭션 양 확인을 입력합니다.: 거래량 분석을 신호 생성 로직에 통합하여 구매 및 판매 신호와 함께 충분한 거래량 확인을 요구하면 신호 신뢰도를 높이는 데 도움이 됩니다. 예를 들어, 신호 생성 시 거래량이 지난 N 주기의 평균 거래량보다 높을 수 있습니다.
정지 손실 변수 적응 메커니즘 최적화: 현재 전략은 고정된 ATR 감수성 계수를 사용하며, 역사적 변동률이나 시장 상태에 기반한 적응 변수 조정 메커니즘을 구현하는 것을 고려할 수 있다. 예를 들어, 높은 변동성 시장에서 감수성 계수를 자동으로 증가시키고 낮은 변동성 시장에서 감수성 계수를 감소시킨다.
수익 목표와 리스크 수익 비율 필터를 추가합니다.: 예상 수익 목표와 리스크 수익률에 기반한 신호 필터링 메커니즘을 추가하고, 예상 리스크 수익률이 특정 하위값을 초과하는 거래만 수행합니다. 이것은 자금 사용 효율을 최적화하고, 고품질 거래 기회에 초점을 맞추는 데 도움이됩니다.
시장 상태 분류와 전략 전환: 시장 상태 ((트렌드/스컬러) 의 자동 식별 메커니즘을 구현하고, 다른 시장 상태의 동성에 따라 전략 매개 변수를 조정하거나 다른 전략 논리를 전환한다. 예를 들어, 명확한 트렌드 시장에서 현재 전략을 사용하고, 흔들림 시장에서 평균 회귀 전략으로 전환한다.
기본 필터 통합: 특정 자산 클래스에 대해, 중요한 경제 데이터 발표 또는 다른 높은 불확실성 이벤트 이전에 거래하는 것을 피하기 위해 관련 기본 지표 또는 이벤트 필터를 통합하는 것이 고려 될 수 있습니다.
EMA 다중 트렌드 필터링과 ATR 트래킹 스톱을 혼합한 계량화 전략은 트렌드 트래킹과 리스크 관리의 장점을 겸비한 완전한 거래 시스템이다. 다중 메커니즘인 다중 주기적 EMA 트렌드 확인, ATR 동적 트래킹 스톱, 가격 교차 신호 및 거래 시간 필터링을 결합함으로써, 이 전략은 중장기 트렌드를 포착하면서도 좋은 위험 제어 능력을 제공한다.
이 전략의 주요 장점은 여러 층의 트렌드 확인이 신호 신뢰성을 향상시키는 데 있으며, ATR 추적 스톱은 시장의 변동성에 적응하는 동적 위험 관리를 제공합니다. 그러나, 전략에는 트렌드 전환 지연, 가로 시장의 부실 성능 및 파라미터 민감성 등의 잠재적인 위험도 있습니다.
트렌드 강도 지표, 거래량 확인, 자율 적응 파라미터 메커니즘과 같은 최적화 조치를 추가함으로써 이 전략에 더 많은 개선이 가능합니다. 무엇보다도, 거래자는 특정 거래 품종과 시장 환경에 따라 충분한 피드백을 통해 핵심 파라미터를 조정해야하며, 이 전략을 더 큰 거래 시스템의 일부로 사용하여 다른 상호 보완 전략과 결합하여 최적의 효과를 얻도록 고려해야합니다.
/*backtest
start: 2025-07-17 00:00:00
end: 2025-07-24 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/
//@version=5
//Credits to HPotter who is the creator of the original code.
//Created as a strategy with an added EMA Trend Filter by shannonnhxrk
//Added a time button so you can adjust what times it signals.
//@version=5
strategy("UT Bot Strategy with EMA Trend Filter", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === INPUTS ===
src = close
keyvalue = input.float(3.0, title="Key Value (Sensitivity)", step=0.5)
atrperiod = input.int(10, title="ATR Period")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR
// === EMAs ===
ema20 = ta.ema(src, 20)
ema50 = ta.ema(src, 50)
ema100 = ta.ema(src, 100)
ema200 = ta.ema(src, 200)
plot(ema20, color=color.orange, title="EMA 20")
plot(ema50, color=color.blue, title="EMA 50")
plot(ema100, color=color.purple, title="EMA 100")
plot(ema200, color=color.black, title="EMA 200")
// === Trend Filters ===
isUptrend = close > ema20 and close > ema50 and close > ema100 and close > ema200
isDowntrend = close < ema20 and close < ema50 and close < ema100 and close < ema200
// === ATR Trailing Stop ===
var float xATRTrailingStop = na
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1]) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) :
src < nz(xATRTrailingStop[1]) and src[1] < nz(xATRTrailingStop[1]) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) :
src > nz(xATRTrailingStop[1]) ? src - nLoss : src + nLoss
// === Time Filter ===
// === Buy/Sell Conditions with Time Filter ===
buy = ta.crossover(src, xATRTrailingStop) and isUptrend
sell = ta.crossunder(src, xATRTrailingStop) and isDowntrend
// === Strategy Execution ===
if buy
strategy.close("Short")
strategy.entry("Long", strategy.long)
if sell
strategy.close("Long")
strategy.entry("Short", strategy.short)
// === Visuals ===
plotshape(buy, title="Buy", style=shape.labelup, location=location.belowbar, color=color.green, text="Buy", textcolor=color.white, size=size.tiny)
plotshape(sell, title="Sell", style=shape.labeldown, location=location.abovebar, color=color.red, text="Sell", textcolor=color.white, size=size.tiny)
plot(xATRTrailingStop, color=buy ? color.green : sell ? color.red : color.gray, title="Trailing Stop")
barcolor(src > xATRTrailingStop ? color.green : color.red)