问题描述
解决方案
在 QMT 量化交易平台中,判断一只股票是否处于停牌状态,最直接且推荐的方法是使用 ContextInfo.is_suspended_stock() 函数。
以下是具体的实现方法和代码示例:
核心函数说明
- 函数名:
ContextInfo.is_suspended_stock(stockcode) - 参数:
stockcode(string),格式为代码.市场,例如'600000.SH'。 - 返回值:
bool类型。True:表示该股票处于停牌状态。False:表示该股票未停牌(正常交易)。
代码实现示例
以下代码展示了如何在 handlebar 函数(K线驱动或定时驱动)中,在下单前检查股票是否停牌。
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置股票池,例如浦发银行
ContextInfo.set_universe(['600000.SH'])
def handlebar(ContextInfo):
# 获取当前周期对应的股票代码(如果是单股运行)
# 如果是多股运行,通常会遍历 ContextInfo.get_universe()
stock_code = ContextInfo.stockcode
# 或者指定一个具体的代码进行测试
# stock_code = '600000.SH'
# 判断是否停牌
is_suspended = ContextInfo.is_suspended_stock(stock_code)
if is_suspended:
print(f"股票 {stock_code} 当前处于停牌状态,不执行交易。")
# 在此处直接返回,跳过后续交易逻辑
return
else:
print(f"股票 {stock_code} 交易正常,继续执行策略逻辑。")
# --- 下面可以编写具体的交易逻辑 ---
# 例如:passorder(...)
注意事项
- 代码格式:传入的股票代码必须包含市场后缀(如
.SH或.SZ),否则函数可能无法正确判断。 - 回测与实盘:该函数在回测模式和实盘/模拟交易模式下均有效。在回测中,它会根据历史数据的停牌标记返回结果;在实盘中,它会获取当天的实时停牌状态。
- 数据补充:在进行回测前,请确保已下载了对应品种的“日线”或“基础信息”数据,以保证停牌信息的准确性。
Q&A
Q: ContextInfo.is_suspended_stock 函数支持传入股票代码列表吗?
A: 不支持。该函数一次只能接收一个股票代码字符串。如果需要判断股票池中的多只股票,需要使用 for 循环遍历股票列表逐一判断。
Q: 除了 is_suspended_stock,还有其他方式判断停牌吗?
A: 可以使用 ContextInfo.get_full_tick(stock_code) 获取分笔数据,查看返回字典中的 stockStatus 字段,但解析状态码相对复杂。通常情况下,直接使用 is_suspended_stock 是最简单且官方推荐的做法。
Q: 如果股票在盘中临时停牌,这个函数能检测到吗?
A: 在实盘模式下,该函数基于接收到的最新行情数据状态进行判断。如果交易所推送了停牌状态更新,该函数返回的值会相应变化。