VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 7
声望: 0

需求:
如果策略多,短时间可能有频繁的下单与撤单;
如果通过EVENT去写,大概就是围绕着一笔订单处理直到下成功
还是通过其他线程管理,均先下单,未成交撤单成功逻辑单独管理

Super Moderator
avatar
加入于:
帖子: 95
声望: 9

在 VeighNa 框架中,针对 高频策略的频繁下单/撤单需求,推荐采用 事件驱动 + 订单状态跟踪 的方案,而非多线程管理。以下是具体实现逻辑和原因:


1. 事件驱动方案(推荐)

核心逻辑

  • 下单后监听订单状态
    通过 buy()/sell() 下单后,订单状态变化会触发 on_order 回调。在回调中判断订单是否未成交,若超时则撤单并重新下单。
  • 示例代码

    class HighFreqStrategy:
        def __init__(self):
            self.active_orders = {}  # 存储活跃订单 {vt_orderid: {"price": x, "volume": y}}
    
        def on_tick(self, tick: TickData):
            # 根据Tick生成新订单
            if self.can_send_order():
                price = self.calculate_price(tick)
                volume = self.calculate_volume(tick)
                vt_orderids = self.buy(price, volume)
                for vt_orderid in vt_orderids:
                    self.active_orders[vt_orderid] = {"price": price, "volume": volume}
    
        def on_order(self, order: OrderData):
            # 订单状态更新回调
            if order.vt_orderid in self.active_orders:
                if order.status == Status.CANCELLED:
                    # 撤单后重新下单
                    self.re_submit_order(order)
                elif order.status == Status.NOTTRADED:
                    # 未成交则撤单
                    self.cancel_order(order.vt_orderid)
    

优势

  • 与框架深度集成
    VeighNa 的事件引擎(EventEngine)天然支持事件驱动,无需额外线程管理。
  • 避免线程安全问题
    单线程事件循环避免了多线程的锁竞争和数据同步问题。
  • 实时响应订单状态
    订单状态变化立即触发逻辑,适合高频场景。

2. 多线程方案(不推荐)

潜在问题

  • 线程安全风险
    VeighNa 的核心模块(如 MainEngine)非线程安全,跨线程操作需加锁,复杂度高。
  • 事件引擎冲突
    VeighNa 的事件循环基于 asyncio,多线程可能干扰事件分发。
  • 性能瓶颈
    Python 的 GIL(全局解释器锁)会限制多线程并发性能,尤其在 CPU 密集型任务中。

适用场景

仅在以下极端情况下考虑:

  • 需要 完全独立的订单管理线程(如自定义高频做市逻辑)。
  • 需要 绕过 VeighNa 的事件引擎,直接对接底层 API(如 IB 的异步回调)。

3. 优化高频下单/撤单的技巧

(1) 批量管理订单

  • 场景:同时管理多个合约的订单。
  • 实现
    def cancel_all_pending_orders(self):
        """批量撤单"""
        for vt_orderid in list(self.active_orders.keys()):
            if self.get_order(vt_orderid).status == Status.NOTTRADED:
                self.cancel_order(vt_orderid)
    

(2) 超时撤单机制

  • 场景:订单未成交超过指定时间(如 500ms)。
  • 实现

    import time
    
    class HighFreqStrategy:
        def __init__(self):
            self.order_timestamps = {}  # {vt_orderid: timestamp}
    
        def on_order(self, order: OrderData):
            if order.is_active():
                self.order_timestamps[order.vt_orderid] = time.time()
            else:
                self.order_timestamps.pop(order.vt_orderid, None)
    
        def check_timeout_orders(self):
            """定时检查超时订单"""
            current_time = time.time()
            for vt_orderid, timestamp in list(self.order_timestamps.items()):
                if current_time - timestamp > 0.5:  # 超时 500ms
                    self.cancel_order(vt_orderid)
    

(3) 订单去重与合并

  • 场景:避免重复下单相同价格/方向。
  • 实现
    def can_send_order(self, new_price, new_volume):
        """检查是否已有相同价格的活跃订单"""
        for vt_orderid, order_info in self.active_orders.items():
            if abs(order_info["price"] - new_price) < self.pricetick:
                return False
        return True
    

4. 总结

方案 适用场景 优势 劣势
事件驱动 + 状态跟踪 高频策略、多合约管理 与框架集成、线程安全、实时响应 需精细管理订单状态
多线程管理 极端高频场景(如做市商) 独立控制订单流 线程安全风险、性能瓶颈

推荐做法
on_order 中监听订单状态,结合 active_orders 字典跟踪活跃订单,通过定时任务或 Tick 触发撤单逻辑。此方案既能满足高频需求,又符合 VeighNa 的设计哲学。

Member
avatar
加入于:
帖子: 7
声望: 0

如果下单品种多,而且笔数多,需要考虑部分成交,部分撤单;不通过单独管理开一个线程管理订单是否成交是不是会延误运行速度

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】