问题描述
我是老版券商的添加,项目手动添加的lib
解决方案
在 QMT 平台中使用 ContextInfo.get_trading_dates 函数时,如果发现只能获取到最近一年的日期,通常并不是函数本身的机制被修改了,而是与本地历史数据的不完整或参数设置有关。特别是对于使用老版本券商端或手动提取 lib 库独立运行的用户,这种情况非常常见。
以下是导致该问题的原因分析及解决方案:
1. 核心原因:本地历史数据缺失
get_trading_dates(stockcode, start_date, end_date, count, period) 函数在底层是依赖于本地的 K 线数据来推算交易日的。如果你的 QMT 客户端本地只下载了该品种最近一年的日线数据,那么该函数就只能返回这一年内的交易日列表。
老版本/手动 lib 的特殊性:
如果你是脱离了 QMT 终端界面,手动引用 lib 库运行,程序可能无法自动触发历史数据的按需下载(新版 QMT 在某些模式下会自动补全数据,但老版或独立环境通常不会)。
✅ 解决方法:
必须在 QMT 客户端中手动补充历史数据。
- 打开 QMT 客户端界面。
- 找到菜单栏的 【数据管理】 -> 【补充数据】。
- 选择你需要获取日期的品种(如
000001.SH或000300.SH),勾选 日线(1d) 周期。 - 将时间范围设置得更长(例如从 2010 年至今),点击下载补充。
- 数据补充完毕后,再次运行你的 Python 脚本,即可获取完整的历史交易日。
2. 参数传递逻辑问题
请检查你调用 get_trading_dates 时传入的参数。根据 QMT API 文档,该函数的参数逻辑如下:
start_date:开始时间(如'20170101')。end_date:结束时间(如'20200101')。count:K 线个数。注意:当start_date不为空时,count参数是不生效的。当start_date为空时,系统会从end_date往前取count个交易日。
如果你没有传 start_date,而是依赖 count,请确保 count 的值足够大(例如 count=2000),否则默认可能只取了较少的天数。
✅ 正确的代码示例:
def handlebar(ContextInfo):
# 方式一:明确指定开始和结束时间(推荐)
dates_by_range = ContextInfo.get_trading_dates('000300.SH', '20150101', '20230101', 1, '1d')
print(f"按时间范围获取的天数: {len(dates_by_range)}")
# 方式二:指定结束时间和往前推的 count 天数(start_date 必须为空字符串)
dates_by_count = ContextInfo.get_trading_dates('000300.SH', '', '20230101', 1000, '1d')
print(f"按 count 获取的天数: {len(dates_by_count)}")
3. 替代方案:使用指数作为基准
如果你只是想获取 A 股全局的交易日历,而不关心某个特定个股的停牌情况,建议始终使用大盘指数(如上证指数 000001.SH 或沪深300 000300.SH)作为 stockcode 参数传入。因为个股可能存在长期停牌,导致返回的交易日历不连续,而大盘指数的日期是最完整的。
总结
对于手动添加 lib 的老版本用户,90% 以上的概率是因为本地 Data 目录下缺乏早期的 K 线数据文件。请务必先登录 QMT 终端,利用【数据管理】工具把对应指数的日线数据下载全,问题即可迎刃而解。