1. 撮合引擎的基石:什么是连续竞价?
大家好,我是你们的老朋友。今天咱们聊聊撮合引擎最核心的东西——连续竞价。
说实话,我做了十几年交易系统,见过太多人把「连续竞价」和「集合竞价」搞混。甚至有些刚入行的开发,上来就问:「为什么不能一直用集合竞价?多简单啊。」嗯,这个问题问得好,但答案没那么简单。
1.1 什么是连续竞价?
连续竞价,说白了就是「随时买、随时卖」。你挂单,我成交,只要价格匹配,瞬间完成。
举个例子:
- 你挂了一个买入单,价格10元,数量100股
- 我挂了一个卖出单,价格10元,数量100股
- 系统一检测到,啪,成交!
整个过程不需要等待,不需要排队。这就是连续竞价的核心——实时撮合。
核心特征:
- 订单到达即处理,没有等待期
- 价格优先、时间优先
- 买卖双方直接匹配
1.2 连续竞价 vs 集合竞价:核心区别在哪?
我习惯用一个比喻来解释:
- 连续竞价 = 菜市场,随时有人喊价,随时成交
- 集合竞价 = 拍卖会,大家先出价,最后统一成交
你看,区别很明显吧?
| 维度 | 连续竞价 | 集合竞价 |
|---|---|---|
| 成交时机 | 订单到达即撮合 | 固定时间点统一撮合 |
| 价格发现 | 动态、连续 | 集中、一次性 |
| 流动性 | 高,随时可交易 | 低,需等待 |
| 适用场景 | 日常交易时段 | 开盘、收盘、临时停牌 |
我记得有一次,一个朋友问我:「为什么不能全天都用集合竞价?」我反问他:「你愿意每次买卖股票都等5分钟吗?」他想了想,笑了。
避坑指南:我曾经在开发一个期货撮合引擎时,把集合竞价的逻辑套用在连续竞价上。结果呢?订单堆积如山,成交延迟好几秒。后来我花了整整一周重构代码。教训就是:两种模式的数据结构完全不同,千万别混用。
1.3 为什么A股、期货、数字货币都用它?
你想想看,这三个市场有什么共同点?
- 交易量大:每秒成千上万笔订单
- 流动性要求高:投资者希望随时进出
- 价格波动快:信息瞬息万变
连续竞价恰好能满足这些需求。说白了,它就是为高频、高流动性的市场量身定做的。
具体来说:
- A股:每天4小时交易,连续竞价保证价格实时反映市场情绪
- 期货:杠杆交易,价格波动剧烈,需要即时成交来控制风险
- 数字货币:7×24小时交易,没有连续竞价根本玩不转
注意:虽然都用连续竞价,但细节差异很大。比如A股有涨跌停限制,期货有保证金制度,数字货币没有熔断机制。这些都会影响撮合逻辑的实现。
1.4 核心逻辑:价格优先、时间优先
连续竞价的灵魂就八个字:价格优先、时间优先。
什么意思?
- 价格优先:买单出价高的先成交,卖单出价低的先成交
- 时间优先:相同价格下,先挂单的先成交
我举个例子:
- 买家A:10元买100股,9:30:01挂单
- 买家B:10元买100股,9:30:02挂单
- 卖家C:10元卖100股,9:30:03挂单
成交结果:A和C成交。因为A先挂单,时间优先。
但如果买家B出价10.01元呢?那B先成交,因为价格优先。
核心公式:
if 买单价格 >= 卖单价格:
成交
else:
等待匹配
嗯,就是这么简单。但实现起来,细节多得很。
1.5 数据结构:订单簿
连续竞价的核心数据结构是订单簿(Order Book)。它维护了两个队列:
- 买单队列:按价格从高到低排序,相同价格按时间排序
- 卖单队列:按价格从低到高排序,相同价格按时间排序
我习惯用红黑树来实现订单簿。为什么?因为插入、删除、查找都是O(log n)复杂度,性能杠杠的。
个人经验:我在做数字货币撮合引擎时,一开始用了简单的数组+链表。结果订单一多,性能直接崩了。后来换成红黑树,吞吐量提升了10倍。所以,数据结构选对了,事半功倍。
1.6 连续竞价的优缺点
任何东西都有两面性。连续竞价也不例外。
| 优点 | 缺点 |
|---|---|
| 流动性高,随时可交易 | 价格波动大,容易产生滑点 |
| 价格发现及时 | 对系统性能要求高 |
| 适合高频交易 | 容易被操纵(比如虚假挂单) |
你可能会问:「那有没有办法解决这些缺点?」
有。比如引入熔断机制、最小价格变动单位、订单类型限制等。但这些是后面章节的内容了。
1.7 小结
连续竞价,说白了就是「实时撮合」。它和集合竞价的核心区别在于:一个随时成交,一个定时成交。A股、期货、数字货币都用它,因为这三个市场都需要高流动性和实时价格发现。
我个人觉得,理解连续竞价的关键就两点:
- 价格优先、时间优先——这是规则
- 订单簿——这是实现
记住这两点,你就掌握了撮合引擎的基石。