问题描述
1、直接 get_full_tick
2、先 subscribe_whole_quote 再 get_full_tick
请问两个方式 get_full_tick 是怎么获取数据的?有什么区别
解决方案
在 QMT 平台中,get_full_tick 是用于获取最新分笔(Tick)数据的核心函数。关于直接调用和先订阅再调用的区别,主要体现在数据更新机制和本地缓存的实时性上。
1. 直接调用 get_full_tick
获取机制:
当你直接调用 ContextInfo.get_full_tick(stock_code) 时,QMT 会直接去读取本地内存缓存中该股票的最新 Tick 数据。
特点与隐患:
- 如果该股票是当前主图品种,或者已经在股票池(Universe)中被平台默认维护,你能获取到相对最新的数据。
- 如果该股票不在主图且未被订阅,本地缓存可能不会在后台实时高频更新。此时直接调用,可能会获取到旧的快照数据,或者需要触发一次同步的网络请求(导致策略执行出现微小延迟)。
2. 先订阅(如 subscribe_quote)再调用 get_full_tick
获取机制:
当你先使用 ContextInfo.subscribe_quote()(或全推订阅接口)订阅了相关股票的 Tick 行情后,QMT 终端会向服务器注册这些股票的行情推送。服务器会主动、实时地将最新的 Tick 数据推送到本地,并持续更新本地内存缓存。
此时再调用 get_full_tick,实际上是直接从已经保持最新状态的本地内存中极速读取数据。
特点与优势:
- 极高的实时性:数据由服务器主动推送,本地缓存永远是最新状态,读取时没有网络等待时间。
- 事件驱动:结合回调函数(Callback),可以在 Tick 数据到达的瞬间立刻触发逻辑,然后再用
get_full_tick提取完整字段,非常适合高频或对延迟敏感的策略。
总结与建议
| 对比维度 | 直接调用 get_full_tick |
先订阅再调用 get_full_tick |
|---|---|---|
| 数据更新方式 | 被动读取(可能依赖主图或触发同步拉取) | 主动推送(服务器实时推送到本地缓存) |
| 实时性 | 较低(非主图品种可能存在延迟或数据陈旧) | 极高(本地缓存始终保持最新) |
| 适用场景 | 偶尔查询某只股票的状态,对毫秒级延迟不敏感的低频策略 | 多品种监控、高频交易、对 Tick 级别信号要求极高的策略 |
最佳实践:
如果你需要监控非主图的多个品种,或者编写对实时性要求较高的 Tick 级策略,强烈建议先使用 subscribe_quote 订阅行情,然后再通过 get_full_tick 获取完整数据。这样既能保证数据的绝对新鲜,又能最大化利用 QMT 的本地内存读取性能。