3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行量化交易时,停牌股是策略下单时最常见的“地雷”之一。如果策略未对停牌股进行过滤,直接调用 passorder 或 order_shares 等交易函数发送委托,会导致柜台直接拒单报错,不仅浪费系统资源,还可能影响策略的正常运行逻辑。
QMT 平台提供了便捷的内置 API ContextInfo.is_suspended_stock(),帮助开发者在盘中实时或回测中自动剔除停牌股票。
ContextInfo.is_suspended_stock()ContextInfo.is_suspended_stock(stockcode)stockcode (string),必须是带市场后缀的完整代码,例如 '600004.SH' 或 '000002.SZ'。bool 类型。
True:该股票当前处于停牌状态。False:该股票当前未停牌,可正常交易。以下是一个完整的 QMT Python 策略示例。该策略在初始化时设定了一个股票池,并在每个 handlebar 周期内,自动过滤掉停牌的股票,只对正常交易的股票进行下单操作。
#encoding:gbk
def init(ContextInfo):
# 1. 设定初始股票池
ContextInfo.stock_list = ['600000.SH', '600004.SH', '000002.SZ', '000001.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 线(最新行情)执行交易逻辑
if not ContextInfo.is_last_bar():
return
active_stocks = []
# 遍历股票池,利用 is_suspended_stock 过滤停牌股
for stock in ContextInfo.stock_list:
if ContextInfo.is_suspended_stock(stock):
print(f"【风控提示】股票 {stock} 当前处于停牌状态,已自动过滤。")
else:
active_stocks.append(stock)
print("当前可交易的活跃股票池:", active_stocks)
# 针对未停牌的股票执行下单逻辑
for stock in active_stocks:
# 示例:使用指定股数交易函数买入 100 股
# 实际策略中可在此处加入您的买入/卖出信号判断
print(f"发送委托:买入未停牌股 {stock} 100股")
order_shares(stock, 100, 'LATEST', ContextInfo, ContextInfo.account_id)
init 中过滤一次股票池。因为股票可能在交易日中途临时停牌,或者在回测的某一天突然停牌。务必在 handlebar 中,在每次准备发送交易指令(如 passorder)前,实时调用 is_suspended_stock 进行安全检查。get_market_data 的 skip_paused 参数:在获取历史行情数据时,get_market_data 接口的 skip_paused 参数若设为 True,会自动用停牌前一天的价格填充停牌日数据。这虽然方便了指标计算,但容易让人误以为该股当天可交易。因此,计算指标和判断下单状态要分清,下单前必须用 is_suspended_stock 再次确认。is_suspended_stock 同时支持回测和实盘模式。在回测历史数据时,请确保您已通过 QMT 客户端的“数据管理”功能完整下载了对应品种的历史日线和停牌数据,否则可能导致回测中的停牌判断不准确。