3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!你遇到的问题主要是由于内置 QMT (ContextInfo) 与 独立版 miniQMT (xtdata) 两个不同运行环境下的 API 差异造成的。官方知识库中的说明主要针对的是内置 QMT 环境,而在 miniQMT 中,接口的设计有所不同。
以下是对你两个问题的详细解答:
subscribe 参数是否取消了?并没有取消,而是运行环境不同导致参数不适用。
在内置 QMT 环境中(使用 ContextInfo):
根据 QMT API 文档,ContextInfo.get_market_data_ex 确实包含 subscribe 参数(默认为 True)。在这个环境下,调用该函数会自动订阅传入的品种,不需要额外调用 subscribe_quote。正如你看到的文档说明,这种方式没有订阅号,只能通过停止策略来释放订阅数。
在 miniQMT 环境中(使用 xtdata):
xtdata.get_market_data_ex 接口没有 subscribe 这个参数。xtdata 的设计逻辑是将“数据订阅”和“数据获取”严格分离。因此,当你在 miniQMT 中传入 subscribe=True 时,Python 会报错提示参数无效。
get_market_data_ex 不能获取实时行情,一定需要先用 subscribe_quote 订阅?是的,在 miniQMT (xtdata) 中,必须先显式订阅。
在 miniQMT 环境下,获取实时行情的标准流程如下:
第一步:订阅数据
必须先使用 xtdata.subscribe_quote 向行情服务器发起订阅请求。只有订阅后,本地的 miniQMT 终端才会开始接收并更新该品种的实时 Tick 或 K 线数据。
第二步:获取数据
订阅成功后,你可以通过两种方式获取实时数据:
xtdata.get_market_data_ex 去读取本地已经更新的最新行情缓存。subscribe_quote 中传入 callback 回调函数,当有新行情到来时,系统会自动触发回调并推送最新数据。为了让你更清晰地理解,以下是两种环境下的正确写法:
1. 内置 QMT 环境(策略编辑器内运行):
def handlebar(ContextInfo):
# 直接获取并自动订阅,无需 subscribe_quote
data = ContextInfo.get_market_data_ex(
['open', 'high', 'low', 'close'],
['000300.SH'],
period='1d',
subscribe=True # 这里有效
)
print(data)
2. miniQMT 环境(外部 Python 运行 xtdata):
from xtquant import xtdata
import time
# 1. 必须先订阅行情
xtdata.subscribe_quote('000300.SH', period='1d', count=-1)
# 等待数据接收(实际应用中建议使用回调函数)
time.sleep(1)
# 2. 再主动获取本地缓存的最新数据(注意:没有 subscribe 参数)
data = xtdata.get_market_data_ex(
field_list=['open', 'high', 'low', 'close'],
stock_list=['000300.SH'],
period='1d'
)
print(data)
建议: 在使用 miniQMT 开发实盘策略时,强烈建议使用 xtdata.subscribe_quote 配合 callback 回调函数的方式来处理实时行情,这样不仅能保证数据的实时性,还能有效降低主动轮询带来的性能消耗。