🚀 AI 一键生成 qmt 策略代码

QMT 平台 subscribe_quote 订阅行情时 start_time 和 end_time 参数有什么用?

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

问题描述

xtdata.subscribe_quote中的start_time和end_time参数

在使用单股订阅时,我看参数中有开始和结束时间,我不太理解。

我测试了不管 start_time 怎么写,单股订阅都是,订阅成功后返回最新产程的一条数据,结果似乎跟我传不传 start_time 没有关系,end_time 同理。

所以,我想问,这两个时间参数,在单股订阅时,起到了什么作用,写与不写有什么区别?

解决方案

在 QMT 量化平台中,关于行情订阅接口(如 subscribe_quote 或带有订阅功能的 get_market_data_ex)中的 start_timeend_time 参数,很多开发者会产生与您相同的疑惑。以下是这两个参数的具体作用及原理解析:

1. 核心区别:历史数据拉取 vs 实时行情推送

在 QMT 的数据机制中,获取数据通常分为两部分:

  • 历史数据拉取:获取过去已经发生的数据(由 start_timeend_time 控制)。
  • 实时行情推送:建立订阅关系后,接收未来新产生的数据(由 subscribe 动作和 callback 回调控制)。

当您调用订阅接口时,start_timeend_time 的作用仅仅是指定在建立订阅关系时,需要同步拉取哪一段历史数据到本地缓存或作为函数的直接返回值。它们不会影响未来实时行情的推送逻辑。

2. 为什么测试时感觉这两个参数没有起作用?

您在测试时发现“不管怎么写,都是返回最新产生的一条数据”,这通常是因为您观察的是**回调函数(Callback)**的输出,或者是直接读取了最新状态。

  • 回调函数的触发机制:订阅成功后,回调函数(如 on_quote)只会在市场上有新的 Tick 或新的 K 线(Bar)产生时才会被触发。因此,回调函数里永远只会推送最新产生的那一条数据,这与您设置的 start_timeend_time 无关。
  • 历史数据的去向:如果您设置了 start_timeend_time,这部分历史数据通常是通过函数的直接返回值返回的(例如 get_market_data_ex 会返回一个 DataFrame),或者被静默下载到了本地数据缓存中,供后续使用 get_local_data 等接口读取。

3. 写与不写的具体区别

结合 QMT 内置的 ContextInfo.get_market_data_ex 接口(该接口集成了获取数据和订阅功能)来看:

# 用法示例
data = ContextInfo.get_market_data_ex(
    ['open', 'high', 'low', 'close'], 
    ['000300.SH'], 
    period='1d',
    start_time='20230101', # 指定开始时间
    end_time='20231001',   # 指定结束时间
    subscribe=True         # 开启订阅
)
  • 填写 start_timeend_time

    • 作用:函数执行时,会首先去服务器拉取指定时间段(如 20230101 到 20231001)的历史数据并返回给变量 data。同时,因为开启了订阅,20231001 之后产生的新行情会自动更新到本地。
    • 适用场景:策略启动时需要计算历史指标(如计算过去 20 天的均线),计算完后还需要根据最新的实时行情进行交易。
  • 不写(留空) start_timeend_time

    • 作用:根据文档,为空时通常视为“最新”。函数执行时可能只返回当前最新的一根 Bar 或 Tick 数据。同时建立订阅关系,等待未来的新数据推送。
    • 适用场景:策略不需要依赖历史数据,只需要根据接下来发生的实时盘口变动(如 Tick 级别的最新价突破)来触发交易。

总结

在单股订阅时:

  • start_timeend_time 决定了您“过去”需要多少数据(用于初始化策略状态或计算指标)。
  • 订阅动作(Subscribe)决定了您“未来”能收到多少数据(通过回调函数逐条推送最新数据)。

如果您只需要实时推送的最新数据,这两个参数完全可以留空;如果您需要先获取一段历史数据作为基础,再接收实时更新,就需要正确填写这两个时间参数,并从函数的返回值中获取历史数据部分。