3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中,使用 get_market_data_ex 获取数据时,本质上是优先从本地客户端的数据库中读取数据。您遇到的“分钟数据全部为同一个值(如 4.12)”的情况,根本原因在于本地缺失该股票当天的历史分钟 K 线数据。
虽然您在函数中设置了 subscribe=True,但这仅仅意味着订阅该股票未来的最新行情推送,它并不会瞬间自动把当天早些时候缺失的分钟 K 线历史数据补齐。当本地没有真实的分钟 K 线时,QMT 可能会用昨收价或某个缓存的切片价格来填充,导致您看到连续相同的数值。
至于“购买这只股票后数据才正确”,是因为您的交易行为(或者在交易面板点击了该股票)触发了客户端对该标的行情的深度激活,客户端在后台自动拉取了该股票的最新切片和部分 K 线数据,从而使得后续的数据读取恢复正常。
是的,必须提前下载或补充数据。 为了避免这种数据错误,您需要确保本地拥有完整的分钟级别数据。以下是具体的避免和解决步骤:
在运行策略之前,您必须在 QMT 客户端中补充所需的分钟数据:
如果您只对特定的股票池感兴趣,可以在 init 函数中使用 set_universe 设定股票池,这样 QMT 在策略启动时会更好地准备这些股票的运行环境。
def init(ContextInfo):
# 设定策略关注的股票池
ContextInfo.set_universe(['000665.SZ'])
如果您在盘中动态获取某些不在初始股票池中的股票数据,建议在获取数据前,先使用 subscribe_quote 订阅该股票的行情,确保底层数据通道被激活。
def handlebar(ContextInfo):
stock = '000665.SZ'
# 确保当前是最新的一根 Bar
if not ContextInfo.is_last_bar():
return
# 获取数据前,确保本地数据已通过客户端下载
data = ContextInfo.get_market_data_ex(
['close'],
[stock],
period='1m',
count=30,
dividend_type='front',
fill_data=True,
subscribe=True
)
print(data)
QMT 的 get_market_data_ex 强依赖于本地数据。“代码里的 subscribe=True” 无法替代 “客户端的数据下载”。请务必养成盘前在“数据管理”中补充 1 分钟线数据的习惯,这样就能彻底避免获取到全是同一个错误数值的问题。