From ac512d791c07bfa4b670fd3ff314e37bff66c2b6 Mon Sep 17 00:00:00 2001 From: Jason Zhang Date: Mon, 31 Aug 2026 20:28:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(offline):=20sync-daily=20=E6=88=90=E4=BA=A4?= =?UTF-8?q?=E9=87=8F=E5=8D=95=E4=BD=8D=E6=8D=A2=E7=AE=97=EF=BC=88=E8=82=A1?= =?UTF-8?q?=E2=86=92=E6=89=8B=EF=BC=89=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=A4=A7?= =?UTF-8?q?=E7=9B=98=E8=82=A1=20uint32=20=E6=BA=A2=E5=87=BA=20(#60)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit encode_daily_bar 按 vol/vol_coeff(vol_coeff=0.01 时 ×100)写入 .day, 期望输入为手;而 K 线协议返回的成交量单位是股。原 _sync_one_daily 直接把 股喂给 append_daily_bars,日成交 >4295 万股的股票(招商银行等)编码后 溢出 uint32,struct.pack('I') 报错,sync-daily/sync-all 失败。 在 vol_coeff == 0.01 的证券类型写入前换算 股→手(读取端 ×0.01 还原, 方向对称)。用服务器原生 .day 文件实测验证:浦发银行 2026-08-31 原始 vol 字段 99,682,464 与协议 API(股)完全一致。 Co-authored-by: awayings Co-authored-by: Claude --- src/easy_tdx/cli/cmd_offline.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/easy_tdx/cli/cmd_offline.py b/src/easy_tdx/cli/cmd_offline.py index f5ac4ab..d6961f9 100644 --- a/src/easy_tdx/cli/cmd_offline.py +++ b/src/easy_tdx/cli/cmd_offline.py @@ -557,6 +557,13 @@ def _sync_one_daily(client: TdxClient, filepath: Path) -> tuple[int, str]: sec_type = _detect_security_type(filepath.name) price_coeff, vol_coeff = _SECURITY_COEFFICIENTS.get(sec_type, (0.01, 0.01)) + # 协议返回的成交量单位是股;encode_daily_bar 在 vol_coeff=0.01 时按 ×100 + # 写入(.day 原始字段为股,读取端 ×0.01 还原为手),故写入前须换算为手。 + # 否则日成交 > 4295 万股(如招商银行等大盘股)的 bar 会溢出 uint32。 + if vol_coeff == 0.01: + for b in bars: + b.vol /= 100 + # 追加写入 written = append_daily_bars(filepath, bars, price_coeff, vol_coeff) if written > 0: