问题描述
1、直接 get_full_tick
2、先 subscribe_whole_quote 再 get_full_tick
请问两个方式 get_full_tick 是怎么获取数据的?有什么区别
解决方案
QMT 中 get_full_tick 获取数据原理解析
在 QMT(及衍生版本如迅投极速交易终端)中,get_full_tick 用于获取指定股票的最新分笔(Tick)快照数据(包含最新价、成交量、买卖五档等)。关于你提到的两种获取方式,其底层数据流转机制和适用场景有显著区别:
1. 直接调用 get_full_tick
获取原理:
当你直接调用 ContextInfo.get_full_tick(stock_code) 时,程序会直接去本地客户端的内存缓存中读取该股票的最新 Tick 快照。
- 如果该股票当前在你的 QMT 软件主图/副图上处于活跃状态,或者属于基础股票池,本地缓存中可能有较新的数据,此时能直接返回。
- 如果该股票未被客户端关注,本地缓存中可能没有数据或数据是过期的(Stale)。此时直接调用可能会返回空值,或者触发一次同步的网络请求去服务器拉取(这会导致策略执行阻塞和延迟)。
2. 先订阅(subscribe_quote / subscribe_whole_quote)再调用 get_full_tick
获取原理:
当你先调用订阅函数(如 QMT 内置的 ContextInfo.subscribe_quote 或独立 API 中的 subscribe_whole_quote)时,客户端会向行情服务器发送一条长连接指令,要求服务器主动、实时地推送该股票(或全市场)的每一次 Tick 变动。
- 客户端接收到推送后,会在后台自动更新本地内存中的 Tick 缓存。
- 此时你再调用
get_full_tick,程序只是简单地从这个被实时维护的本地热缓存中读取最新快照。数据不仅绝对新鲜,而且读取速度极快(微秒级),不会产生网络阻塞。
两种方式的核心区别对比
| 对比维度 | 方式一:直接 get_full_tick |
方式二:先订阅,再 get_full_tick |
|---|---|---|
| 数据时效性 | 无法保证实时。可能获取到过期数据,甚至获取不到。 | 绝对实时。本地缓存由服务器推送的数据实时刷新。 |
| 执行延迟 | 较高。若本地无缓存,可能触发同步网络请求,阻塞策略运行。 | 极低。纯内存读取,无网络 I/O 阻塞。 |
| 网络开销 | 每次请求可能产生一次独立的网络交互(拉模式)。 | 建立一次长连接后,服务器增量推送(推模式),整体效率高。 |
| 适用场景 | 偶尔查询某只活跃股票的当前价格(低频、非核心逻辑)。 | 高频交易、多股监控、事件驱动策略(强烈推荐)。 |
总结与建议
在编写严谨的量化策略时,强烈建议采用“方式二”。即在策略初始化(init)阶段,先通过 ContextInfo.subscribe_quote 订阅你关注的股票池行情,然后在 handlebar 或回调函数中通过 get_full_tick 获取最新快照。这样可以确保你的策略基于最准确、延迟最低的盘口数据进行交易决策,避免因数据过期导致的滑点或废单。