一、价格优先原则:为什么买单价格高的排前面?卖单价格低的排前面?限价单与市价单的优先级差异
大家好,我是你们的老朋友,一个在交易所后台摸爬滚打多年的工程师。今天咱们来聊聊撮合引擎里最核心、最基础,但也最容易让人忽略的一个原则——价格优先。
说白了,价格优先就是一句话:谁出的价更“狠”,谁就先成交。
但“狠”的方向不一样。买方这边,谁愿意出更高的价格买,谁就排在前面。卖方那边,谁愿意以更低的价格卖,谁就排在前面。你想想看,这其实很符合直觉——如果你是卖家,你肯定想把货卖给那个出价最高的人;如果你是买家,你肯定想从那个要价最低的人手里买。
嗯,道理很简单,但落地到代码里,细节就多了。我当年刚入行时,就因为这个原则的理解不够深,踩过一个坑。当时我们做的是一个数字货币交易所,有个用户下了个超高价买单,结果系统直接给他成交了一堆低价卖单,把市场砸了个大坑。后来排查才发现,是价格优先的排序逻辑里,有个边界条件没处理好。
好,咱们一步步拆解。
1.1 买单排序:价高者得
先看买单。假设现在有三个买家,分别想买同一只股票:
- 张三:出价 10.00 元,买 100 股
- 李四:出价 10.05 元,买 200 股
- 王五:出价 10.02 元,买 150 股
按照价格优先原则,谁排在前面?
答案是李四。因为他出价最高,10.05 元。王五排第二,10.02 元。张三排最后,10.00 元。
为什么会这样?因为交易所要保证“最优执行”。对于卖方来说,他们希望自己的订单能卖个好价钱。所以,当有卖单进来时,系统会优先匹配那些出价最高的买单。这样,卖方就能以尽可能高的价格成交。
我个人习惯把买单队列想象成一个“拍卖会”。谁举牌的价格高,谁就先拿到货。这个逻辑在所有的连续竞价市场里都是一样的,不管是股票、期货还是数字货币。
核心要点:买单队列是降序排列的。价格最高的买单永远在队首。
1.2 卖单排序:价低者先
再看卖单。同样三个卖家:
- 赵六:要价 10.00 元,卖 100 股
- 钱七:要价 9.95 元,卖 200 股
- 孙八:要价 9.98 元,卖 150 股
谁排在前面?
钱七。因为他要价最低,9.95 元。孙八排第二,9.98 元。赵六排最后,10.00 元。
这个逻辑和买单正好相反。对于买方来说,他们希望买到便宜货。所以系统会优先匹配那些要价最低的卖单。这样,买方就能以尽可能低的价格买入。
我把卖单队列想象成一个“打折促销会”。谁标的价格最低,谁就先被抢购一空。
核心要点:卖单队列是升序排列的。价格最低的卖单永远在队首。
1.3 限价单与市价单的优先级差异
好,到这里你可能觉得:这很简单嘛。但接下来这个问题,才是真正考验理解深度的地方——限价单和市价单,在价格优先原则下,谁更优先?
先说结论:市价单本质上是一种特殊的限价单,它的优先级取决于你如何定义它的“价格”。
市价单的意思是:我不指定价格,我只想尽快成交。所以,系统会把它当成一个“不挑食”的订单。在买单队列里,市价买单会被视为“价格无限高”的订单。在卖单队列里,市价卖单会被视为“价格无限低”的订单。
你想想看,这样一来,市价单的优先级天然就比所有限价单都高。
举个例子:
- 买单队列里,有一个限价买单,价格 10.00 元。
- 这时候进来一个市价买单。
系统会怎么处理?
系统会把市价买单放在限价买单的前面。因为市价买单愿意以任何价格成交,相当于出价“无限高”。所以,当有卖单进来时,会先和市价买单匹配,而不是那个 10.00 元的限价买单。
反过来也一样。卖单队列里,有一个限价卖单,价格 10.00 元。这时候进来一个市价卖单。系统会把市价卖单放在限价卖单的前面,因为市价卖单愿意以任何价格卖出,相当于要价“无限低”。
避坑指南:我曾经在开发一个高频交易系统时,遇到过一个问题:市价单太多,导致限价单几乎无法成交。后来我们加了一个“市价单比例限制”,防止市价单过度抢占流动性。这个经验告诉我,虽然市价单优先级高,但也要考虑市场公平性。
1.4 价格优先的完整流程图
为了让你更直观地理解整个过程,我画了一张图。这张图展示了买单和卖单队列在价格优先原则下的排序逻辑,以及市价单如何插入队列。
这张图里,你可以看到:买单队列是降序的,卖单队列是升序的。市价单都排在各自队列的最前面。当买单队首的价格大于等于卖单队首的价格时,就会触发成交。
1.5 一个完整的例子
咱们来走一个完整的流程,加深理解。
假设当前市场状态如下:
| 买单队列 | 价格 | 数量 | 卖单队列 | 价格 | 数量 |
|---|---|---|---|---|---|
| 市价买单 | 无限高 | 100 | 市价卖单 | 无限低 | 50 |
| 限价买单 A | 10.05 | 200 | 限价卖单 X | 9.95 | 150 |
| 限价买单 B | 10.02 | 150 | 限价卖单 Y | 10.00 | 100 |
现在,一个新的限价卖单进来了:价格 9.98 元,数量 100 股。
系统会怎么做?
- 先看买单队首:市价买单,价格无限高。9.98 元 ≤ 无限高,满足成交条件。
- 成交 50 股(市价买单只有 50 股)。市价买单被完全吃掉,从队列中移除。
- 现在买单队首变成了限价买单 A,价格 10.05 元。9.98 元 ≤ 10.05 元,继续成交。
- 成交 100 股(新卖单还剩 50 股,限价买单 A 有 200 股)。新卖单被完全吃掉,从队列中移除。
- 限价买单 A 还剩 150 股,继续排在队首。
你看,整个过程就是:新订单进来,从对方队列的队首开始,一个一个比价格,能成交就成交,直到不能成交为止。
注意:这里有一个容易忽略的点。市价单虽然优先级高,但它也有风险。如果市场流动性不足,市价单可能会以非常差的价格成交。我曾经见过一个极端案例,一个市价卖单在流动性枯竭时,直接砸穿了多个价格档位,成交价远低于预期。所以,我个人建议,在流动性较差的市场,慎用市价单。
1.6 总结一下
价格优先原则,说白了就是:
- 买单:价高者得,降序排列。
- 卖单:价低者先,升序排列。
- 市价单:视为价格极端的限价单,优先级最高。
这个原则是所有撮合引擎的基石。你理解了它,就理解了交易所最核心的运作逻辑。下一章,咱们会聊时间优先原则,看看当价格相同时,系统怎么决定谁先成交。
好,今天就到这里。希望这张图能帮你把逻辑理清楚。咱们下章见。