问题描述
ContextInfo.is_suspended_stock 除了两个股票其他返回都是 True,请问这是什么情况,应该怎么解决呢
解决方案
在 QMT 平台中使用 ContextInfo.is_suspended_stock() 函数判断股票是否停牌时,如果发现除了极少数股票外,其他绝大多数股票都返回 True(即判定为停牌),通常是由以下几个原因导致的。以下是详细的原因分析及相应的解决方法:
1. 本地历史数据缺失或未更新(最常见原因)
原因分析:
QMT 平台在回测或运行策略时,很多状态判断(包括停牌状态)依赖于本地的历史行情数据。如果本地没有下载对应股票的日线数据,或者数据没有更新到最新日期,系统在查询不到有效行情数据时,会默认将该股票判定为“停牌”状态(返回 True)。那两个返回 False 的股票,很可能是你之前单独查看过或下载过数据的股票。
解决方法:
在 QMT 客户端中手动补充数据。
- 打开 QMT 客户端,点击顶部菜单栏的**【数据管理】**。
- 选择**【补充数据】**。
- 选择你需要运行策略的市场(如沪深 A 股)、品种以及日线周期。
- 设定好时间范围(确保包含你当前回测或运行的时间段),点击下载/补充数据。
- 数据补充完成后,重新运行策略。
2. 股票代码格式不正确
原因分析:
ContextInfo.is_suspended_stock(stockcode) 函数要求传入的股票代码必须包含市场后缀,格式为 '代码.市场'(例如 '600000.SH' 或 '000001.SZ')。如果只传入了纯数字代码(如 '600000'),系统无法识别该股票,也会默认返回 True。
解决方法:
检查代码中传入的股票代码格式,确保带有正确的市场后缀。
# 错误写法
is_suspended = ContextInfo.is_suspended_stock('600000')
# 正确写法
is_suspended = ContextInfo.is_suspended_stock('600000.SH')
3. 客户端未连接行情服务器
原因分析:
如果你是在实盘或模拟盘模式下运行策略,且客户端处于断网或未成功连接行情服务器的状态,系统无法获取最新的实时状态,可能会导致判断异常。
解决方法:
检查 QMT 客户端右下角的网络连接状态,确保行情服务器连接正常(显示绿色或有延迟数值)。如果断开,请尝试重新登录或切换行情节点。
4. 调用的时间点非交易时间
原因分析:
在某些特定情况下,如果在非交易时间段(如周末、节假日或盘后很晚的时间)请求实时状态,且本地数据未同步,可能会出现状态判定不准确的情况。
解决方法:
确保在正常的交易时间段内测试实时策略,或者在回测模式下确保历史数据完整。
总结排查步骤:
- 第一步:检查代码格式是否为
'000001.SZ'。 - 第二步:去【数据管理】下载全市场的日线数据。
- 第三步:检查网络和行情连接状态。
按照以上步骤排查,通常可以解决绝大多数股票被误判为停牌的问题。