🚀 AI 一键生成 qmt 策略代码

QMT 平台 get_trading_dates 函数实际效果与文档不符怎么办?

qmt | 发布时间: 2026/5/22
以下内容由 EasyQuant 生成。

问题描述

get_trading_dates 的实际使用效果和文档不符!

释义:
获取指定合约 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_datecount,期望在指定时间段内再限制获取数量,或者传入 count=-1 期望获取全部。
  • 真相:如果 start_date 填入了具体时间(如 '20170101'),系统会直接忽略 count,返回 start_dateend_date 之间的所有交易日。如果想要使用 count 向前推算 K 线,必须将 start_date 设为空字符串 ''

2. count 参数必须大于 0

  • 误区:旧文档可能提到 count=-1 取全部。
  • 真相:最新官方文档规定,count 必须大于 0。当 start_date 为空时,系统会从 end_date 开始往前取 count 个 K 线周期。

3. 正确的代码调用示例

为了确保稳定获取交易日历,请根据您的实际需求选择以下两种写法之一:

场景 A:按时间区间获取(忽略 count)

如果您想获取两个日期之间的所有交易日,请传入具体的 start_dateend_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 返回结果不符合预期的问题。