订单管理:订单类型、生命周期与状态机

做市系统的核心,说白了就是管好每一笔订单。我做了这么多年交易系统,见过太多因为订单管理混乱导致的惨案——资金损失、交易所封号,甚至整个策略崩盘。今天咱们就把订单管理这块彻底讲透。

一、订单类型:三种基础武器

做市交易中,我们主要跟三种订单打交道。每种都有它的脾气,用错了会出大问题。

1. 限价单(Limit Order)

限价单是我个人最常用的订单类型。你指定一个价格,只有市场达到这个价格时才会成交。说白了,就是「不到这个价我不卖」。

核心特点:

  • 保证成交价格,不保证成交时间
  • 做市策略的基石,用来提供流动性
  • 可能部分成交,也可能完全不成交

我在项目中遇到过一个问题:限价单挂在盘口,结果市场剧烈波动,价格直接跳过你的挂单价。这时候订单就「飘」在那里了。嗯,这就是所谓的「滑点风险」。

2. 市价单(Market Order)

市价单就是「不管什么价格,立刻给我成交」。它保证成交时间,但不保证成交价格。

避坑指南:

我曾经在流动性差的币对上用过市价单,结果成交价格比预期差了2%。那笔交易直接亏掉了当天的利润。记住:市价单只适合高流动性市场。

3. 止损单(Stop Order)

止损单是个有意思的东西。它平时不干活,一旦价格触及止损价,就变成市价单或限价单去执行。

你想想看,为什么需要止损单?因为人盯盘总有疏忽的时候。我习惯在策略启动时就把止损单挂好,这样即使网络断了,系统也能自动保护自己。

订单类型 价格保证 时间保证 典型用途
限价单 做市挂单、套利
市价单 紧急平仓、大单拆小
止损单 部分保证 触发后保证 风险控制、趋势跟踪

二、订单生命周期:从生到死

一笔订单从创建到最终消失,经历的过程就是生命周期。我把它分成四个阶段:

  1. 创建阶段:系统生成订单,校验参数
  2. 存活阶段:订单在订单簿上等待成交
  3. 成交阶段:部分或全部成交
  4. 终结阶段:完全成交、被撤销或过期

这里有个细节很多人会忽略:订单的生命周期不是线性的。比如一个限价单可能先部分成交,然后你撤单,剩下的部分就终结了。我见过新手写的代码,以为订单要么全成交要么全撤,结果状态机跑飞了。

三、订单状态机:核心逻辑

状态机是订单管理的灵魂。我画了一张图,你看完就明白了:

已创建 已提交 部分成交 完全成交 已撤销 已过期 提交 部分成交 继续成交 撤单 撤单 过期

这张图展示的是标准的状态流转。实际项目中,我还会加一些中间状态,比如「等待确认」、「重试中」。为什么?因为网络延迟会导致状态不同步,你发了个撤单指令,交易所还没处理完,这时候订单就处于一个「薛定谔的状态」。

四、撤单逻辑:细节决定成败

撤单看起来简单,发个指令就行。但实际坑很多:

我的经验:

撤单要分两步走:先发撤单请求,再确认撤单结果。我曾经只发了请求就不管了,结果交易所那边没处理成功,订单还在挂着。后来市场反转,那个订单被成交了,亏了不少。

正确的撤单逻辑应该是:

def cancel_order(order_id):
    # 第一步:发送撤单请求
    send_cancel_request(order_id)
    
    # 第二步:等待确认(带超时)
    result = wait_for_cancel_confirm(order_id, timeout=5)
    
    if result == 'confirmed':
        # 更新本地状态
        update_order_status(order_id, 'CANCELLED')
    elif result == 'timeout':
        # 查询实际状态
        actual_status = query_order_status(order_id)
        if actual_status == 'FILLED':
            # 订单已被成交,处理成交逻辑
            handle_fill(order_id)
        else:
            # 重试撤单
            retry_cancel(order_id)

你想想看,如果撤单超时了怎么办?直接认为撤单成功?那万一订单其实成交了呢?所以一定要查一下实际状态。这个逻辑我称之为「撤单三明治」——先发请求,再确认,最后兜底。

五、实战中的状态管理

做市系统里,订单状态管理有几个关键点:

  • 本地状态 vs 交易所状态:永远以交易所状态为准。我见过有人本地状态和交易所不一致,结果重复下单,被交易所警告了。
  • 状态同步频率:我建议每100ms同步一次活跃订单的状态。太频繁浪费资源,太慢容易错过机会。
  • 异常状态处理:比如订单「消失」了——既没成交也没撤单。这种情况通常是交易所内部错误,需要人工介入。

重要提醒:

不要相信任何「看起来没问题」的订单。我有个血的教训:一个订单显示「已提交」,但实际交易所那边已经宕机了。等恢复后,那个订单被以极差的价格成交了。从那以后,我所有订单都加了健康检查机制。

好了,订单管理这块就讲到这里。记住:订单是策略和市场的桥梁,管好订单,你的做市系统就成功了一半。

无相订单流研究社 微信Lucian808555