问题描述
解决方案
在 QMT 中,判断一只股票当天是否停牌,最直接且推荐的方法是使用 ContextInfo.is_suspended_stock() 函数。
核心函数说明
- 函数名:
ContextInfo.is_suspended_stock(stockcode) - 参数:
stockcode(字符串),格式为代码.市场,例如'600000.SH'。 - 返回值:布尔值 (
bool)。True:表示该股票当前停牌。False:表示该股票未停牌(正常交易)。
代码示例
以下是一个完整的策略示例,展示如何在 handlebar 函数中遍历股票池并判断是否停牌:
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置股票池,这里以浦发银行(正常)和一只历史上曾停牌的股票为例
# 注意:实际运行时请根据需要设置股票池
ContextInfo.set_universe(['600000.SH', '000001.SZ'])
print("策略初始化完成")
def handlebar(ContextInfo):
# 获取当前周期对应的K线索引
index = ContextInfo.barpos
# 获取当前K线的时间(方便回测时观察)
timetag = ContextInfo.get_bar_timetag(index)
date_str = timetag_to_datetime(timetag, '%Y-%m-%d')
# 获取股票池
stock_list = ContextInfo.get_universe()
for stock in stock_list:
# 【核心代码】判断是否停牌
is_suspended = ContextInfo.is_suspended_stock(stock)
if is_suspended:
print(f"日期: {date_str}, 股票: {stock} -> 处于停牌状态,跳过交易")
# 在这里可以执行跳过逻辑,例如 continue
else:
print(f"日期: {date_str}, 股票: {stock} -> 交易正常,可以执行下单逻辑")
# 在这里编写下单逻辑,例如:
# if <你的交易条件>:
# order_shares(stock, 100, ContextInfo, 'account_id')
注意事项
- 回测模式:该函数会根据历史数据准确返回当天的停牌状态。如果股票在回测的某一天是停牌的,函数会返回
True。 - 实盘/模拟交易:该函数会根据当天的实时基础数据返回状态。
- 数据补充:在回测前,请确保已通过“数据管理”下载了对应品种的日线数据和基础信息,以保证停牌状态判断的准确性。
常见问答 (Q&A)
Q: 除了 is_suspended_stock,还有其他方式判断停牌吗?
A: 有。你可以使用 ContextInfo.get_full_tick([stock_code]) 获取最新的分笔数据,返回的字典中包含 stockStatus 字段,也可以用来辅助判断股票状态,但 is_suspended_stock 更加直接和常用。
Q: 如果股票停牌了,我发送了下单指令会怎样?
A: 如果股票处于停牌状态,交易所通常会拒单,或者订单会处于“废单”或“未报”状态。但在策略层面先进行判断并拦截,可以避免产生大量无效的报错日志,逻辑更严谨。
Q: 这个函数能判断盘中临时停牌吗?
A: is_suspended_stock 主要用于判断全天停牌或基于日线级别的停牌状态。如果是盘中临时停牌(如熔断或临时公告),建议结合 get_full_tick 查看实时的 stockStatus 或成交量变化。