Files
easy_tdx_max/examples/17_mac_monitor/unusual.py
T
Justin Gu 4dde339f26 fix(mac): 异动 0x1237 补齐 0x15/0x16/0x1D/0x1E 解析并修正 0x13 试盘方向(#62)
- 0x16 盘中强势/弱势:09:25 样本 v2 与开盘涨幅 49/49 精确一致,v1 为带符号 ±1~3 级强弱等级
- 0x15 竞价/尾盘异动:09:25 与 15:00 双时刻触发,desc 按时刻区分竞价/尾盘前缀
- 0x1D/0x1E 急速拉升/急速下跌:阈值下限 ±0.6%
- 0x13 竞价试盘:v1=0x00 试买/0x01 试卖(552 条对照昨收 549 条一致),旧实现试卖方向描述错误
- 新增顶层常量 UNUSUAL_TYPE_NAMES(19 种类型码→名称)
- 协议探索结论与完整证据链文档化 docs/protocol-unknown-fields.md §3.4
- 测试 test_unusual.py 21 例(全部真实抓包字节 fixture)
2026-09-02 10:44:09 +08:00

81 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""演示:市场异动数据。
通过 MacClient 的 get_unusual() 获取全市场的异动股票数据。
参数:
market -- 市场代码(Market.SH / Market.SZ
start -- 起始偏移(默认 0
count -- 单次请求数量(协议上限 600,超出会被截断为 600)
UnusualItem dataclass 字段:
index int 异动序号
market int 市场代码
code str 证券代码
name str 证券名称
time time 异动时间
desc str 异动描述(如 "盘中强势"、"竞价拉升"、"急速下跌"
value str 异动数值(如 "5.82%"、"10.05%/64310手"
unusual_type int 异动类型代码(见下表)
异动类型代码表(0x1237,2026-09-01 实测锚定,可用 easy_tdx.UNUSUAL_TYPE_NAMES 映射):
0x03 主力买入/卖出 0x10 大单托盘
0x04 加速拉升 0x11 大单压盘
0x05 加速下跌 0x12 大单锁盘
0x06 低位反弹 0x13 竞价试盘(试买/试卖,09:15~09:20 触发)
0x07 高位回落 0x14 涨跌停(逼近/封板/封大减/打开)
0x08 撑杆跳高 0x15 竞价/尾盘异动(拉升/下跌/平稳,09:25 与 15:00 双时刻触发)
0x09 平台跳水 0x16 盘中强势/弱势(v1 为 1~3 级强弱等级)
0x0A 单笔冲涨/冲跌 0x1D 急速拉升
0x0B 区间放量涨/跌/平 0x1E 急速下跌
0x0C 区间缩量
返回 DataFrame 列说明:
index int 异动序号
market int 市场代码
code str 证券代码
name str 证券名称
time object 异动时间(HH:MM:SS 格式)
desc str 异动描述
value str 异动数值
unusual_type int 异动类型代码
说明:
通达信 MAC 协议 0x1237 单次最多返回 600 条异动数据。
若要拉取全市场全部异动(盘中可能数千条),需要用 start 参数翻页,
每次累加 600,直到某页返回不足 600 条即为尾页。
"""
import pandas as pd
from easy_tdx import MacClient, Market
PAGE = 600 # 协议单次返回上限,不要改大(会被截断)
with MacClient.from_best_host() as c:
frames = []
start = 0
while True:
df = c.get_unusual(Market.SH, start=start, count=PAGE)
if df.empty:
break
frames.append(df)
if len(df) < PAGE: # 不足一页 = 已到尾
break
start += PAGE
if frames:
full = pd.concat(frames, ignore_index=True)
print(f"共获取 {len(full)} 条异动({len(frames)} 页)")
print(full.to_string(index=False))
else:
print("暂无异动数据。")
# 示例输出:
# 共获取 12871 条异动(22 页)
# index market code name time desc value unusual_type
# 1 1 600551 时代出版 09:25:00 竞价下跌 -1.21%/40254手 21
# 2 1 600551 时代出版 09:25:00 盘中强势 5.82% 22
# 3 1 600295 鄂尔多斯 09:25:00 竞价拉升 2.88%/533手 21
# 4 1 605365 立达信 09:35:08 急速拉升 1.62% 29
# ...