迅投miniqmt行情数据subscribe_whole_quote、subscribe_quote、get_full_tick怎么选
最近有同学反馈用get_full_tick频繁获取全市场数据卡死, 我当时推荐他用subscribe_whole_quote。 这里聊一聊获取行情数据subscribe_whole_quote、subscribe_quote、get_full_tick这几个的区别。
一、三个比喻,秒懂核心差异
想象一下,你是一个操盘手,需要时刻关注市场动态。
subscribe_whole_quote 就像你在交易大厅装了一个 “全市场警报器”。你告诉它:“关注全市场股票,有任何一只出现新的成交(TICK),就立刻告诉我变化的那部分数据。” —— 它批量监听,有变才报,效率极高。
subscribe_quote则像你雇了一个 “专职盯盘助手”。你对他说:“给我死死盯住茅台这支股票,每来一个新TICK,或者每分钟收线,都完整向我汇报一次。” —— 它精准盯防,事无巨细,延迟最低,但资源消耗也大。
get_full_tick 更像你随手拿起遥控器 “拍一张电视快照”。你需要的时候,啪一下,把当前屏幕上所有股票的最新价、成交量等信息截取下来。 —— 它即取即用,不问过往,成本极低,但信息是瞬时的。
是不是一下子就清晰了?下面我们深入技术细节。
二、适用场景、优缺点
1. subscribe_whole_quote —— 全市场高效推送器
工作模式:被动推送,增量更新。只有订阅的标的发生变化时,QMT 才会把变化的数据(比如最新价、成交量)推给你。
数据粒度:仅限 TICK 分笔数据(交易所每笔成交)。
适用场景:你需要同时监控大量股票(比如一个股票池),并实时捕捉它们的异动,但不需要每笔成交的完整信息。
优点:网络带宽和计算资源消耗小,因为只传输变化量。
缺点:只能拿到 TICK 数据,不能直接订阅 K 线
2.subscribe_quote —— 精准定点监控器
工作模式:被动推送,完整推送。你指定一个或几个标的,以及一个周期(TICK、1分钟、5分钟、日线等),每到周期结束,QMT 就把这个周期的完整 Bar 数据推送给你。
数据粒度:TICK 或任意 K 线周期。
适用场景:你正在交易少数几只股票,需要最低延迟的 TICK 数据来驱动高频策略,或者需要自定义周期的 K 线来观察持仓走势。
优点:延迟极低,数据完整,支持多周期。
缺点:每个订阅的标都会持续占用连接资源,订阅数量不宜多(一般不超过几十个)。
3. get_full_tick —— 轻量级快照抓取器
工作模式:主动拉取,一问一答。你调用它时,它直接从本地缓存中取出所有已订阅品种的最新 TICK 快照给你。
数据粒度:TICK 快照(最新一笔)。
适用场景:你需要快速扫一遍全市场或一个大板块的现价、涨跌幅等;或者在策略启动时做一次初始数据获取;又或者你的监控频率很低(比如每几秒一次),不想占用订阅额度。
优点:不占订阅额度,可以获取全市场数千只股票的快照;调用简单,无回调管理。
缺点:不是被动推送,需要你自己写循环去轮询;延迟比推送模式稍高(一般在几十毫秒级别)
三、实战例子
光说不练假把式。下面用 Python 代码片段展示每个函数的具体用法。
1、 subscribe_whole_quote 盯全市场变化
from xtquant import xtdataimport datetimedef on_market_data(data): """全市场数据回调函数""" current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] print(f"当前时间:{current_time}") print(f"收到{len(data)}只股票的数据") for stock_code, stock_data in data.items(): last_price = stock_data.get('lastPrice', 'N/A') volume = stock_data.get('volume', 'N/A') print(f"股票{stock_code}最新价:{last_price}, 成交量:{volume}")# 订阅沪深两市的 tick 数据seq = xtdata.subscribe_whole_quote(code_list=['SH', 'SZ'], callback=on_market_data)# 运行程序接收数据xtdata.run()# 取消订阅(可选)# xtdata.unsubscribe_quote(seq)
2、subscribe_quote 盯住你的持仓股
你持有茅台和宁德时代,需要以最低延迟获得每一笔TICK数据来驱动你的高频做T策略。
from xtquant import xtdatadef simple_callback(data):print(f"收到行情数据: {data}")# 订阅上证指数的1分钟线handle = xtdata.subscribe_quote(stock_code='000001.SH',period='1m',callback=simple_callback)xtdata.run() # 保持程序运行以接收数据
3、get_full_tick 快速查询
import xtquant.xtdata as xtdatafrom datetime import datetime, timedeltaimport timedef get_all_stock_codes(): """获取沪深两市所有A股股票代码""" return xtdata.get_stock_list_in_sector("沪深A股")def get_realtime_market_status(): """ 实时统计涨跌家数(盘中使用) 返回: (上涨家数, 下跌家数, 平盘家数, 无效数据家数) """ stock_codes = get_all_stock_codes() quotes = xtdata.get_full_tick(stock_codes) up = down = unchanged = invalid = 0 for code in stock_codes: data = quotes.get(code, {}) last_price = data.get('lastPrice') pre_close = data.get('lastClose') # 过滤无效数据 if last_price is None or pre_close is None or pre_close == 0: invalid += 1 continue # 计算涨跌幅(避免浮点误差) change_pct = (last_price - pre_close) / pre_close * 100 if change_pct > 1e-6: up += 1 elif change_pct < -1e-6: down += 1 else: unchanged += 1 return up, down, unchanged, invalidif __name__ == "__main__": print("=== 实时涨跌统计 ===") up, down, unchanged, invalid = get_realtime_market_status() print(f"上涨: {up}, 下跌: {down}, 平盘: {unchanged}, 无效数据: {invalid}")
四、最后总结
想要低延迟监控全市场股票池 → subscribe_whole_quote
想要最低延迟盯着自己那几只持仓股做高频 → subscribe_quote
想要低成本、低频率地扫一遍很多股票 → get_full_tick + 轮询
开盘瞬间快速筛选 → get_full_tick
需要1分钟、5分钟K线数据 → 只能用 subscribe_quote
没有哪个函数是万能的,关键是理解它们的性格,然后组合使用。比如,每天早上先用 get_full_tick 快速扫描选出强势板块,然后对板块内的个股用 subscribe_whole_quote 实时监控异动,最后对真正开仓的股票用 subscribe_quote 进行 TICK 级精准盯盘。
最后,如果你有迅投miniqmt开户需求,可以找我咨询。