跳到主要内容

Websocket 行情推送

  • 本篇所列出的所有 wss 接口的 baseurl 为: wss://wbs-api.mexc.com/ws
  • 每个到 wss://wbs-api.mexc.com/ws 的链接有效期不超过 24 小时,请妥善处理断线重连
  • symbol 名称中所有交易对均为大写,如:[email protected]@<symbol>
    实例:[email protected]@100ms@BTCUSDT
  • websocket 没有有效订阅的话,服务器会在30 秒时主动断开连接,如果订阅成功但是没有流量,服务器会在一分钟时主动断开,客户端可以发送 ping 来保持链接
  • 1 个 ws 连接最多 30 个订阅
  • 请按照文档返回的参数进行处理数据,文档没有返回的参数近期将进行优化处理,请勿使用

实时订阅/取消数据流

  • 以下数据可以通过 websocket 发送以实现订阅或取消订阅数据流。示例如下。
  • 响应内容中的id是无符号整数,作为往来信息的唯一标识。
  • 如果相应内容中的 msg 为相应的请求字段,表示请求发送成功。

protocolbuffers 接入方案

当前 ws 推送采用 protobuf 的形式,具体接入流程如下:

1.PB 文件定义 PB 定义文件可以在此连接处获取:https://github.com/mexcdevelop/websocket-proto

2.生成反序列化代码 使用https://github.com/protocolbuffers/protobuf工具编译.proto 文件,生成反序列化代码

Java

//在proto文件夹下执行
protoc *.proto --java_out=java文件输出路径

python

//在proto文件夹下执行
protoc *.proto --python_out=python文件输出路径

其他

 支持多种语言,包括 C++,C#, Go, Ruby, PHP, JS等。详见[https://github.com/protocolbuffers/protobuf](https://github.com/protocolbuffers/protobuf)。

3.数据反序列化 使用上一步生成的代码,反序列化数据

Java 引入 protobuf-java:

  <dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>S{protobuf.version}/version><!-- 根据项目实际情况指定版本 -->
</dependency>


解析示例:

// 组装对象
PushDataV3ApiWrapper pushDataV3ApiWrapper = PushDataV3ApiWrapper.newBuilder()
.setChannel("[email protected]@10ms")
.setSymbol("BTCUSDTI)
.setSendTime(System.currentTimeMillis())
.build();

// 序列化为byte数组
byte[] serializedData = pushDataV3ApiWrapper.toByteArray();

// 反序列化为 PushDataV3ApiWrapper 对象
PushDataV3ApiWrapper resultV3 = PushDataV3ApiWrapper.parseFrom(serializedData);

python

 解析示例:


import PushDataV3ApiWrapper_pb2

#组装对象
PushDataV3ApiWrapper = PushDataV3ApiWrapper_pb2.PushDataV3ApiWrapper()
PushDataV3ApiWrapper.channel = '[email protected]@10ms'
PushDataV3ApiWrapper.symbol ='BTCUSDT'

#序列化为字符串
serializedData = PushDataV3ApiWrapper.SerializeToString()

# 反序列化为 PushDataV3ApiWrapper 对象
result = PushDataV3ApiWrapper_pb2.PushDataV3ApiWrapper()
result.ParseFromString(serializedData)
print(result)

订阅一个信息流

订阅频道响应

 {
"id":0,
"code":0,
"msg":"[email protected]@100ms@BTCUSDT"
}
  • 请求
{
"method": "SUBSCRIPTION",
"params": ["[email protected]@100ms@BTCUSDT"]
}

取消订阅一个信息流

取消订阅响应

 {
"id":0,
"code":0,
"msg":"[email protected]@100ms@BTCUSDT"
}
  • 请求
{
"method": "UNSUBSCRIPTION",
"params": ["[email protected]@100ms@BTCUSDT"]
}

PING/PONG 机制

PING/PONG 响应

 {
"id":0,
"code":0,
"msg":"PONG"
}
  • 请求
{ "method": "PING" }

成交信息

request:

{
"method": "SUBSCRIPTION",
"params": [
"[email protected]@100ms@BTCUSDT"
]
}

response:

 {
"channel": "[email protected]@100ms@BTCUSDT",
"publicdeals": {
"dealsList": [
{
"price": "93220.00", //成交价格price
"quantity": "0.04438243", //成交数量quantity
"tradetype": 2,//交易类型tradeType
"time": 1736409765051 //成交时间dealTime
}
],
"eventtype": "[email protected]@100ms" //事件类型
},
"symbol": "BTCUSDT", //交易对symbol
"sendtime": 1736409765052 //事件时间eventTime
}

请求参数: [email protected]@(100ms|10ms)@<symbol>

成交信息推送每一笔成交的信息。成交,或者说交易的定义是仅有一个吃单者与一个挂单者相互交易

返回参数:

参数名数据类型说明
dealsListarray成交信息
pricestring成交价格
quantitystring成交数量
tradetypeint交易类型 1:买 2:卖
timelong成交时间
eventtypestring事件类型
symbolstring交易对
sendtimelong事件时间

K 线 Streams

request:

{
"method": "SUBSCRIPTION",
"params": [
"[email protected]@BTCUSDT@Min15"
]
}

response:

{
"channel": "[email protected]@BTCUSDT@Min15",
"publicspotkline": {
"interval": "Min15", //K线间隔
"windowstart": 1736410500, //这根K线的起始时间
"openingprice": "92925", //这根K线期间第一笔成交价
"closingprice": "93158.47", //这根K线期间末一笔成交价
"highestprice": "93158.47", //这根K线期间最高成交价
"lowestprice": "92800", //这根K线期间最低成交价
"volume": "36.83803224", //这根K线期间成交量
"amount": "3424811.05", //这根K线期间成交额
"windowend": 1736411400 //这根K线的结束时间
},
"symbol": "BTCUSDT",
"symbolid": "2fb942154ef44a4ab2ef98c8afb6a4a7",
"createtime": 1736410707571
}

K 线逐秒推送所请求的 K 线种类(最新一根 K 线)的更新。

请求参数: [email protected]@<symbol>@<interval>

返回参数:

参数名数据类型说明
publicspotklineobjectk 线信息
intervalintervalK 线间隔
windowstartlong这根 K 线的起始时间
openingpricebigDecimal这根 K 线期间第一笔成交价
closingpricebigDecimal这根 K 线期间末一笔成交价
highestpricebigDecimal这根 K 线期间最高成交价
lowestpricebigDecimal这根 K 线期间最低成交价
volumebigDecimal这根 K 线期间成交量
amountbigDecimal这根 K 线期间成交额
windowendlong这根 K 线的结束时间
symbolstring交易对
symbolidstring交易对 id
createtimelong事件时间

K 线图间隔参数:

Min -> 分钟; Hour -> 小时; Day -> 天; Week -> 周, M -> 月

  • Min1
  • Min5
  • Min15
  • Min30
  • Min60
  • Hour4
  • Hour8
  • Day1
  • Week1
  • Month1

增量深度信息

request:

{
"method": "SUBSCRIPTION",
"params": [
"[email protected]@100ms@BTCUSDT"
]
}

response:

{
"channel": "[email protected]@100ms@BTCUSDT",
"publicincreasedepths": {
"asksList": [], //asks:卖单
"bidsList": [ //bids:买单
{
"price": "92877.58", //变动的价格档位
"quantity": "0.00000000" //数量
}
],
"eventtype": "[email protected]@100ms", //事件类型
"fromVersion" : "10589632359", // 开始version
"toVersion" : "10589632359" // 截止version
},
"symbol": "BTCUSDT", //交易对
"sendtime": 1736411507002 //事件时间
}

如果某个价格对应的挂单量(quantity)为 0,表示该价位的挂单已经撤单或者被吃,应该移除这个价位。

请求参数: [email protected]@(100ms|10ms)@<symbol>

返回参数:

参数名数据类型说明
pricestring变动的价格档位
quantitystring数量
eventtypestring事件类型
fromversionstring开始版本号
toversionstring截止版本号
symbolstring交易对
sendtimelong事件时间

有限档位深度信息

推送有限档深度信息,levels 表示几档买卖单信息, 可选 5/10/20 档。

request:

{
"method": "SUBSCRIPTION",
"params": [
"[email protected]@BTCUSDT@5"

]
}

response:

{
"channel": "[email protected]@BTCUSDT@5",
"publiclimitdepths": {
"asksList": [ //asks:卖单
{
"price": "93180.18", //变动的价格档位
"quantity": "0.21976424" //数量
}
],
"bidsList": [ //bids:买单
{
"price": "93179.98",
"quantity": "2.82651000"
}
],
"eventtype": "[email protected]", //事件类型
"version": "36913565463" //版本号
},
"symbol": "BTCUSDT", //交易对
"sendtime": 1736411838730 //事件时间
}

请求参数: [email protected]@<symbol>@<level>

返回参数:

参数名数据类型说明
pricestring变动的价格档位
quantitystring数量
eventtypestring事件类型
versionstring版本号
symbolstring交易对
sendtimelong事件时间

按 Symbol 的最优挂单信息

推送指定交易对最优挂单信息。

request:

{
"method": "SUBSCRIPTION",
"params": [
"[email protected]@100ms@BTCUSDT"
]
}

response:

{
"channel": "[email protected]@100ms@BTCUSDT",
"publicbookticker": {
"bidprice": "93387.28", // 买单最优挂单价格
"bidquantity": "3.73485", //买单最优挂单数量
"askprice": "93387.29", //卖单最优挂单价格
"askquantity": "7.669875" //卖单最优挂单数量
},
"symbol": "BTCUSDT", //交易对
"sendtime": 1736412092433 //事件时间
}

请求参数: [email protected]@(100ms|10ms)@<symbol>

返回参数:

参数名数据类型说明
bidpricestring买单最优挂单价格
bidquantitystring买单最优挂单数量
askpricestring卖单最优挂单价格
askquantitystring卖单最优挂单数量
symbolstring交易对
sendtimelong事件时间

按 Symbol 的最优挂单信息(批量聚合)

批量聚合版本,推送指定交易对最优挂单信息。

request:

{
"method": "SUBSCRIPTION",
"params": [
"[email protected]@BTCUSDT"
]
}

response:

{
"channel" : "[email protected]@BTCUSDT",
"symbol" : "BTCUSDT",
"sendTime" : "1739503249114",
"publicBookTickerBatch" : {
"items" : [ {
"bidPrice" : "96567.37",
"bidQuantity" : "3.362925",
"askPrice" : "96567.38",
"askQuantity" : "1.545255"
} ]
}
}

请求参数: [email protected]@<symbol>

返回参数:

参数名数据类型说明
bidpricestring买单最优挂单价格
bidquantitystring买单最优挂单数量
askpricestring卖单最优挂单价格
askquantitystring卖单最优挂单数量
symbolstring交易对
sendtimelong事件时间

全交易对行情信息

指定时区的全交易对行情信息,3 秒推送一次,包括所有有价格变动的交易对,UTC 取值范围:24H,UTC-10,UTC-8,UTC-7,UTC-6,UTC-5,UTC-4,UTC-3,UTC+0,UTC+1,UTC+2,UTC+3,UTC+4,UTC+4:30,UTC+5,UTC+5:30,UTC+6,UTC+7,UTC+8,UTC+9,UTC+10,UTC+11,UTC+12,UTC+12:45,UTC+13

request:

{
"method": "SUBSCRIPTION",
"params": [
"[email protected]@UTC+8"
]
}

response:

{
"channel": "[email protected]@UTC+8",
"sendTime": "1755076614201",
"publicMiniTickers":
{
"items":
[
{
"symbol": "METAUSDT",
"price": "0.055",
"rate": "-0.2361",
"zonedRate": "-0.2361",
"high": "0.119",
"low": "0.053",
"volume": "814864.474",
"quantity": "10764997.16",
"lastCloseRate": "-0.2567",
"lastCloseZonedRate": "-0.2567",
"lastCloseHigh": "0.119",
"lastCloseLow": "0.053"
},
{
"symbol": "FCATUSDT",
"price": "0.0000031",
"rate": "-0.4464",
"zonedRate": "-0.4464",
"high": "0.0000066",
"low": "0.0000025",
"volume": "2825.4350195",
"quantity": "654649950.75",
"lastCloseRate": "-0.4464",
"lastCloseZonedRate": "-0.4464",
"lastCloseHigh": "0.0000066",
"lastCloseLow": "0.0000025"
},
{
"symbol": "CRVETH",
"price": "0.00022592",
"rate": "0.028",
"zonedRate": "0.028",
"high": "0.00022856",
"low": "0.00021024",
"volume": "1062.48406269",
"quantity": "4884456.998",
"lastCloseRate": "0.0276",
"lastCloseZonedRate": "0.0276",
"lastCloseHigh": "0.00022856",
"lastCloseLow": "0.00021024"
}
]
}
}

请求参数: channel": "[email protected]@<UTC-TIMEZONE>

返回参数:

参数名数据类型说明
symbolstring交易对名
pricestring最新价格
ratestringUTC+8 时区涨跌幅
zonedRatestring时区涨跌幅
highstring滚动最高价
lowstring滚动最低价
volumestring滚动成交额
quantitystring滚动成交量
lastCloseRatestringUTC+8 时区上期收盘价模式涨跌幅
lastCloseZonedRatestring上期收盘价模式时区涨跌幅
lastCloseHighstring上期收盘价模式滚动最高价
lastCloseLowstring上期收盘价模式滚动最低价

交易对行情信息

指定时区指定交易对的行情信息,3 秒推送一次,UTC 取值范围:24H,UTC-10,UTC-8,UTC-7,UTC-6,UTC-5,UTC-4,UTC-3,UTC+0,UTC+1,UTC+2,UTC+3,UTC+4,UTC+4:30,UTC+5,UTC+5:30,UTC+6,UTC+7,UTC+8,UTC+9,UTC+10,UTC+11,UTC+12,UTC+12:45,UTC+13

request:

{
"method": "SUBSCRIPTION",
"params": [
"[email protected]@MXUSDT@UTC+8"
]
}

response:

{
"channel" : "[email protected]@MXUSDT@UTC+8",
"symbol" : "MXUSDT",
"sendTime" : "1755076752201",
"publicMiniTicker" : {
"symbol" : "MXUSDT",
"price" : "2.5174",
"rate" : "0.0766",
"zonedRate" : "0.0766",
"high" : "2.6299",
"low" : "2.302",
"volume" : "11336518.0264",
"quantity" : "4638390.17",
"lastCloseRate" : "0.0767",
"lastCloseZonedRate" : "0.0767",
"lastCloseHigh" : "2.6299",
"lastCloseLow" : "2.302"
}
}

请求参数: channel": "[email protected]@<symbol>@<UTC-TIMEZONE>

返回参数:

参数名数据类型说明
symbolstring交易对名
pricestring最新价格
ratestringUTC+8 时区涨跌幅
zonedRatestring时区涨跌幅
highstring滚动最高价
lowstring滚动最低价
volumestring滚动成交额
quantitystring滚动成交量
lastCloseRatestringUTC+8 时区上期收盘价模式涨跌幅
lastCloseZonedRatestring上期收盘价模式时区涨跌幅
lastCloseHighstring上期收盘价模式滚动最高价
lastCloseLowstring上期收盘价模式滚动最低价

如何正确在本地维护一个 orderbook 副本

1.打开 WebSocket 连接并订阅[email protected]@(100ms|10ms)@{symbol}

2.开始缓存接收到的增量深度推送,并记录第一条推送消息的 fromVersion

3.访问https://api.mexc.com/api/v3/depth?symbol={symbol}&limit=5000获取深度快照,并记录lastUpdateId

4.如果 lastUpdateId < 第一条推送的 fromVersion,请返回步骤 3 重新获取快照

5.在缓存的增量推送中,丢弃所有 toVersion <= lastUpdateId 的推送消息

6.取剩余推送中的第一条消息,若fromVersion > lastUpdateId + 1,则认为数据不连续,请返回步骤 3 重新初始化

7.将本地 Order Book 设置为快照数据,本地版本号设为 lastUpdateId,并按顺序应用所有剩余及后续收到的增量推送 每次更新后,将本地版本号更新为该推送的 toVersion 若任意一条推送不满足:fromVersion = 上一条 toVersion + 1,则必须重新初始化

注意: 因为深度快照对价格档位数量有限制,初始快照之外的价格档位如果没有发生数量变化,是不会出现在增量推送消息中的。所以本地的 order book 与真实的 order book 可能会有一些差异。 不过对于大多数用例,5000 的深度限制足以有效地了解市场和交易。