问题描述
解决方案
在 QMT 中,获取某个股票在特定时间段内的所有交易日日期,可以使用 ContextInfo.get_trading_dates 函数。
核心函数说明
ContextInfo.get_trading_dates(stockcode, start_date, end_date, count, period)
- stockcode: 股票代码(如
'600000.SH')。 - start_date: 开始日期字符串(格式
'YYYYMMDD')。 - end_date: 结束日期字符串(格式
'YYYYMMDD')。 - count: K线个数。注意:当设置了
start_date时,此参数会被忽略,但调用时仍需传入一个整数(如1)作为占位符。 - period: 周期,获取日线交易日列表应填
'1d'。
代码实现
以下是一个完整的策略示例代码,它会在策略初始化时计算过去 30 天的日期范围,并打印出该范围内该股票的所有实际交易日。
# -*- coding: gbk -*-
import datetime
def init(ContextInfo):
# 1. 设置要查询的股票代码
stock_code = '600000.SH'
# 2. 计算过去一个月的起止日期
# 获取当前时间
now = datetime.datetime.now()
# 结束时间设为今天 (格式: YYYYMMDD)
end_date = now.strftime('%Y%m%d')
# 开始时间设为30天前
start_date = (now - datetime.timedelta(days=30)).strftime('%Y%m%d')
# 3. 调用API获取交易日列表
# 参数说明:
# stockcode: 股票代码
# start_date: 开始日期
# end_date: 结束日期
# count: 1 (因为指定了start_date,这个参数不起作用,但必须填一个整数)
# period: '1d' (日线周期)
trading_dates = ContextInfo.get_trading_dates(stock_code, start_date, end_date, 1, '1d')
# 4. 打印结果
print("=" * 30)
print("查询标的: {}".format(stock_code))
print("查询范围: {} 至 {}".format(start_date, end_date))
print("交易日数量: {}".format(len(trading_dates)))
print("交易日列表: ")
print(trading_dates)
print("=" * 30)
def handlebar(ContextInfo):
# 本示例仅在init中演示获取数据,handlebar中无需操作
pass
注意事项
- 数据格式:返回的
trading_dates是一个包含字符串的列表(例如['20231010', '20231011', ...])。 - 停牌处理:该函数返回的是该标的在交易所存在的 K 线时间。如果股票在某天停牌且没有生成 K 线数据(取决于数据源的处理方式),该日期可能不会出现在列表中。通常情况下,
get_trading_dates返回的是交易所的交易日历。 - 周期参数:
period参数必须设置为'1d'才会返回'YYYYMMDD'格式的日期。如果设置为分钟周期(如'1m'),返回的将是包含时间的字符串(如'20231010093100')。
Q&A
Q: 如果我只想获取最近的 N 个交易日,而不是按日期范围获取,该怎么写?
A: 可以将 start_date 设置为空字符串 '',然后通过 count 参数指定数量。例如获取最近 20 个交易日:ContextInfo.get_trading_dates('600000.SH', '', '20231027', 20, '1d')。
Q: get_trading_dates 返回的列表是排序的吗?
A: 是的,返回的列表是按照时间从早到晚升序排列的。
Q: 为什么代码第一行要加 # -*- coding: gbk -*-?
A: QMT 的 Python 编辑器和底层环境默认使用 GBK 编码。添加此声明可以防止在代码中使用中文字符(如注释或打印信息)时出现乱码或报错。