3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,当您的下单价格超过了交易所的“价格笼子”限制时,柜台会拒绝该笔委托。此时,order() 函数依然会正常返回 order_id,但该订单在柜台的最终状态会变为废单。
为了实时、快速地捕获并处理这种“废单”情况,推荐使用 on_order_response(委托主推) 事件。该事件比主动轮询 get_order() 更新速度更快,非常适合高频或对风控要求较高的策略。
on_order_response 接收到的主推字典中,当 status 字段的值为 '9' 时,即代表该笔委托为废单。error_info 字段通常会包含柜台返回的具体拒绝原因(例如:超出价格笼子限制)。以下策略展示了如何在 initialize 中订阅股票,在 handle_data 中模拟下单,并在 on_order_response 回调中精准捕获状态为 '9' 的废单,并打印出具体的错误信息:
def initialize(context):
# 设置操作的股票池
g.security = '600570.SS' # 恒生电子
set_universe(g.security)
# 设置策略参数:接收撤单委托产生的主推
set_parameters(receive_cancel_response="1")
g.has_ordered = False
def handle_data(context, data):
# 仅下单一次作为演示
if not g.has_ordered:
# 故意报一个极不合理的价格(例如 1 元,触发价格笼子限制或废单条件)
# 注意:实际交易中请根据 check_limit 或当前最新价合理控制 limit_price 精度
order_id = order(g.security, 100, limit_price=1.0)
if order_id:
log.info(f"已提交委托,订单ID: {order_id},等待柜台反馈...")
g.has_ordered = True
def on_order_response(context, order_list):
"""
委托主推回调函数,当委托单状态发生变化时触发
"""
for ord in order_list:
stock_code = ord.get('stock_code')
status = ord.get('status')
error_info = ord.get('error_info')
order_id = ord.get('order_id')
price = ord.get('price')
amount = ord.get('amount')
# 识别状态 9:废单
if status == '9':
log.error(f"【风控警报】检测到废单!")
log.error(f"标的代码: {stock_code} | 委托数量: {amount} | 委托价格: {price}")
log.error(f"订单ID: {order_id} | 柜台错误信息: {error_info}")
# 在此处编写您的风控补救逻辑,例如:
# 1. 重新获取当前最新价(get_snapshot)
# 2. 重新计算符合价格笼子限制的价格,重新追单
# 3. 发送警报邮件/微信通知
elif status == '8':
log.info(f"订单 {order_id} 已全部成交。")
else:
log.info(f"订单 {order_id} 状态更新,当前状态: {status}")
limit_price)时,务必对价格进行四舍五入处理,否则可能直接导致委托失败。on_order_response 回调函数中编写了“失败后自动重新下单”的逻辑,请务必做好计数器或状态标记限制,避免因为持续报出废单而陷入“报单 -> 废单 -> 重新报单 -> 再次废单”的无限死循环,导致账户被券商风控暂停交易。