QMT中的事件驱动编程:订单状态监控与自动撤单重发
发布时间:2026-5-18 15:33阅读:78

在量化交易中,订单可能会因为价格波动而未能成交。QMT提供事件驱动接口,可以监控订单状态,实现自动撤单重发,提高成交率。本文介绍如何利用on_order_status和on_order_trade回调构建智能订单管理模块。
首先,了解QMT的订单状态回调。on_order_status在订单状态发生变化时调用,状态包括:ORDER_STATUS_SUBMITTED(已提交)、ORDER_STATUS_FILLED(全部成交)、ORDER_STATUS_PARTIAL_FILLED(部分成交)、ORDER_STATUS_CANCELLED(已撤)、ORDER_STATUS_REJECTED(被拒)。on_order_trade在每笔成交(含部分成交)时调用。
实现自动撤单重发的逻辑:
1. 在下单时,将订单信息存入一个字典context.pending_orders,包含股票代码、方向、目标数量、下单时间等。
2. 在on_order_status中,如果订单状态为PARTIAL_FILLED或SUBMITTED,设置一个定时器(例如10秒后检查)。如果超时仍未成交,则调用cancel_order(order.order_id)撤单。
3. 撤单成功后,根据剩余未成交数量,重新以新的价格(如当前对手价)下单。注意防止无限循环,设置最多重试次数(如3次)。
代码框架示例:
`python
def init(context):
context.pending_orders = {}
context.retry_count = {}
def order_with_retry(context, stock, amount, price=None):
order_id = order(stock, amount, limit_price=price)
context.pending_orders[order_id] = {'stock': stock, 'amount': amount, 'time': context.now}
def on_order_status(context, order):
if order.order_id in context.pending_orders:
if order.status in [ORDER_STATUS_FILLED, ORDER_STATUS_CANCELLED, ORDER_STATUS_REJECTED]:
del context.pending_orders[order.order_id]
elif order.status == ORDER_STATUS_PARTIAL_FILLED:
设置超时撤单
pass # 具体实现使用 run_delay
def on_order_trade(context, trade):
pass # 记录成交细节
`
注意,频繁撤单可能被券商风控限制,不要设置过短的超时(建议10秒以上)。另外,重新下单的价格需要合理调整,可参考当前买一/卖一价。
事件驱动订单管理适合流动性较差的标的或大额订单。对于流动性好的ETF,通常不需要这么复杂。QMT的算法交易模块已经封装了类似功能,可以直接使用。
国金证券的QMT支持完整的事件回调,10万资金即可开通。量化社群中有现成的撤单重发模块代码,可参考。同时,两融全线上办理,信用账户的订单状态管理同样重要。掌握事件驱动编程,可以让你的量化策略在执行层面更加专业、稳健。
温馨提示:投资有风险,选择需谨慎。
-
本周打新日历:一只新股+两只可转债即将发行!点击查看可转债权限开通+申购指南
2026-06-01 14:07
-
华泰证券银证转账是什么时候?支持哪些银行?怎么操作?
2026-06-01 14:07
-
国泰海通证券新人开户有哪些超值福利?怎么高效领取?(含新客理财券)
2026-06-01 14:07


问一问

+微信
分享该文章
