0212 分钟
MARKET · DEPTH · IOC

市价单会吃掉什么?

让一笔不指定价格的订单逐档扫过卖盘,区分立即成交、平均执行价和没有对手方的剩余数量。

本章目标学完后,你应该能:
  • 解释市价单为什么会跨越多个价格档位
  • 用平均执行价衡量深度造成的冲击
  • 判断 IOC 剩余数量为什么不能自动变成挂单
章节位置第 2 / 4 章
  1. 上一章谁应该先成交?
  2. 本章市价单会吃掉什么?

    让一笔不指定价格的订单逐档扫过卖盘,区分立即成交、平均执行价和没有对手方的剩余数量。

  3. 下一章价差是谁留下的?
阅读前

先想一想这几个问题

展开答案前,可以先在心里做个判断。与预期不同的内容可以加入复习列表。

Q01市价单没有写价格,难道是在说‘多少钱都买’?
简要回答

从风险角度几乎是。真实系统常把它实现为带保护上限的 IOC:立即吃掉允许范围内的档位,剩余取消,避免空盘口或极端价格无限吞噬资金。

和原先判断相比:

市价单把“现在就成交”放在第一位,把价格交给盘口。它看起来比限价单简单,却更依赖市场深度:同一笔订单可能在多个价格档位成交,平均执行价也可能和第一眼看到的卖一完全不同。

不指定价格,不等于没有价格

实验室里的市价单只承诺一件事:尽量立即成交。它会从卖一开始逐档吃掉可用数量,直到订单完成或盘口没有更多对手方。每一笔成交仍然有明确价格,只是这些价格来自等待中的卖单。

ENGINE RUNNINGLAB / 积分
ORDERBOOK 001 · PRICE / TIME PRIORITY

LAB / 积分

限价订单先进入队列;只有盘口交叉,撮合引擎才会把它们变成成交。

最近成交分 / LAB
买一98最高买价
卖一102最低卖价
价差4
已成交0LAB
MARKET ORDER · IOC

市价单会沿着卖盘逐档成交

它不把价格写进订单簿,而是立即消耗当下可见的深度;没有成交的剩余部分不会悄悄变成挂单。

卖一深度 5 LAB最近市价均价 未成交并取消 LAB
实时订单簿价格 / 剩余 / 来源
卖单(ASK)买单(BID)
1022A
1023B
1055A
983B
965A
卖一:102买一:98
观察提示

先读盘口:卖一是当前最低卖价,买一是当前最高买价。只有买价不低于卖价时,撮合循环才会启动。

引擎事件1 EVENTS
  1. 01

    盘口创建:卖一 102 分(两个价位相同的订单),买一 98 分。价格和时间都需要被保留。

操作记录实验时间轴
1 个状态快照

拖动滑块可以回到此前的步骤。从那里继续操作时,后续记录会替换为新的操作序列。

初始状态
查看实验记录 →

一笔订单可以跨过多个档位

初始卖盘在 102 分有 5 LAB,在 105 分还有 5 LAB。市价买入 8 LAB 会先拿走 102 分的 5 LAB,再从 105 分拿走 3 LAB。它不是“以 102 分买 8 份”,而是两条不同的成交记录。

平均执行价是所有成交金额除以成交数量。在这个例子里,平均价会高于 102 分;差异来自深度,不是手续费,也不是引擎随机改变了报价。

IOC 剩余数量不会悄悄排队

市价单的教学实现采用 IOC(Immediate-Or-Cancel):能立即成交的部分完成,找不到对手方的部分立即取消。这样“我愿意现在成交”和“我愿意挂在盘口等待”被明确区分。

展开:这一步如何实现
for ask in asks sorted by price, time:
  fill = min(order.remaining, ask.remaining)
  settle(at=ask.price, quantity=fill)
  if order.remaining == 0: break
cancel(order.remaining)

真实交易系统还要检查余额、价格保护、风控限额和撮合批次。实验室把这些结果写进执行摘要:请求数量、已成交数量、未成交数量和平均成交价,方便你从状态而不是动画判断发生了什么。

理解检查

市价买入 8 LAB 后,为什么平均执行价会高于卖一 102 分?

用三个问题读懂市价单

  1. 订单是在保护价格,还是保护立即成交?
  2. 当前卖一有多少数量,下一档价格在哪里?
  3. 未成交的数量是继续等待,还是按 IOC 规则被取消?

这三个问题同样适用于交易所、链上订单簿和清算系统。市价单不是“没有价格”,而是把价格选择权交给了当前可见的流动性。

本章小结完成练习和理解检查后,可以保存本章