问题描述
解决方案
在 QMT 平台中,判断一只股票是否停牌主要使用 ContextInfo.is_suspended_stock() 函数。
核心函数说明
- 函数名:
ContextInfo.is_suspended_stock(stockcode) - 参数:
stockcode(字符串),格式为代码.市场,例如'600000.SH'。 - 返回值:
bool类型。True:表示该股票当前处于停牌状态。False:表示该股票当前处于正常交易状态(未停牌)。
代码实现示例
以下是一个完整的策略示例,展示了如何在 handlebar 函数中遍历股票池,并在下单前过滤掉停牌的股票。
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置股票池,这里以浦发银行(正常)和某个可能停牌的股票为例
# 注意:实际运行时请根据当天情况设置股票池
stock_list = ['600000.SH', '000001.SZ']
ContextInfo.set_universe(stock_list)
# 设置账号(这里仅为示例,实盘需替换为真实账号)
ContextInfo.set_account('YOUR_ACCOUNT_ID')
def handlebar(ContextInfo):
# 获取当前周期对应的股票池
universe = ContextInfo.get_universe()
for stock_code in universe:
# 1. 判断是否停牌
is_suspended = ContextInfo.is_suspended_stock(stock_code)
if is_suspended:
print(f"股票 {stock_code} 今日停牌,跳过交易。")
continue # 跳过本次循环,不执行后续下单逻辑
# 2. 如果未停牌,继续执行策略逻辑
print(f"股票 {stock_code} 交易正常,正在计算信号...")
# 示例:简单的下单逻辑(仅作演示)
# 获取最新价
last_price = ContextInfo.get_market_data(['close'], stock_code=[stock_code], count=1, period='1d')
if not last_price.empty:
# 假设满足条件买入 100 股
# passorder(23, 1101, ContextInfo.accountID, stock_code, 5, -1, 100, ContextInfo)
pass
注意事项
- 回测与实盘的区别:
- 回测模式:该函数会根据历史数据中的停牌标记返回状态。如果历史数据不完整,可能会影响判断准确性,建议在数据管理中补充完整数据。
- 实盘/模拟模式:该函数会根据当天的实时行情数据返回状态。
- 数据格式:传入的股票代码必须包含市场后缀(如
.SH或.SZ),否则函数可能无法正确识别。
Q&A
Q: ContextInfo.is_suspended_stock 在回测中能准确判断历史上的停牌吗?
A: 可以。在回测模式下,QMT 会读取历史行情数据中的停牌标记。只要本地下载了完整的历史日线数据和基础信息数据,该函数就能正确返回历史上某一天该股票是否停牌。
Q: 除了 is_suspended_stock,还有其他方式判断停牌吗?
A: 还可以通过 ContextInfo.get_full_tick(stock_code) 获取分笔数据,查看返回字典中的 stockStatus 字段,或者检查成交量(Volume)是否为 0(但在某些极端情况下,非停牌股票也可能无成交,因此不如 is_suspended_stock 准确)。官方推荐直接使用 is_suspended_stock。
Q: 如果股票临时停牌(盘中停牌),这个函数有效吗?
A: 有效。在实盘运行模式下,该函数基于实时行情推送的状态进行判断。如果股票在盘中突然停牌,行情状态更新后,该函数会返回 True。