2. 订单簿基础:限价单与市价单、买卖盘口、深度图

各位同学,今天我们聊聊订单簿最核心的几个概念。说白了,订单簿就是交易所里所有挂单的实时快照。你看到的买一卖一、深度图,全是从这里来的。我个人习惯把订单簿比作一个「战场」,限价单是埋伏的狙击手,市价单是冲锋的步兵。

2.1 限价单与市价单:两种最基本的武器

先说说限价单。你指定一个价格,比如「我出100元买BTC」,只有价格跌到100元时才会成交。限价单不会立即成交,它会挂在订单簿上,等着别人来吃。

市价单就简单粗暴了——「不管多少钱,我现在就要买」。系统会从最优价格开始,一路扫过去,直到买够数量。我刚开始做交易时,有一次用市价单买小币种,结果滑点吃了3%,心疼了好几天。

核心区别:
  • 限价单:控制价格,牺牲成交速度
  • 市价单:保证成交,牺牲价格确定性

嗯,这里要注意:限价单如果没成交,会一直挂在订单簿上,直到你撤单或者价格碰到它。市价单则像一阵风,刮过去就没了。

2.2 买卖盘口:订单簿的骨架

买卖盘口,就是订单簿上所有限价单的集合。买盘叫Bid,卖盘叫Ask。每一档价格上,都挂着若干数量。

举个例子,BTC/USDT的盘口可能是这样的:

档位 买价 (Bid) 买量 卖价 (Ask) 卖量
1 100.00 1.5 100.10 2.0
2 99.90 3.0 100.20 1.8
3 99.80 2.2 100.30 2.5

买一价100.00,卖一价100.10,价差0.10。这个价差就是做市商赚的钱,也是你交易的成本。我在项目中遇到过,有些流动性差的币种,价差能到1%以上,那基本没法做高频。

2.3 深度图:把盘口画出来

深度图就是把买卖盘口按价格累加,画成两条曲线。买盘从左到右递增,卖盘从右到左递减。两条线中间的空隙,就是当前价差。

为什么要看深度图?因为一眼就能看出「哪里有大单」。比如买盘在99.50处突然堆了1000个BTC,那说明这里有强支撑。卖盘在101.00处压了800个BTC,那就是阻力位。

我的经验: 深度图上的「墙」往往是假的。我曾经见过一个币,卖一挂了5000个币,结果价格一碰就撤单,然后反手往上拉。这就是典型的「订单簿陷阱」。

下面我用SVG画了一张订单簿结构图,帮你理清这些概念的关系:

订单簿核心结构 限价单 指定价格,等待成交 挂在订单簿上 控制成本,牺牲速度 市价单 立即按最优价成交 扫单直到数量满足 保证成交,可能滑点 买卖盘口 (Order Book) 买盘 (Bid) ← 限价买单 卖盘 (Ask) ← 限价卖单 买一、卖一、价差 深度图 (Depth Chart) 绿色曲线 ← 买盘累计 红色曲线 ← 卖盘累计

你看,限价单构成了买卖盘口,买卖盘口又画出了深度图。三者层层递进。我个人习惯在交易前,先看深度图找「墙」,再看盘口看价差,最后决定用限价单还是市价单。

2.4 实战中的坑

讲几个我踩过的坑:

  • 市价单的滑点陷阱: 有一次我用市价单买ETH,盘口只有10个ETH的深度,我买了50个。结果价格从1000直接拉到1015,多花了750美金。后来我学乖了,大单一定拆成小单,或者用限价单慢慢吃。
  • 限价单的「假挂单」: 有些做市商会在盘口挂大单,但价格一靠近就撤单。这叫「spoofing」,是违规的,但散户很难取证。我的应对方法是:看到大单先别急着跟,等价格真正穿过去再说。
  • 深度图的滞后性: 深度图是快照,不是实时流。在高频交易中,你看到的深度可能已经过时了。我一般用WebSocket订阅订单簿增量,而不是等全量快照。
避坑指南: 我曾经在深度图上看到买盘很厚,以为跌不下去,结果一个巨量卖单直接把买盘砸穿。后来我明白了——深度图只能反映「过去」的挂单,不能预测「未来」的成交。永远不要迷信深度图。

2.5 代码示例:用Python抓取订单簿

最后,给你一段简单的代码,用CCXT库从币安拉订单簿数据。你可以自己跑跑看。

import ccxt

exchange = ccxt.binance()
symbol = 'BTC/USDT'

# 获取订单簿
orderbook = exchange.fetch_order_book(symbol)

# 打印买一卖一
bid = orderbook['bids'][0] if orderbook['bids'] else None
ask = orderbook['asks'][0] if orderbook['asks'] else None

print(f"买一: {bid[0]} 数量: {bid[1]}")
print(f"卖一: {ask[0]} 数量: {ask[1]}")
print(f"价差: {ask[0] - bid[0]:.2f}")

# 打印前5档深度
print("\n买盘前5档:")
for price, volume in orderbook['bids'][:5]:
    print(f"  {price:.2f} -> {volume:.4f}")

print("\n卖盘前5档:")
for price, volume in orderbook['asks'][:5]:
    print(f"  {price:.2f} -> {volume:.4f}")

这段代码很简单,但很实用。你可以在回测中用它来模拟订单簿环境,也可以实盘监控。我个人习惯把订单簿数据存到本地数据库,方便后续分析。

小技巧: 如果你做高频,建议用WebSocket订阅订单簿增量,而不是每次都拉全量。币安的WebSocket文档里有stream名称,叫"depth20@100ms",每100毫秒推送一次增量更新。

好了,订单簿的基础就讲到这里。记住:限价单是防守,市价单是进攻。买卖盘口是阵地,深度图是地形。理解这些,你才能看懂后面的「流动性猎杀」和「订单簿陷阱」。

专注资料整理