3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
set_universe)是策略开发的第一步。然而,如果股票池中包含停牌股,可能会导致策略在回测或实盘中产生无效信号、资金占用锁定,甚至引发交易接口报错。\n\n本文将详细介绍如何在QMT的 init 初始化函数中,利用官方API动态过滤掉停牌股,确保股票池的健康运行。\n\n---\n\n### 一、 核心API介绍\n\n要实现动态过滤停牌股,我们需要用到以下两个核心接口:\n\n1. ContextInfo.is_suspended_stock(stockcode)\n - 释义:判定指定股票在当前时间是否停牌。\n - 参数:stockcode(字符串,格式为 代码.市场,如 '600000.SH')。\n - 返回值:True(停牌)或 False(未停牌)。\n\n2. ContextInfo.set_universe(stocklist)\n - 释义:设定策略的基础股票池。\n\n---\n\n### 二、 动态过滤停牌股的 Python 解决方案\n\n以下是完整的策略初始化避坑代码。我们在 init 中定义原始股票池,通过循环检测并剔除停牌股,最后将过滤后的干净股票池传给 set_universe。\n\npython\n#encoding:gbk\n\ndef init(ContextInfo):\n # 1. 定义原始候选股票池\n raw_stock_list = ['600000.SH', '000001.SZ', '600004.SH', '000002.SZ']\n \n # 2. 创建一个空列表用于存放未停牌的股票\n active_stock_list = []\n \n print("--- 开始检测股票池停牌状态 ---")\n for stock in raw_stock_list:\n # 使用 is_suspended_stock 接口判断是否停牌\n if ContextInfo.is_suspended_stock(stock):\n stock_name = ContextInfo.get_stock_name(stock)\n print(f"警告: 股票 {stock} ({stock_name}) 当前处于停牌状态,已自动过滤。")\n else:\n active_stock_list.append(stock)\n \n # 3. 将过滤后的股票池设为策略运行股票池\n ContextInfo.set_universe(active_stock_list)\n print(f"最终生效股票池: {ContextInfo.get_universe()}")\n print("--- 股票池初始化完成 ---")\n\ndef handlebar(ContextInfo):\n # 策略核心逻辑\n pass\n\n\n---\n\n### 三、 避坑指南与实盘建议\n\n1. 盘中动态停牌处理:\n init 函数仅在策略启动时执行一次。如果某只股票在交易时间内临时停牌,仅在 init 中过滤是不够的。建议在 handlebar 中也加入停牌判断:\n python\n def handlebar(ContextInfo):\n for stock in ContextInfo.get_universe():\n if ContextInfo.is_suspended_stock(stock):\n # 临时停牌,跳过交易逻辑\n continue\n # 正常交易逻辑\n \n2. 数据补充:\n is_suspended_stock 依赖本地历史行情数据。在运行策略前,请务必通过QMT客户端的【数据管理】功能,补充完整对应品种的历史日线和实时数据,否则可能导致停牌状态判断不准确。