🚀 AI 一键生成 qmt 策略代码

QMT平台如何同时获取多个品种的Tick数据?(解决get_full_tick返回空值问题)

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

问题描述

subscribe\_whole\_quote在使用这两个获取同时获取多个品种的数据为什么返回的值是空

ContextInfo.get_full_tick - 获取全推数据
ContextInfo.subscribe_whole_quote - 订阅全推数据
在使用这两个获取同时获取多个品种的数据为什么返回的值是空的,{}

subscribe_quote 使用这个区获取单个是可以获取到 tick 的数据。

如果要同时获取多个需要使用什么方法

解决方案

在 QMT 平台中,遇到 ContextInfo.get_full_tick 或全推接口返回空字典 {} 的情况,通常是因为本地客户端尚未接收到这些品种的实时行情数据,或者接口调用方式/权限不匹配

为什么会返回空值 {}

  1. 数据未订阅/未下发get_full_tick 是一个被动获取本地缓存数据的接口。如果在此之前没有对这些品种进行行情订阅,本地内存中没有数据,就会返回 {}
  2. 全推接口权限限制subscribe_whole_quote(全推订阅)通常需要券商服务端的特殊配置或 Level-2 权限支持。如果你的账号没有开通全推权限,调用该接口将无法获取数据。
  3. 非交易时间:如果在非交易时段且本地没有缓存当天的 Tick 数据,也可能返回空值。

如何正确同时获取多个品种的 Tick 数据?

在 QMT 中,推荐使用以下两种方法来同时获取多个品种的实时 Tick 数据:

方法一:使用 subscribe_quote 循环订阅(推荐实盘/模拟使用)

官方文档中标准的订阅接口是 subscribe_quote。你可以通过遍历股票池,为每个品种单独发起订阅,并在回调函数中处理数据。

#coding:gbk

def init(ContextInfo):
    # 定义需要获取数据的股票池
    stock_list = ['600000.SH', '000001.SZ', '600036.SH']
    ContextInfo.set_universe(stock_list)
    
    # 遍历股票池,逐个订阅 Tick 行情
    for stock in stock_list:
        # 订阅分笔数据,并绑定回调函数 on_quote
        ContextInfo.subscribe_quote(stock, period='tick', dividend_type='none', callback=on_quote)

def on_quote(datas):
    # 当有任何一个订阅的品种 Tick 更新时,会触发此回调
    # datas 的结构为 {code: data}
    for code, data in datas.items():
        print(f"收到 {code} 的最新 Tick 数据: \n{data}")

def handlebar(ContextInfo):
    pass

方法二:使用 get_market_data_ex 批量获取并自动订阅

get_market_data_ex 是一个非常强大的接口,它支持传入一个列表,并且自带 subscribe=True 参数。当调用时,它会自动帮你订阅缺失的数据并返回。

#coding:gbk

def init(ContextInfo):
    ContextInfo.stock_list = ['600000.SH', '000001.SZ', '600036.SH']

def handlebar(ContextInfo):
    # 确保只在最新的 K 线上执行
    if not ContextInfo.is_last_bar():
        return
        
    # 批量获取多个品种的 tick 数据,subscribe=True 会自动订阅
    tick_data = ContextInfo.get_market_data_ex(
        fields=[], 
        stock_code=ContextInfo.stock_list, 
        period='tick', 
        start_time='', 
        end_time='', 
        count=-1, 
        dividend_type='none', 
        fill_data=True, 
        subscribe=True
    )
    
    print("批量获取的 Tick 数据:", tick_data)

方法三:先订阅,再使用 get_full_tick

如果你依然想使用 get_full_tick 获取快照,必须确保这些品种已经在主图上或者已经被订阅过

#coding:gbk

def init(ContextInfo):
    ContextInfo.stock_list = ['600000.SH', '000001.SZ']
    # 先进行后台订阅,保持本地有数据流
    for stock in ContextInfo.stock_list:
        ContextInfo.subscribe_quote(stock, period='tick')

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
        
    # 此时本地已经有数据流,调用 get_full_tick 就不会为空了
    full_tick_data = ContextInfo.get_full_tick(ContextInfo.stock_list)
    print("当前全部分笔快照:", full_tick_data)

总结建议

  • 不要依赖未授权的全推接口:如果 subscribe_whole_quote 无效,请改用 subscribe_quote 遍历订阅。
  • 事件驱动优先:在量化实盘中,强烈建议使用 方法一(回调函数 on_quote,这样只要有任何一个品种的 Tick 发生变化,策略就能第一时间响应,延迟最低。
  • 快照查询:如果只是想定时(例如每秒)查询一下多个品种的最新状态,使用 方法二(get_market_data_ex 最为简便。