on_stock_order 是最重要的回调函数之一
它会返回一个订单从发出到结束的全过程;理解 order.order_status 的变化,是我们进行精确策略控制的基础
一般来说一个订单的状态通常会遵循以下路径:
ORDER_UNREPORTED (未报) ---> ORDER_WAIT_REPORTING (待报) ---> ORDER_REPORTED (已报) -> ......
• 从“已报”开始分类讨论:
• 如果完全成交 ---> ORDER_SUCCEEDED (已成)
• 如果部分成交 ---> ORDER_PART_SUCC (部成) ---> 后续可能继续成交变为 ORDER_SUCCEEDED
或被撤销变为 ORDER_CANCELED
• 如果被撤销 ---> ORDER_CANCELED (已撤)
• 如果交易所拒绝 ---> ORDER_REJECTED (废单)
构建自己的订单状态
在策略里,我们不能简单地认为“下单成功就等于买入了”。
所以在实盘中我们需要构建一个“订单管理器”来跟踪每个 order_id 的实时状态
from xtquant import xtconstant
from xtquant.xttrader import XtQuantTraderCallback
import logging
# 正确的状态码定义(根据MINIQMT实际状态码)
ORDER_UNREPORTED = 48 # 未报
ORDER_WAIT_REPORTING = 49 # 待报
ORDER_REPORTED = 50 # 已报
ORDER_PART_SUCC = 51 # 部分成交
ORDER_SUCCEEDED = 52 # 完全成交
ORDER_CANCELED = 53 # 已撤销
ORDER_REJECTED = 54 # 废单
class OrderManager:
def __init__(self):
# { order_id: order_object }
self.active_orders = {}
def on_order(self, order):
"""由 on_stock_order 回调调用"""
order_id = order.order_id
status = order.order_status
logging.info(f"订单状态更新: {order_id}, 状态: {status}, 已成交: {order.traded_volume}/{order.order_volume}")
# 终结状态:完全成交、已撤销、废单
if status in [ORDER_SUCCEEDED, ORDER_CANCELED, ORDER_REJECTED]:
if order_id in self.active_orders:
logging.info(f"订单 {order_id} 进入终结状态: {status}")
del self.active_orders[order_id]
return
# 部分成交状态:更新但不移除(可能继续成交)
if status == ORDER_PART_SUCC:
self.active_orders[order_id] = order
return
# 活动状态:未报、待报、已报
if status in [ORDER_UNREPORTED, ORDER_WAIT_REPORTING, ORDER_REPORTED]:
self.active_orders[order_id] = order
return
def get_pending_buy_volume(self, stock_code):
"""计算某只股票在途的买入委托数量"""
pending_volume = 0
for order in self.active_orders.values():
if (order.stock_code == stock_code and
order.order_type == xtconstant.STOCK_BUY and
order.order_status not in [ORDER_SUCCEEDED, ORDER_CANCELED, ORDER_REJECTED]):
pending_volume += (order.order_volume - order.traded_volume)
return pending_volume
def get_pending_sell_volume(self, stock_code):
"""计算某只股票在途的卖出委托数量"""
pending_volume = 0
for order in self.active_orders.values():
if (order.stock_code == stock_code and
order.order_type == xtconstant.STOCK_SELL and
order.order_status not in [ORDER_SUCCEEDED, ORDER_CANCELED, ORDER_REJECTED]):
pending_volume += (order.order_volume - order.traded_volume)
return pending_volume
# 集成到回调类
class MyCallback(XtQuantTraderCallback):
def __init__(self):
super().__init__()
self.order_manager = OrderManager()
def on_stock_order(self, order):
"""委托信息回调"""
self.order_manager.on_order(order)
def on_stock_trade(self, trade):
"""成交信息回调"""
# 可在此处理成交细节
pass使用示例:
........
........
# 初始化
callback = MyCallback()
xt_trader.register_callback(callback)
# 下单前检查在途委托
stock_code = "600000.SH"
pending_buy = callback.order_manager.get_pending_buy_volume(stock_code)
pending_sell = callback.order_manager.get_pending_sell_volume(stock_code)
print(f"股票 {stock_code} 在途买入: {pending_buy}股, 在途卖出: {pending_sell}股")
# 根据在途委托量调整下单数量
if pending_buy == 0:
# 执行买入操作
order_id = xt_trader.order_stock(account, stock_code, xtconstant.STOCK_BUY, 100, xtconstant.LATEST_PRICE, 0)通过这样的订单管理器,我们可以在执行下单操作前,主动查询某只股票的在途买入委托量(get_pending_buy_volume)
这一机制能有效避免因重复提交买单而导致总体仓位超出预期,从而实现对仓位的精细化控制和风险规避
QMT/miniQMT免费申请
QMT免费领取学习案例
QMT落地辅助策略代写服务
需要的朋友欢迎联系 ~~~
著作权归文章作者所有。