xtdata.subscribe_whole_quote的callback用法
callback - 数据推送回调
- 回调定义形式为`on_data(datas)`,回调参数`datas`格式为 { stock1 : data1, stock2 : data2, ... },
官网上是这样写的,这个datas数据怎么传进去呢
看了示例没有定义datas,这个datas是怎么来的呐
<blockquote>def on_data(datas):
问题描述
解决方案
这是一个非常好的问题,涉及到编程中非常核心的一个概念:事件驱动(Event-Driven)和回调函数(Callback)。
简单来说,datas 不是由你(用户代码)手动传进去的,而是由 QMT 的底层系统自动传进去的。
1. 通俗理解回调机制
你可以把 subscribe_whole_quote 想象成你向快递站(QMT底层系统)订阅了全小区的快递通知服务。你给快递站留了一个你的电话号码(也就是你定义的 on_data 函数)。
- 你不需要主动去问:“有我的快递吗?”
- 快递站(底层系统)会在快递到达时,主动拨打你的电话(调用
on_data函数),并且在电话里告诉你具体的快递信息(把行情数据打包成datas传给你的函数)。
2. 底层是怎么运作的?
当你执行 xtdata.subscribe_whole_quote(..., callback=on_data) 时,发生的事情如下:
- 你把
on_data这个**函数的内存地址(引用)**交给了 QMT 的 C++ 底层引擎。 - QMT 底层引擎在后台开启了一个线程,实时接收交易所发来的全市场行情 tick 数据。
- 一旦底层引擎接收到新的行情数据,它会在内部自动执行类似这样的代码:
# QMT 底层伪代码 new_market_data = 获取交易所最新数据() formatted_datas = 将数据格式化为 { '000001.SZ': data1, ... } # 底层自动调用你之前传给它的函数,并把格式化好的数据塞进去 用户传入的callback函数(formatted_datas) - 此时,你定义的
on_data(datas)就会被触发执行,里面的datas变量就自然而然地包含了最新的行情字典。
3. 完整的代码示例
在实际编写代码时,你只需要定义函数和注册回调,不需要自己去调用 on_data()。
# 导入 xtdata 模块 (假设在独立运行环境中)
from xtquant import xtdata
# 1. 定义回调函数
# 这个函数就是你留给底层的“电话号码”
# 底层在调用它时,会自动把包含行情的字典赋值给 datas 参数
def on_data(datas):
# 当有行情更新时,这行代码会自动打印
print("接收到新的全市场行情推送!")
# 遍历底层传进来的 datas 字典
for stock_code, data in datas.items():
print(f"股票代码: {stock_code}")
print(f"最新价: {data.get('lastPrice', 'N/A')}")
print("-" * 20)
# 2. 订阅全市场行情,并将回调函数注册给底层
# 注意:这里传的是函数名 on_data,千万不要写成 on_data()(带括号代表执行函数)
xtdata.subscribe_whole_quote(code_list=['000001.SZ', '600000.SH'], callback=on_data)
# 3. 保持主程序运行,等待底层触发回调
# 如果主程序退出了,底层线程也会结束,就收不到推送了
xtdata.run()
总结
datas是哪里来的? 是 QMT 底层 C++ 引擎在收到交易所数据后,打包好并主动塞给你的。- 怎么传进去的? 通过你把函数名
on_data作为参数传给subscribe_whole_quote,底层获得了调用你函数的权限,从而实现了自动传参调用。