执行算法基础:订单类型与撮合机制

做量化交易,第一件事就是搞懂订单。这听起来简单,但说实话,我见过太多人在这里栽跟头。今天咱们就把订单类型、生命周期和交易所撮合机制聊透。

一、订单类型:你的交易指令

订单类型说白了就是告诉交易所「你想怎么买、怎么卖」。主流交易所都支持三种基础类型:市价单、限价单、止损单。

1. 市价单(Market Order)

市价单就是「不管价格多少,立刻成交」。你想想看,这就像在菜市场喊「这筐白菜我全要了」,摊主说多少就是多少。

特点:

  • 成交速度快,几乎瞬间完成
  • 价格不确定,可能滑点严重
  • 适合流动性好的品种

重要:市价单的成交价 = 当前最优对手盘价格。如果市场深度不够,你会吃到多个价位的单子。

我在项目中遇到过一件事。有一次做高频策略,用市价单抢反弹。结果流动性突然枯竭,一个市价单吃掉了三个档位的挂单,滑点直接吃掉了一半利润。嗯,从那以后我对市价单就格外谨慎了。

2. 限价单(Limit Order)

限价单是「我只接受这个价格或更好的价格」。说白了,你给交易所设了个底线。

特点:

  • 价格可控,不会滑点
  • 可能无法成交(价格没到)
  • 适合做挂单策略、做市策略

个人习惯:我一般把限价单挂在买一或卖一的位置。如果行情波动大,会挂到买二或卖二,确保能吃到单子。

限价单有个坑——部分成交。你挂了100手,可能只成交了30手,剩下的70手还在挂着。这时候你的仓位管理就乱了。我曾经因为这个吃过亏,后来在代码里加了「全部成交或取消」的逻辑。

3. 止损单(Stop Order)

止损单是「价格到了某个位置,就触发一个市价单或限价单」。它本质上是一个条件单。

两种常见止损单:

类型 触发后行为 适用场景
止损市价单 触发后变成市价单 快速止损,不怕滑点
止损限价单 触发后变成限价单 控制滑点,但可能不成交

警告:止损单不是万能的。极端行情下,止损单可能触发在远低于你预期的价格。这就是所谓的「止损滑点」。我见过有人设了5%的止损,结果行情暴跌,成交在-15%的位置。

二、订单生命周期:从下单到成交

一个订单从发出到最终状态,会经历几个阶段。理解这个流程,对做执行算法至关重要。

提交订单 进入订单簿 等待撮合 完全成交 取消/过期 通过 排队 匹配成功 未匹配

订单生命周期有几个关键状态:

  1. 已提交(Submitted):订单发到交易所,还没进入订单簿
  2. 已接受(Accepted):交易所验证通过,进入订单簿排队
  3. 部分成交(Partially Filled):只成交了一部分,剩余部分继续挂单
  4. 完全成交(Filled):全部成交,订单结束
  5. 已取消(Cancelled):你主动撤单,或者订单过期
  6. 已拒绝(Rejected):交易所认为订单无效(比如价格超出限制)

避坑指南:我曾经在代码里只处理了「完全成交」和「已取消」两种状态。结果有一次订单部分成交后,程序以为没成交,又发了一个补单。最后仓位翻了一倍。所以,一定要处理「部分成交」状态

三、交易所撮合机制:价格优先、时间优先

交易所怎么决定谁先成交?核心原则就八个字:价格优先,时间优先

价格优先:买单出价高的先成交,卖单出价低的先成交。

时间优先:价格相同的情况下,先挂单的先成交。

举个例子你就明白了:

时间 买单 价格 卖单 时间
10:00:01 A 买100手 100.00 D 卖50手 10:00:04
10:00:02 B 买50手 100.01 E 卖100手 10:00:03
10:00:03 C 买200手 100.00 F 卖80手 10:00:05

这时候来了一个市价卖单,要卖150手。谁先成交?

答案是:B先成交,因为B出价最高(100.01)。然后剩下的100手,按时间顺序给A(100手)和C(50手)。

你看,价格优先排在第一位。时间优先只在价格相同时才起作用。

核心要点:做执行算法时,你要时刻记住这个规则。想快速成交?挂高一点的价格。想省成本?挂低一点的价格,但要做好等一等的准备。

四、订单簿与市场深度

订单簿就是所有挂单的集合。它分为买盘(Bid)和卖盘(Ask)两侧。

一个典型的订单簿长这样:

卖盘(Ask) 价格 买盘(Bid)
200手 @ 100.05 100.05
150手 @ 100.04 100.04
100手 @ 100.03 100.03
100.02 80手 @ 100.02
100.01 120手 @ 100.01
100.00 300手 @ 100.00

买一价是100.02,卖一价是100.03。价差(Spread)是0.01。

市场深度就是每个价位上的挂单量。深度越厚,大单对价格的冲击越小。反之,深度薄的地方,一个市价单就能把价格打穿好几个档位。

注意:订单簿是动态变化的。高频交易者会不断撤单、挂单。你看到的订单簿可能下一秒就变了。所以做执行算法时,不要完全依赖订单簿的快照数据,要结合实时流数据。

五、滑点控制:实战中的核心问题

滑点就是「你期望的价格」和「实际成交价格」之间的差距。说白了,就是市场不配合你。

滑点产生的原因:

  • 市场流动性不足
  • 订单太大,吃穿多个档位
  • 行情波动剧烈,价格瞬间变化
  • 网络延迟,你的订单到达时价格已经变了

我个人的经验是,控制滑点要从三个层面入手:

  1. 订单层面:用限价单代替市价单,或者用冰山订单隐藏真实量
  2. 算法层面:拆单,把大单拆成小单,分批执行
  3. 时机层面:避开流动性差的时段,比如开盘、收盘、午休

一个小技巧:我习惯在策略里加一个「滑点容忍度」参数。比如设置0.1%的容忍度,如果实际滑点超过这个值,就暂停交易,等市场恢复。这个参数帮我在很多次极端行情中保住了本金。

好了,订单类型和撮合机制就聊到这里。这些是执行算法的基础,后面的章节我们会深入拆单算法、TWAP、VWAP这些实战内容。记住一句话:理解订单,才能控制滑点;控制滑点,才能赚钱