带你详细了解miniQMT的xttrader模块 (第五篇) 用 on_stock_order 进行订单管理,实盘必备技能!

QUANT 2025-12-11 23:24:28 56 举报

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落地辅助策略代写服务

需要的朋友欢迎联系  ~~~



尊重知识,尊重市场 1

著作权归文章作者所有。

最新回复 ( 0 )
发新帖
0
DEPRECATED: addslashes(): Passing null to parameter #1 ($string) of type string is deprecated (/data/user/htdocs/xiunophp/xiunophp.min.php:48)