Recent Posts
讯投 QMT 使用小技巧 -如何判断今天是不是交易日
在讯投QMT中判断今天是否为交易日
在讯投QMT平台中,你可以通过以下几种方法来判断当天是否为交易日:
方法一:使用ContextInfo.get_trading_dates()函数
def is_trading_day():
# 获取最近一段时间的交易日历
trading_dates = ContextInfo.get_trading_dates('SH', 0, 10) # 获取从今天开始的10个交易日
# 获取当前日期
today = datetime.datetime.now().strftime('%Y%m%d')
# 判断今天是否在交易日列表中
return today in trading_dates
方法二:使用xtdata模块(如果可用)
import xtdata
def is_trading_day():
# 获取今天的日期
today = datetime.datetime.now().strftime('%Y%m%d')
# 查询上证指数的交易日历
trading_dates = xtdata.get_trading_dates('SH', today, today)
return len(trading_dates) > 0
方法三:使用系统时间函数
def is_trading_day():
# 获取当前时间
now = datetime.datetime.now()
# 判断是否为工作日(周一到周五)
if now.weekday() >= 5: # 5=周六,6=周日
return False
# 进一步检查是否是节假日(需要维护节假日表)
# 这里可以添加你的节假日判断逻辑
return True
注意事项
- 第一种方法是最可靠的,因为它直接从交易所获取交易日历
- 节假日需要特别处理,中国的节假日调休会导致非周末的工作日也可能不是交易日
- 建议在开盘前运行检查,因为有些函数在非交易时间可能返回不同结果
- 以上代码仅供参考,大家需要根据自己的实际情况判断这些代码是否满足自己的要求。
你可以根据你的QMT版本和可用模块选择最适合的方法。第一种方法通常是首选,因为它直接查询交易所的交易日历。
讯投 QMT 使用小技巧:判断当前时段是交易/非交易/竞价/盘后等时间段
A股的交易时间段
A股的交易时段分为开盘集合竞价、连续竞价(早盘、午盘)和收盘集合竞价三个阶段,具体时间如下:
1. 交易日安排
- 周一至周五(法定节假日除外)
- 不交易:周末(周六、周日)和法定节假日(如春节、国庆节等)。
2. 交易时段明细
时段 | 时间 | 备注 |
---|---|---|
开盘集合竞价 | 9:15 - 9:25 | - 9:15-9:20:可申报或撤单。- 9:20-9:25:可申报,不可撤单。 |
早盘连续竞价 | 9:30 - 11:30 | 正常交易时段,可自由买卖。 |
午间休市 | 11:30 - 13:00 | 不接受委托,未成交的订单仍有效。 |
午盘连续竞价 | 13:00 - 14:57 | 正常交易时段。 |
收盘集合竞价 | 14:57 - 15:00 | 可申报,不可撤单,以最大成交量撮合收盘价。 |
3. 其他规则
- 科创板(688开头) & 创业板(300开头):
- 新增盘后固定价格交易(15:05-15:30),按当日收盘价成交(需手动挂单)。
- 大宗交易:
- 通常为15:00-15:30,需满足最低交易数量或金额门槛。
注意事项
- 非交易时段(如夜间)的委托单会被暂存,次日9:15进入系统。
- 集合竞价的成交价格遵循“最大成交量”原则,所有交易按同一价格成交。
QMT中的函数判断
以下是一个 Python 函数,用于判断当前时间属于 A 股的哪个交易时段(包括科创板和创业板的盘后交易),如果不是交易时段则返回 “非交易时段”:
import datetime
def get_a_share_trading_period():
now = datetime.datetime.now()
current_time = now.time()
weekday = now.weekday() # 0-4 是周一到周五
# 检查是否为交易日(周一至周五,非节假日)
if weekday >= 5: # 周六、周日
return "非交易时段(周末休市)"
# 定义交易时段
trading_periods = [
{"name": "开盘集合竞价", "start": "09:15:00", "end": "09:25:00", "can_cancel": True},
{"name": "早盘连续竞价", "start": "09:30:00", "end": "11:30:00", "can_cancel": True},
{"name": "午间休市", "start": "11:30:00", "end": "13:00:00", "can_cancel": False},
{"name": "午盘连续竞价", "start": "13:00:00", "end": "14:57:00", "can_cancel": True},
{"name": "收盘集合竞价", "start": "14:57:00", "end": "15:00:00", "can_cancel": False},
]
# 科创板和创业板的盘后交易(15:05-15:30)
kechuang_cyb_period = {"name": "科创/创业板盘后交易", "start": "15:05:00", "end": "15:30:00", "can_cancel": False}
# 检查当前是否在交易时段
for period in trading_periods:
start_time = datetime.datetime.strptime(period["start"], "%H:%M:%S").time()
end_time = datetime.datetime.strptime(period["end"], "%H:%M:%S").time()
if start_time <= current_time <= end_time:
return f"{period['name']}(可撤单: {'是' if period['can_cancel'] else '否'})"
# 检查是否在科创/创业板盘后交易时段
kechuang_start = datetime.datetime.strptime(kechuang_cyb_period["start"], "%H:%M:%S").time()
kechuang_end = datetime.datetime.strptime(kechuang_cyb_period["end"], "%H:%M:%S").time()
if kechuang_start <= current_time <= kechuang_end:
return f"{kechuang_cyb_period['name']}(按收盘价交易,不可撤单)"
# 不在任何交易时段
return "非交易时段"
# 测试
print(get_a_share_trading_period())
输出示例
- 如果当前时间是 09:20:00,返回:
开盘集合竞价(可撤单: 是)
- 如果当前时间是 12:30:00,返回:
午间休市(可撤单: 否)
- 如果当前时间是 15:15:00,返回:
科创/创业板盘后交易(按收盘价交易,不可撤单)
- 如果当前时间是 16:00:00 或周末,返回:
非交易时段
功能说明
- 判断交易日:仅周一到周五有效,周末返回非交易时段。
- 标准交易时段:包括集合竞价、连续竞价和收盘竞价。
- 科创/创业板盘后交易:15:05-15:30 额外判断。
- 撤单规则:集合竞价部分时段不可撤单(如 9:20-9:25)。
如果需要进一步扩展(如节假日判断),当天是不是交易日,请阅读我们提供的另外一个讯投qmt使用小技巧: 如何判断今天是不是交易日 https://invest.wtsolutions.cn/qmt-is-today-a-trading-day。
迅投QMT交易终端小技巧-为什么每天早晨QMT会退出登录/重新启动/自动初始化
如果您的迅投QMT或者是券商QMT的交易终端,每天早晨8点9点会自动退出登录、自动重新启动或者自动初始化,通常是因为在系统设置里面,设置了在指定的时间自动初始化,如下图中的系统设置配置。
如果我们不希望它自动初始化,就可以取消勾选这个选项。但,应确保在每个策略内,策略代码会把一些策略内的变量之类的,要每天初始化,以免当天交易的时候,还使用了上一个交易日的一些变量的数据。