3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在QMT实盘量化交易中,如果策略信号触发了停牌股票的买入或卖出指令,调用 passorder 等交易函数时会导致柜台拒绝申报,甚至引发策略运行报错。此外,频繁对停牌股发起无效申报也会占用系统资源和不必要的风控额度。
为了提高策略的健壮性,QMT 提供了内置的 ContextInfo.is_suspended_stock() 接口,帮助开发者在下单前进行前置风控,自动过滤停牌股票。
ContextInfo.is_suspended_stock()ContextInfo.is_suspended_stock(stockcode)stockcode (string),必须是带市场后缀的格式,例如 '600004.SH' 或 '000001.SZ'。bool 类型。True 表示停牌,False 表示未停牌(可正常交易)。以下是一个完整的 QMT 策略框架,展示了如何在 handlebar 中动态获取股票池,并在生成交易信号前,通过 is_suspended_stock 自动剔除停牌股票:
#encoding:gbk
def init(ContextInfo):
# 1. 设定初始股票池
ContextInfo.stock_list = ['600000.SH', '600004.SH', '000001.SZ', '000002.SZ']
ContextInfo.set_universe(ContextInfo.stock_list)
# 2. 设定交易账号
ContextInfo.account_id = '6000000248'
ContextInfo.set_account(ContextInfo.account_id)
print("策略初始化完成,股票池:", ContextInfo.stock_list)
def handlebar(ContextInfo):
# 只在最后一根K线(最新Tick驱动)时执行交易逻辑
if not ContextInfo.is_last_bar():
return
active_trade_list = []
# 遍历股票池,进行停牌过滤风控
for stock in ContextInfo.stock_list:
if ContextInfo.is_suspended_stock(stock):
print(f"【风控提示】股票 {stock} 当前处于停牌状态,已自动过滤。")
continue
else:
active_trade_list.append(stock)
# 3. 对未停牌的股票执行策略逻辑与下单
for stock in active_trade_list:
# 假设此处为策略买入信号触发条件(示例为直接买入)
# 使用 passorder 发送买入委托,1101表示单股单账号股数下单,23表示股票买入
print(f"发送下单指令:买入 {stock} 100股")
passorder(23, 1101, ContextInfo.account_id, stock, 5, -1, 100, '停牌过滤策略', 1, ContextInfo)
is_suspended_stock 放在策略买卖信号判断的最前端。一旦检测到停牌,立即跳过该股票的后续指标计算与下单逻辑。ContextInfo.get_universe() 动态更新股票池,剔除长期停牌或退市的标的。quickTrade 参数:在实盘中,passorder 的 quickTrade 参数若设置为 1(立即下单),更需要配合停牌检测,防止盘中突发停牌导致即时拆单算法报错。