3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行实盘或模拟盘量化交易时,如果策略试图对已经停牌的股票下达交易指令,会导致柜台直接拒单(废单)。频繁的废单不仅会占用系统资源,还可能干扰策略的正常运行逻辑。
QMT 平台提供了内置的 ContextInfo.is_suspended_stock() 函数,可以帮助我们在下单前实时检测股票的停牌状态,从而在策略中自动剔除停牌股,做好交易风控。
ContextInfo.is_suspended_stock(stockcode)
'600004.SH' 或 '000002.SZ'。True: 该股票当前处于停牌状态。False: 该股票当前未停牌(可正常交易)。以下是一个完整的 QMT 策略示例。该策略在 init 中设定股票池,并在 handlebar 中循环检测股票池,自动剔除停牌股票,仅对正常交易的股票进行下单操作。
#encoding:gbk
def init(ContextInfo):
# 1. 设定初始股票池
ContextInfo.stock_pool = ['600000.SH', '600004.SH', '000002.SZ', '000001.SZ']
ContextInfo.set_universe(ContextInfo.stock_pool)
# 2. 设定交易账号(请替换为您的真实/模拟账号)
ContextInfo.account_id = '6000000248'
ContextInfo.set_account(ContextInfo.account_id)
print("【初始化】策略启动,初始股票池:", ContextInfo.stock_pool)
def handlebar(ContextInfo):
# 仅在最后一根K线(最新Tick驱动)时执行交易逻辑
if not ContextInfo.is_last_bar():
return
active_stocks = []
suspended_stocks = []
# 循环检测股票池中的停牌状态
for stock in ContextInfo.stock_pool:
if ContextInfo.is_suspended_stock(stock):
suspended_stocks.append(stock)
else:
active_stocks.append(stock)
# 打印风控日志
if suspended_stocks:
print(f"【交易风控】检测到停牌股: {suspended_stocks},已自动拦截并剔除。")
# 仅对未停牌的股票执行交易逻辑
for stock in active_stocks:
print(f"【交易执行】股票 {stock} 状态正常,准备发送买入委托...")
# 示例:以最新价买入 100 股
passorder(23, 1101, ContextInfo.account_id, stock, 5, -1, 100, '风控买入', 1, ContextInfo)
is_suspended_stock 过滤停牌股外,建议在下单前配合 get_trade_detail_data 查询账户可用资金,确保双重保险。get_market_data 或 get_history_data 默认有 skip_paused 参数。如果设为 True,系统会自动用停牌前一天的价格填充停牌日数据,但实盘中必须使用 is_suspended_stock 进行拦截。ContextInfo.get_his_st_data(stockCode) 获取ST历史,进一步完善策略的黑名单机制。