#!/usr/bin/env python3 """ kis_trader/engine/atr_series.py — ATR 시리즈 (엔진·전략 공통, 순환 import 방지) """ from __future__ import annotations from typing import Dict, List, Optional def compute_atr_series(candles: List[Dict], period: int = 14) -> List[Optional[float]]: """ ATR(Average True Range) 변동성 지표 계산기 (엔진 내부용). ■ RMA(Wilder's Smoothing) 방식 — TradingView 기본과 동일 (2026-06 SMA→RMA 전환). ATR_t = (ATR_{t-1} × (period-1) + TR_t) / period · 첫 ATR(인덱스 period)은 SMA(TR[1..period])로 시드. · SMA 대비: 급락(큰 TR)이 14봉 지나도 '계단식 급락' 없이 완만히 감쇠 → 급변장에서 손절/목표가가 덜 출렁임. """ atr_list: List[Optional[float]] = [None] * len(candles) if len(candles) < period + 1: return atr_list trs = [0.0] * len(candles) for i in range(1, len(candles)): hi = float(candles[i]["high"]) lo = float(candles[i]["low"]) prev_cl = float(candles[i - 1]["close"]) trs[i] = max(hi - lo, abs(hi - prev_cl), abs(lo - prev_cl)) # 첫 ATR(인덱스 period): TR[1..period] 단순 평균으로 시드 (Wilder 초기값) prev_atr = sum(trs[1:period + 1]) / period atr_list[period] = prev_atr # 이후: Wilder RMA 누적 감쇠 (이전 ATR×(n-1) + 오늘 TR) / n for i in range(period + 1, len(candles)): prev_atr = (prev_atr * (period - 1) + trs[i]) / period atr_list[i] = prev_atr return atr_list