问题描述
释义:
获取指定合约 K 线对应日期时间列表
用法:
ContextInfo.get_trading_dates(stockcode,start_date,end_date,count,period='1d')
参数:
stockcode:string,股票代码,如:'600000.SH',缺省值''默认为当前图代码
start_date:string,开始时间,如:'20170101','20170101000000',缺省值''默认为最小交易日起始时间
end_date:string,结束时间,如:'20170102','20170102000000',缺省值''默认为当前 bar 的时间
count:int,K 线个数,大于 0 时取包括 end_date 往前的 count 个 K 线,-1 时取全部
period:string,k 线类型,'1d':日线,'1m':分钟线,'3m':三分钟线,'5m':5 分钟线,'15m':15 分钟线,'30m':30 分钟线,'1h':小时线,'1w':周线,'1mon':月线,'1q':季线,'1hy':半年线,'1y':年线
返回:
List:K 线周期(交易日)列表
period 为日线时返回如['20170101','20170102',...]样式
其它返回如['20170101010000','20170102020000',...]样式
示例:
def handlebar(ContextInfo):
print ContextInfo.get_trading_dates('600000.SH','20170101','20170401',1,'1d')
解决方案
在 QMT 平台的实际使用中,很多开发者会发现 get_trading_dates 函数的返回结果与部分旧版文档或网传文档的描述不符。这主要是因为参数优先级(start_date 与 count 的互斥关系)以及count 的取值范围在底层逻辑中有着严格的限制。
根据 QMT 官方最新 API 文档,以下是该函数的真实运行逻辑与避坑指南:
1. 核心冲突:start_date 与 count 是互斥的
官方文档明确指出:start_date 不为空时不使用 count 参数。
- 误区:很多用户同时传入了
start_date和count,期望在指定时间段内再限制获取数量,或者传入count=-1期望获取全部。 - 真相:如果
start_date填入了具体时间(如'20170101'),系统会直接忽略count,返回start_date到end_date之间的所有交易日。如果想要使用count向前推算 K 线,必须将start_date设为空字符串''。
2. count 参数必须大于 0
- 误区:旧文档可能提到
count=-1取全部。 - 真相:最新官方文档规定,
count必须大于 0。当start_date为空时,系统会从end_date开始往前取count个 K 线周期。
3. 正确的代码调用示例
为了确保稳定获取交易日历,请根据您的实际需求选择以下两种写法之一:
场景 A:按时间区间获取(忽略 count)
如果您想获取两个日期之间的所有交易日,请传入具体的 start_date 和 end_date,此时 count 随便填什么都会被忽略(建议填 1 占位)。
def handlebar(ContextInfo):
# 获取 20230101 到 20230110 之间的日线交易日
# 注意:start_date 不为空,此时 count=1 会被忽略
dates = ContextInfo.get_trading_dates('600000.SH', '20230101', '20230110', 1, '1d')
print('按区间获取:', dates)
场景 B:按数量向前推算(必须清空 start_date)
如果您想获取截止到某一天(或当前最新 bar)往前推的 N 个交易日,必须将 start_date 设为 '',且 count 必须大于 0。
def handlebar(ContextInfo):
# 获取截止到 20230110 往前推的 5 个交易日
# 注意:start_date 必须为空字符串 ''
dates_by_count = ContextInfo.get_trading_dates('600000.SH', '', '20230110', 5, '1d')
print('按数量获取:', dates_by_count)
# 获取当前最新 K 线往前推的 10 个交易日(end_date 也为空)
recent_dates = ContextInfo.get_trading_dates('600000.SH', '', '', 10, '1d')
print('最新往前推10天:', recent_dates)
总结
- 查区间:
ContextInfo.get_trading_dates('代码', '开始时间', '结束时间', 1, '周期') - 查数量:
ContextInfo.get_trading_dates('代码', '', '结束时间', 数量, '周期')
遵循上述互斥原则,即可完美解决 get_trading_dates 返回结果不符合预期的问题。