3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 A 股实盘交易中,由于价格笼子限制以及涨跌停板机制的存在,如果策略盲目按照计算出的理论价或最新价报单,极易产生废单(无效委托)。这不仅会占用系统资源,还可能导致策略逻辑中断。
ptrade 提供了专为交易模块设计的 check_limit 接口,能够实时返回股票的涨跌停状态。本文将详细介绍该接口的使用方法并提供实盘避坑代码。
check_limit 接口详解check_limit(security)
security 可以是单只股票代码(如 '600570.SS')或多只股票代码组成的列表(list[str])。dict[str:int]),Key 为股票代码,Value 为涨跌停状态码。| 状态码 | 含义 | 说明 |
|---|---|---|
| 2 | 触板涨停 | 已经是涨停价格,但盘口还有卖盘 |
| 1 | 涨停 | 封死涨停 |
| 0 | 正常状态 | 既不涨停也不跌停 |
| -1 | 跌停 | 封死跌停 |
| -2 | 触板跌停 | 已经是跌停价格,但盘口还有买盘 |
以下示例展示了如何在盘中 handle_data 事件中,通过 check_limit 过滤掉已经涨停(无法买入)或跌停(无法卖出)的标的,从而规避无效报单。
def initialize(context):
# 初始化股票池
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 1. 确保仅在实盘/模拟盘交易环境中执行此逻辑(回测环境不支持 check_limit)
if not is_trade():
# 回测环境下的模拟下单
for stock in g.security:
order(stock, 100)
return
# 2. 获取股票池中所有股票的涨跌停状态
try:
limit_status = check_limit(g.security)
except Exception as e:
log.error(f"获取涨跌停状态失败: {e}")
return
for stock in g.security:
# 获取当前标的状态,若查询异常默认返回 0(正常)
status = limit_status.get(stock, 0)
# 3. 根据状态进行精细化报单控制
if status in [1, 2]:
log.warning(f"{stock} 当前处于涨停或触板涨停状态(状态码:{status}),放弃买入委托以防废单。")
# 如果持有该股,涨停时可以考虑卖出,但不能买入
continue
elif status in [-1, -2]:
log.warning(f"{stock} 当前处于跌停或触板跌停状态(状态码:{status}),放弃卖出委托。")
continue
else:
# 4. 正常状态,执行策略买卖逻辑
log.info(f"{stock} 状态正常,准备发送委托。")
order(stock, 100)
check_limit 接口在回测环境下调用会报错。因此在编写通用策略时,务必使用 is_trade() 函数进行场景判断,如上方源码所示。order() 函数依然会返回 order_id(而非 None)。但在委托回调 on_order_response 中其状态 status 最终会变为 '9'(废单)。配合 check_limit 提前预防是最佳实践。check_limit 会将异常代码的状态默认返回为 0(既不涨停也不跌停)。