第二章:撮合引擎原理

大家好,我是老张。今天我们来聊聊撮合引擎——这个订单驱动市场里最核心的「心脏」。说实话,我做了这么多年量化,见过太多人把策略写得花里胡哨,结果连撮合逻辑都没搞明白。嗯,今天咱们就把这块硬骨头啃下来。

一、价格优先:谁出价好谁先成交

价格优先原则,说白了就是四个字:价高者得

买盘这边,谁出的买入价高,谁就排在前面。卖盘那边,谁出的卖出价低,谁就排在前面。这个逻辑其实跟拍卖行差不多——你出价高,好东西自然先给你。

举个例子:

买盘队列(价格从高到低):
  100.50  100手
  100.30  200手
  100.10  150手

卖盘队列(价格从低到高):
  100.20  180手
  100.40  300手
  100.60  250手

这时候,买一价100.50和卖一价100.20之间有个「价差」。如果新进来一个买单,出价100.40,那它就会排在买二的位置,因为100.40比100.30高,但比100.50低。

关键点:价格优先是绝对的。哪怕你只比别人高0.01元,你的单子也会排在他前面。我见过有人为了抢成交,故意把价格提高0.01,结果确实抢到了——但多付了钱,值不值就看你自己了。

二、时间优先:同价就看谁手快

价格相同怎么办?那就看谁先到。这就是时间优先原则。

你想想看,如果两个买单都是100.30,那先挂单的人先成交。这个逻辑很公平——先来后到,天经地义。

但这里有个坑:时间戳的精度问题。我记得有一次做回测,发现同样的价格,我的单子总是排在后边。后来一查,原来是系统时间戳只精确到毫秒,而对手方用的是微秒级。嗯,细节决定成败。

避坑指南:我曾经在对接某交易所时,发现他们的时间戳用的是服务器时间,不是网络时间。结果我的单子因为网络延迟,明明先发出去,却后到达。后来我加了个本地时间戳缓存,才解决了这个问题。

三、逐笔撮合逻辑:一口一口吃掉对手盘

逐笔撮合,就是每次只处理一个订单,然后看能不能成交。能成交就成交,不能成交就挂单。

流程大概是这样的:

  1. 新订单进来,先看价格能不能匹配到对手盘
  2. 如果能匹配,按价格优先+时间优先的顺序,从对手盘队列里取单子
  3. 成交后,如果新订单还有剩余数量,继续匹配下一个对手单
  4. 直到新订单全部成交,或者没有可匹配的对手盘为止
  5. 剩余部分挂到订单簿上

我画了个流程图,方便大家理解:

逐笔撮合流程图 新订单到达 能否匹配对手盘? 挂单到订单簿 执行成交 订单是否完全成交? 结束

这个流程看起来简单,但实际实现时有很多细节。比如,成交价格怎么定?是按对手盘的价格,还是按新订单的价格?不同交易所规则不一样。A股是按对手盘价格,而有些期货交易所是按新订单价格。

四、冰山订单处理:大单的隐身术

冰山订单,顾名思义,就是只露出「冰山一角」。一个大单子,只显示一小部分在订单簿上,剩下的藏在下面。

为什么要这么做?说白了,就是不想让别人知道你的真实意图。如果你挂一个100万手的卖单,别人一看就知道你要砸盘,肯定会提前跑路。但如果你只显示1万手,别人就觉得这只是个小单子。

冰山订单的处理逻辑是这样的:

冰山订单参数:
  总数量:100,000 手
  显示数量:10,000 手
  价格:100.50

订单簿显示:
  卖一:100.50  10,000手(冰山订单的露出部分)

当这10,000手被吃掉后,系统自动再露出10,000手
直到100,000手全部成交完毕

注意:冰山订单的露出部分被吃掉后,系统会立即补充新的露出部分。这个「补充」动作会触发一次订单簿更新。如果你在做高频策略,这个更新可能会影响你的判断。

我记得有一次,我在做回测时发现某个股票总是出现「神秘买盘」——每次卖单被吃掉,马上又有新的卖单出现,价格还不变。后来一查,原来是个冰山订单。嗯,从那以后,我写策略时都会加一个「冰山检测」模块。

五、实战中的坑与经验

说了这么多理论,咱们聊聊实战中容易踩的坑。

坑点 现象 解决方案
时间戳精度不足 同价订单排错顺序 使用微秒级时间戳,或加序列号
冰山订单误判 以为是小单,实际是大单 监控同一价格的连续成交
逐笔撮合延迟 回测结果与实盘不符 模拟网络延迟和撮合队列
价格优先理解偏差 以为价格相同看手数 记住:同价只看时间

我个人习惯在写撮合引擎时,先把这些边界条件列出来,然后一个一个测试。比如:

  • 两个同价订单同时到达怎么办?
  • 冰山订单的露出部分被部分成交怎么办?
  • 订单簿为空时新订单怎么处理?

把这些想清楚了,代码写起来就顺了。

一个小技巧:我曾经在实现撮合引擎时,用了一个「双端队列」来管理订单簿。买单用最大堆,卖单用最小堆,这样每次取对手盘都是O(1)的时间复杂度。嗯,性能杠杠的。

好了,今天的内容就到这里。撮合引擎的原理其实不复杂,但细节很多。记住一句话:价格优先是王道,时间优先是公平,冰山订单是策略。把这些搞明白了,你的交易系统就成功了一半。


公众号:蓝海资料掘金营,微信deep3321