3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,默认情况下策略是不接收撤单委托产生的主推数据的。如果您希望在策略中实时捕获撤单成功的事件,需要通过 set_parameters 接口进行显式配置,并配合 on_order_response(委托主推)回调函数来实现。
在 initialize 中开启撤单主推接收:
调用 set_parameters(receive_cancel_response="1")。其中 "1" 表示接收,"0" 表示不接收(缺省值)。
实现 on_order_response 回调函数:
当撤单委托状态发生变化时,系统会触发该函数。您可以通过判断委托单的 status(状态)和 entrust_type(委托类别)来捕获撤单成功事件。
entrust_type(委托类别):"2" 代表撤单。status(委托状态):"6" 代表已撤,"5" 代表部撤。以下是一个完整的 ptrade 策略示例,展示了如何配置并实时监控撤单事件:
def initialize(context):
# 1. 设置操作的股票池
g.security = '600570.SS'
set_universe(g.security)
# 2. 配置策略参数:开启接收撤单委托产生的主推
# receive_cancel_response="1" 开启撤单主推
# receive_other_response="1" 可选:若需要接收非本策略产生的柜台撤单主推可一同开启
set_parameters(receive_cancel_response="1")
g.order_id = None
g.cancel_triggered = False
def handle_data(context, data):
# 模拟下单与撤单流程
if g.order_id is None:
# 以较低价格下一个限价单(不易成交,方便测试撤单)
g.order_id = order(g.security, 100, limit_price=30.0)
log.info(f"已报单,订单ID: {g.order_id}")
elif g.order_id and not g.cancel_triggered:
# 触发撤单
cancel_order(g.order_id)
log.info(f"已触发撤单申请,目标订单ID: {g.order_id}")
g.cancel_triggered = True
def on_order_response(context, order_list):
"""
委托主推回调函数
"""
for ord in order_list:
stock_code = ord.get('stock_code')
entrust_no = ord.get('entrust_no')
status = ord.get('status')
entrust_type = ord.get('entrust_type')
order_id = ord.get('order_id')
# 打印接收到的主推详情
log.info(f"收到委托主推 -> 代码: {stock_code}, 委托编号: {entrust_no}, 状态: {status}, 类别: {entrust_type}, 订单ID: {order_id}")
# 判断是否为撤单委托 (entrust_type == '2') 且状态为已撤 (status == '6') 或部撤 (status == '5')
if entrust_type == "2":
if status == "6":
log.info(f"【撤单成功】股票 {stock_code} 的撤单委托已完全撤销!委托编号: {entrust_no}")
elif status == "5":
log.info(f"【部分撤单】股票 {stock_code} 的撤单委托部分撤销!委托编号: {entrust_no}")
initialize 会重新执行。建议配合 set_parameters(not_restart_trade="1") 避免交易时间内重复拉起导致逻辑混乱。status 会推 "9"(废单),可在回调中针对性处理。