"""K 线 vol 字段语义修正回归测试(issue #64)。 背景(2026-09-02 逐字节拆包 + 新浪实时行情/东方财富交叉验证): 通达信服务端 K 线记录第一个 4 字节字段(f1)的语义随周期/品种变化: - 指数分钟线:f1 ≈ amount/100(成交额百元),真实分钟成交量不在报文中; - 指数与个股的周/月/季/年线(cat 5/6/10/11):f1 = 真实成交量/100; - 日线(cat 4)与 cat 9("日线变体",枚举名误标 YEAR):f1 = 真实成交量。 解析层据此修正:指数分钟线 vol=NaN,周月季年 ×100,其余原样。 """ import math import struct from easy_tdx.codec.price import put_price from easy_tdx.codec.volume import _decode_volume from easy_tdx.commands.security_bars import GetIndexBarsCmd, GetSecurityBarsCmd from easy_tdx.models.enums import KlineCategory, Market # 实抓报文中的两个 4 字节字段原始值(2026-09-02 上证指数 5min 15:00 bar) _IVOL_F1 = 0x4D4713FE # 解码 ≈ 208,748,512(协议里实为 amount/100) _IVOL_F2 = 0x509B87A0 # 解码 ≈ 20,874,854,400(真实成交额,元) # 分钟级时间戳 2026-09-02 15:00(zipday=45958, tminutes=900) _ZIPDAY, _TMIN = 45958, 900 def _make_body(cat: int, n_bars: int = 1, index: bool = True) -> bytes: """构造 n_bars 条 K 线响应报文(OHLC 差分取小值,不影响 vol 断言)。""" if cat in (0, 1, 2, 3, 7, 8): dt = struct.pack("