🚀 AI 一键生成 qmt 策略代码

QMT xtdata.subscribe_whole_quote 的 callback 回调函数中 datas 是怎么传进去的?

qmt | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

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) 时,发生的事情如下:

  1. 你把 on_data 这个**函数的内存地址(引用)**交给了 QMT 的 C++ 底层引擎。
  2. QMT 底层引擎在后台开启了一个线程,实时接收交易所发来的全市场行情 tick 数据。
  3. 一旦底层引擎接收到新的行情数据,它会在内部自动执行类似这样的代码:
    # QMT 底层伪代码
    new_market_data = 获取交易所最新数据()
    formatted_datas = 将数据格式化为 { '000001.SZ': data1, ... }
    # 底层自动调用你之前传给它的函数,并把格式化好的数据塞进去
    用户传入的callback函数(formatted_datas) 
    
  4. 此时,你定义的 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,底层获得了调用你函数的权限,从而实现了自动传参调用。