问题描述
period 取值 1m\5m\15m\30m 时,都正常,本地也下载了 5m 的历史数据。请大神们帮助。
解决方案
在 QMT 平台中使用 get_market_data 或 get_market_data_ex 获取行情数据时,如果 period='1h' 报错,而其他分钟周期正常,通常是由本地数据缺失引起的。以下是详细的原因分析和解决方案:
1. 报错原因分析
QMT 的历史行情数据接口(如 get_market_data 和 get_market_data_ex)高度依赖本地客户端的数据缓存。虽然您提到本地已经下载了 5m 的历史数据,但 QMT 底层通常不会自动使用小周期(如 5m)去合成大周期(如 1h)的数据供 API 直接调用。
如果您在 API 中指定了 period='1h',系统会直接去本地数据库中寻找 1 小时线的数据文件。如果本地没有专门下载过 1 小时线的数据,就会导致读取失败或报错。
(注:另外请注意检查代码中的拼写,您问题中写的是 get_mark_data,正确的函数名应为 get_market_data 或官方推荐的新接口 get_market_data_ex。)
2. 解决方案:补充 1 小时线数据
您需要手动在 QMT 客户端中补充 1 小时周期的数据:
- 打开 QMT 客户端,点击顶部菜单栏的 “数据管理”(或在左侧导航栏找到数据管理模块)。
- 选择 “补充数据”。
- 在弹出的数据下载窗口中:
- 选择您需要回测或运行的市场和品种(如沪深 A 股)。
- 在数据周期选项中,务必勾选 “1小时线”(部分版本可能显示为“60分钟线”)。
- 设置好需要补充的时间范围。
- 点击 “开始补充”,等待数据下载完成。
3. 推荐的代码调用方式
数据补充完成后,建议使用 QMT 较新的 get_market_data_ex 接口来获取数据,该接口返回 Pandas DataFrame 格式,处理起来更加方便,且支持自动订阅。
示例代码:
#coding:gbk
def init(ContextInfo):
# 设置股票池
ContextInfo.set_universe(['000300.SH'])
def handlebar(ContextInfo):
# 确保只在最后一根K线执行,避免历史回测中重复打印
if not ContextInfo.is_last_bar():
return
# 使用 get_market_data_ex 获取 1h 数据
# 注意:确保本地已经下载了 1h 周期的数据
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close', 'volume'],
stock_code=['000300.SH'],
period='1h',
count=10, # 获取最近10根1小时线
dividend_type='front', # 前复权
subscribe=True # 开启订阅
)
if '000300.SH' in data and not data['000300.SH'].empty:
print("成功获取 1h 数据:")
print(data['000300.SH'])
else:
print("未获取到数据,请检查本地是否已补充 1h 周期数据。")
总结
遇到特定周期报错时,第一步永远是去 QMT 的“数据管理”中检查并补充对应周期的历史数据。只要本地数据完整,period='1h' 即可正常工作。