fix: 指标口径统一——indicators.calc_atr改EMA平滑(与backtest_framework完全一致),消除回测EMA/实盘SMA的3.59%口径分裂,回测实盘同口径
This commit is contained in:
@@ -47,17 +47,27 @@ def calc_rsi(series, n=14):
|
|||||||
|
|
||||||
|
|
||||||
def calc_atr(klines, n=14):
|
def calc_atr(klines, n=14):
|
||||||
"""ATR(Average True Range),与回测 calc_factors 的 atr_pct 同口径。
|
"""ATR(Average True Range),EMA 平滑——与 backtest_framework.calc_atr 完全一致
|
||||||
klines: [{high, low, close, ...}]"""
|
(2026-08-12 统一口径:原 SMA 与回测 EMA 差 3.59%,回测实盘口径分裂)。
|
||||||
|
klines: [{high, low, close, ...}]。返回最新 ATR 值(单值)。"""
|
||||||
if len(klines) < n + 1:
|
if len(klines) < n + 1:
|
||||||
return None
|
return None
|
||||||
trs = []
|
highs = [k["high"] for k in klines]
|
||||||
for i in range(1, len(klines)):
|
lows = [k["low"] for k in klines]
|
||||||
h, l, pc = klines[i]["high"], klines[i]["low"], klines[i - 1]["close"]
|
closes = [k["close"] for k in klines]
|
||||||
tr = max(h - l, abs(h - pc), abs(l - pc))
|
# True Range(与 backtest_framework.calc_tr 一致)
|
||||||
trs.append(tr)
|
tr = [highs[0] - lows[0]]
|
||||||
atr = sum(trs[-n:]) / n
|
for i in range(1, len(highs)):
|
||||||
return atr
|
hl = highs[i] - lows[i]
|
||||||
|
hc = abs(highs[i] - closes[i - 1])
|
||||||
|
lc = abs(lows[i] - closes[i - 1])
|
||||||
|
tr.append(max(hl, hc, lc))
|
||||||
|
# EMA 平滑(与 backtest_framework.calc_atr 一致:calc_ema(tr, n))
|
||||||
|
k = 2 / (n + 1)
|
||||||
|
ema = tr[0]
|
||||||
|
for t in tr[1:]:
|
||||||
|
ema = t * k + ema * (1 - k)
|
||||||
|
return ema
|
||||||
|
|
||||||
|
|
||||||
def calc_obv(klines):
|
def calc_obv(klines):
|
||||||
|
|||||||
Reference in New Issue
Block a user