"""市场异动(0x1237)异动类型解析测试(Issue #62)。 背景实测(2026-09-01 午间,全市场 SH+SZ 共 12871 条): - 0x15 仅出现在 09:25:00~09:25:02(竞价撮合时刻),v1 为方向档 (0x02 拉升 / 0x03 下跌 / 0x01 平稳,±0.5% 分档),v2 为竞价尾段 价格变动(相对昨收,参考时刻收敛于 09:23:30~09:24:00),v3 为竞价 匹配量(手,略小于最终撮合量)。pytdx2 把 0x15 标作"尾盘"与实测矛盾, 系对 PC 推送协议枚举的错误类推。 - 0x16 全天分布,v2 为触发时涨跌幅:09:25 的 49 条样本与当日开盘涨幅 (open/pre_close-1)49/49 精确一致;全时段与收盘涨跌幅符号一致率 97%~100%。v1 为带符号强弱等级(0x01~0x03 强势、0xFD~0xFF 弱势, 六组 v2 区间互不重叠且单调)。 - 0x1D / 0x1E 全天分布,v1 恒为 0x00 / 0x01(方向),v2 恒正 / 恒负 (阈值下限 ±0.6%),v3 恒 0。 """ import struct from datetime import time from easy_tdx import UNUSUAL_TYPE_NAMES from easy_tdx.mac.commands.unusual import UnusualCmd, _describe_unusual def _record( utype: int, data_hex: str, hour: int = 9, minute_sec: int = 2500, market: int = 1, code: str = "600551", ) -> bytes: """构造一条 32 字节异动记录( 头 + 13B 数据区 + 保留 + 时间)。""" return ( struct.pack(" bytes: text = ",".join("测试股" for _ in records) return struct.pack("