3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
这是一个非常好的问题,涉及到编程中非常核心的一个概念:事件驱动(Event-Driven)和回调函数(Callback)。
简单来说,datas 不是由你(用户代码)手动传进去的,而是由 QMT 的底层系统自动传进去的。
你可以把 subscribe_whole_quote 想象成你向快递站(QMT底层系统)订阅了全小区的快递通知服务。你给快递站留了一个你的电话号码(也就是你定义的 on_data 函数)。
on_data 函数),并且在电话里告诉你具体的快递信息(把行情数据打包成 datas 传给你的函数)。当你执行 xtdata.subscribe_whole_quote(..., callback=on_data) 时,发生的事情如下:
on_data 这个**函数的内存地址(引用)**交给了 QMT 的 C++ 底层引擎。# QMT 底层伪代码
new_market_data = 获取交易所最新数据()
formatted_datas = 将数据格式化为 { '000001.SZ': data1, ... }
# 底层自动调用你之前传给它的函数,并把格式化好的数据塞进去
用户传入的callback函数(formatted_datas)
on_data(datas) 就会被触发执行,里面的 datas 变量就自然而然地包含了最新的行情字典。在实际编写代码时,你只需要定义函数和注册回调,不需要自己去调用 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,底层获得了调用你函数的权限,从而实现了自动传参调用。