3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在QMT量化策略开发中,ContextInfo.get_trading_dates 是一个非常核心的行情管理函数,用于获取指定个股、合约或指数的K线(交易日)时间戳列表。在实际应用中,开发者通常会面临两种定位需求:获取最近N根K线的时间(数量定位)或获取某时间段内的所有K线时间(区间定位)。
本文将深度对比 count 参数与 start_date 参数在 get_trading_dates 中的运行机制、优先级及应用场景。
首先,我们来看 get_trading_dates 的标准调用格式:
ContextInfo.get_trading_dates(stockcode, start_date, end_date, count, period)
stockcode: 证券代码(如 '600000.SH'),缺省时默认为当前主图代码。start_date: 区间起始时间(格式如 '20170101')。若不为空,则激活“区间定位”模式。end_date: 区间结束时间,缺省时默认为当前 bar 的时间。count: 整数,表示获取的K线数量。若激活“数量定位”模式,将从 end_date 往前获取 count 个K线时间。period: K线周期(如 '1d' 代表日线,'1m' 代表1分钟线等)。这两者的本质区别在于定位维度与参数优先级:
| 对比维度 | count 数量定位 |
start_date 区间定位 |
|---|---|---|
| 定位逻辑 | 从 end_date 往前倒推固定数量的K线。 |
获取 start_date 到 end_date 闭区间内的所有K线。 |
| 参数优先级 | 低。当 start_date 不为空时,count 参数将被忽略。 |
高。只要设置了有效的 start_date,系统即切换为区间模式。 |
| 返回长度 | 长度恒等于 count(除非历史数据不足)。 |
长度动态变化,取决于该时间段内的实际交易日数量。 |
| 典型场景 | 计算技术指标(如获取最近20日均线所需的时间戳)。 | 历史财务分析、特定历史区间回测、跨品种对齐。 |
count 获取最近 5 个交易日的日线时间戳当我们需要计算短期指标(如5日均价),只需要获取当前时间往前的5个交易日,此时应将 start_date 设为空字符串 '':
# coding:gbk
def handlebar(ContextInfo):
# 获取当前主图品种,从当前bar往前数5个交易日的列表
trading_dates = ContextInfo.get_trading_dates(ContextInfo.stockcode, '', '', 5, '1d')
print(f"最近5个交易日: {trading_dates}")
# 输出示例: ['20231023', '20231024', '20231025', '20231026', '20231027']
start_date 获取特定日期区间内的所有交易日当我们需要统计某一特定历史阶段(如2023年第一季度)的交易日时,必须指定 start_date。此时无论 count 填什么,都会被系统忽略:
# coding:gbk
def handlebar(ContextInfo):
# 获取2023年1月1日至2023年3月31日之间的所有日线交易日
# 此时 count 填 1 也会被忽略,实际返回该区间内全部约60个交易日
trading_dates = ContextInfo.get_trading_dates('600000.SH', '20230101', '20230331', 1, '1d')
print(f"2023年Q1交易日总数: {len(trading_dates)}")
start_date 和 count,试图获取“某天开始往后的N个交易日”。这是错误的。QMT的底层逻辑是:一旦 start_date 有值,count 立即失效。如果想获取“某天开始往后的N个交易日”,应先用区间定位获取较长列表,再在 Python 中使用切片 [:N] 截取。period 为 '1d'(日线)时,返回的日期格式为 ['YYYYMMDD', ...];而当 period 为分钟线(如 '1m', '5m')时,返回的格式为 ['YYYYMMDDHHMMSS', ...]。在做时间格式解析时需特别注意。get_trading_dates 前,请务必通过 QMT 客户端的 “数据管理” 功能补充对应品种和周期的历史行情数据,否则可能返回空列表。