跳到主要内容

WebSocket API

WebSocket是HTML5一种新的协议(Protocol)。它实现了客户端与服务器全双工通信,使得数据可以快速地双向传播。通过一次简单的握手就可以建立客户端和服务器连接,服务器根据业务规则可以主动推送信息给客户端。其优点如下:

  1. 客户端和服务器进行数据传输时,请求头信息比较小,大概2个字节。
  2. 客户端和服务器皆可以主动地发送数据给对方。
  3. 不需要多次创建TCP请求和销毁,节约宽带和服务器的资源。

原生ws连接地址

  • wss://contract.mexc.com/edge

数据交互命令详解

发送ping消息

{
"method": "ping"
}

服务端返回

{
"channel": "pong",
"data": 1587453241453
}

订阅/取消订阅数据命令列表(除个人相关命令列表之外,其余都不需要做ws认证)

1分钟以内未收到客户端ping,将断开该客户端连接,建议10~20秒发送一次ping

发送ping消息及服务端返回见右侧

订阅过滤

取消默认推送示例

{
"subscribe": false,
"method": "login",
"param": {
"apiKey": "mxU1TzSmRDW1o5AsE",
"signature": "8c957a757ea31672eca05cb652d26bab7f46a41364adb714dda5475264aff120",
"reqTime": "1611038237237"
}
}

只要资产

{
"method":"personal.filter",
"param":{
"filters":[
{
"filter":"asset"
}
]
}
}

只要ADL等级

{
"method":"personal.filter",
"param":{
"filters":[
{
"filter":"adl.level"
}
]
}
}

只要所有的成交单

{
"method":"personal.filter",
"param":{
"filters":[
{
"filter":"order.deal",
"rules":[]
}
]
}
}

或者

{
"method":"personal.filter",
"param":{
"filters":[
{
"filter":"order.deal"
}
]
}
}

只要单个合约的成交单

{
"method":"personal.filter",
"param":{
"filters":[
{
"filter":"order.deal",
"rules":[
"BTC_USDT"
]
}
]
}
}

混合使用

{
"method":"personal.filter",
"param":{
"filters":[
{
"filter":"order",
"rules":[
"BTC_USDT"
]
},
{
"filter":"order.deal",
"rules":[
"EOS_USDT",
"ETH_USDT",
"BTC_USDT"
]
},
{
"filter":"position",
"rules":[
"EOS_USDT",
"BTC_USDT"
]
},
{
"filter":"asset"
}
]
}
}

登录之后会推送所有私有数据:order订单、order.deal成交单、position持仓、plan.order计划委托单、stop.order止盈止损单、stop.planorder止盈止损计划委托单、risk.limit风险限额、adl.level ADL等级、asset资产

1、如果要取消默认推送,登录时新加参数: "subscribe":false,默认为true;

2、登录之后通过发送 personal.filter 事件来过滤自己需要的数据,如果想要恢复推送所有数据,可发送: {"method":"personal.filter"} 或者 {"method":"personal.filter","param":{"filters":[]}}

3、filter可用key:order、order.deal、position、plan.order、stop.order、stop.planorder、risk.limit、adl.level、asset 固定值,不可更改,若有错误会提示

其中asset和adl.level不支持过滤单个币种或者单个合约,其他均可以过滤单个合约

后面发送的filter事件会覆盖前面的

公共频道

Tickers

订阅

{
"method": "sub.tickers",
"param": {}
}

如需返回明文(后面订阅一样):

{
"method": "sub.tickers",
"param": {},
"gzip": false
}

取消订阅

{
"method": "unsub.tickers",
"param": {}
}

数据示例

{
"channel": "push.tickers",
"data": [
{
"fairPrice": 183.01,
"lastPrice": 183,
"riseFallRate": -0.0708,
"symbol": "BSV_USDT",
"volume24": 200
},
{
"fairPrice": 220.22,
"lastPrice": 220.4,
"riseFallRate": -0.0686,
"symbol": "BCH_USDT",
"volume24": 200
}
],
"ts": 1587442022003
}

获取平台全部永续合约的最新成交价、买一价、卖一价和24交易量,无需用户登录,订阅后1秒发送一次。

订阅、取消订阅、数据示例见右侧。

响应参数:

参数名类型说明
symbolstring合约名
lastPricedecimal最新价
volume24decimal24小时成交量,按张数统计
riseFallRatedecimal涨跌幅
fairPricedecimal合理价

获取单个ticker

订阅

{
"method":"sub.ticker",
"param":{
"symbol":"BTC_USDT"
}
}

取消订阅

{
"method":"unsub.ticker",
"param":{
"symbol":"BTC_USDT"
}
}

数据示例

{
"channel":"push.ticker",
"data":{
"ask1":6866.5,
"bid1":6865,
"contractId":1,
"fairPrice":6867.4,
"fundingRate":0.0008,
"high24Price":7223.5,
"indexPrice":6861.6,
"lastPrice":6865.5,
"lower24Price":6756,
"maxBidPrice":7073.42,
"minAskPrice":6661.37,
"riseFallRate":-0.0424,
"riseFallValue":-304.5,
"symbol":"BTC_USDT",
"timestamp":1587442022003,
"holdVol":2284742,
"volume24":164586129
},
"symbol":"BTC_USDT",
"ts":1587442022003
}

获取某个合约的最新成交价、买一价、卖一价和24交易量,无需用户登录,有成交数据就推送,订阅后1秒发送一次。

订阅、取消订阅、数据示例见右侧。

响应参数:

参数名类型说明
symbolstring合约名
lastPricedecimal最新价
bid1decimal买一价
ask1decimal卖一价
volume24decimal24小时成交量,按张数统计
holdVoldecimal总持仓量
lower24Pricedecimal24小时最低价
high24Pricedecimal24小时内最高价
riseFallRatedecimal涨跌幅
riseFallValuedecimal涨跌额
indexPricedecimal指数价格
fairPricedecimal合理价
fundingRatedecimal资金费率
timestamplong系统时间戳

成交

订阅

{
"method":"sub.deal",
"param":{
"symbol":"BTC_USDT"
}
}

取消订阅

{
"method":"unsub.deal",
"param":{
"symbol":"BTC_USDT"
}
}

数据示例

{
"symbol": "BTC_USDT",
"data": [{
"p": 115309.8,
"v": 55,
"T": 2,
"O": 3,
"M": 1,
"t": 1755487578276
}, {
"p": 115309.8,
"v": 11,
"T": 1,
"O": 3,
"M": 1,
"t": 1755487578275
}],
"channel": "push.deal",
"ts": 1755487578276
}

获取最近的成交数据,无需用户登录,有成交数据就推送。 成交数据订阅,默认启用合并,如不需启用,订阅时请将compress设置为false。

响应参数:

参数名类型说明
pdecimal成交价
vdecimal数量
Tint成交方向,1:买,2:卖
Oint是否是开仓,1:新增仓位,2:减少仓位,3:仓位不变。当O为1的时候, vol是新增的持仓量
Mint是否为自成交,1:是,2:否
tlong成交时间

深度

订阅增量(全部)

{
"method":"sub.depth",
"param":{
"symbol":"BTC_USDT"
}
}

订阅增量(压缩后推送)

{
"method":"sub.depth",
"param":{
"symbol":"BTC_USDT",
"compress":true
}
}

订阅全量(limit可取值:5、10、20,不传默认为20档,只能订阅一个档位的全量)

{
"method":"sub.depth.full",
"param":{
"symbol":"BTC_USDT",
"limit":5
}
}

取消订阅(增量的都以该事件取消订阅)

{
"method":"unsub.depth",
"param":{
"symbol":"BTC_USDT"
}
}

取消订阅(取消订阅全量,limit可传可不传)

{
"method":"usub.depth.full",
"param":{
"symbol":"BTC_USDT"
}
}

数据示例

{
"channel":"push.depth",
"data":{
"asks":[
[
6859.5,
3251,
1
]
],
"bids":[
],
"version":96801927
},
"symbol":"BTC_USDT",
"ts":1587442022003
}

订阅、取消订阅、数据示例见右侧。 增量深度订阅,默认启用合并,如不需启用,订阅时请将compress设置为false

响应参数:

参数名类型说明
asksList<Numeric[]>卖方深度
bidsList<Numeric[]>买方深度
versionlong版本号

备注: [411.8, 10, 1] 411.8为价格,10为此价格的合约张数,1为订单数量

K线数据

订阅

{
"method":"sub.kline",
"param":{
"symbol":"BTC_USDT",
"interval":"Min60"
}
}

取消订阅

{
"method":"unsub.kline",
"param":{
"symbol":"BTC_USDT"
}
}

数据示例

{
"channel":"push.kline",
"data":{
"a":233.740269343644737245,
"c":6885,
"h":6910.5,
"interval":"Min60",
"l":6885,
"o":6894.5,
"q":1611754,
"symbol":"BTC_USDT",
"t":1587448800
},
"symbol":"BTC_USDT",
"ts":1587442022003
}

获取合约的K线数据,有更新就推送。

订阅、取消订阅、数据示例见右侧。

interval可选参数: Min1、Min5、Min15、Min30、Min60、Hour4、Hour8、Day1、Week1、Month1

响应参数:

参数名类型说明
symbolstring合约名
adecimal总成交金额
cdecimal收盘价
intervalstring间隔: Min1、Min5、Min15、Min30、Min60、Hour4、Hour8、Day1、Week1、Month1
ldecimal最低价
odecimal开盘价
qdecimal总成交量
hdecimal最高价
tlong交易时间,单位:秒(s),为窗口的开始时间(windowStart)

资金费率

订阅

{
"method":"sub.funding.rate",
"param":{
"symbol":"BTC_USDT"
}
}

取消订阅

{
"method":"unsub.funding.rate",
"param":{
"symbol":"BTC_USDT"
}
}

数据示例

{
"channel":"push.funding.rate",
"data":{
"rate":0.001,
"symbol":"BTC_USDT"
},
"symbol":"BTC_USDT",
"ts":1587442022003
}

获取合约资金费率,有更新就推送。

订阅、取消订阅、数据示例见右侧。

响应参数:

参数名类型说明
symbolstring合约名
fundingRatedecimal资金费率
nextSettleTimelong下一次结算时间

指数价格

订阅

{
"method":"sub.index.price",
"param":{
"symbol":"BTC_USDT"
}
}

取消订阅

{
"method":"unsub.index.price",
"param":{
"symbol":"BTC_USDT"
}
}

数据示例

{
"channel":"push.index.price",
"data":{
"price":0.001,
"symbol":"BTC_USDT"
},
"symbol":"BTC_USDT",
"ts":1587442022003
}

获取指数价格,指数价格有变化时就会推送一次数据。

订阅、取消订阅、数据示例见右侧。

响应参数:

参数名类型说明
symbolstring合约名
pricedecimal价格

合理价格

订阅

{
"method":"sub.fair.price",
"param":{
"symbol":"BTC_USDT"
}
}

取消订阅

{
"method":"unsub.fair.price",
"param":{
"symbol":"BTC_USDT"
}
}

数据示例

{
"channel":"push.fair.price",
"data":{
"price":0.001,
"symbol":"BTC_USDT"
},
"symbol":"BTC_USDT",
"ts":1587442022003
}

订阅、取消订阅、数据示例见右侧。

响应参数:

参数名类型说明
symbolstring合约名
pricedecimal价格

私有频道

签名方式:

api_key和req_time拼接,将得到的参数字符串用HMAC SHA256进行加密。api_key和sec_key分别为申请api时的ACCESS KEY 和SECRET KEY。

签名字符串

"mx0aBYs33eIilxBW5C1657186536762"

登录认证

示例

{"channel":"rs.login",
"data":"success",
"ts":"1587442022003"
}
{
"method":"login",
"param":{
"apiKey":"apiKey", // openapi需要传此参数,参数构造方式参照openapi文档
"reqTime":"reqTime", // openapi需要传此参数,参数构造方式参照openapi文档
"signature":"signature" // openapi需要传此参数,参数构造方式参照openapi文档
}
}

响应参数:

成功: 无,失败:返回对应错误信息,channel = rs.error

登录成功(channel = rs.login)

订单

数据示例

{
"channel":"push.personal.order",
"data":{
"category":1,
"createTime":1610005069976,
"dealAvgPrice":0.731,
"dealVol":1,
"errorCode":0,
"externalOid":"_m_95bc2b72d3784bce8f9efecbdef9fe35",
"feeCurrency":"USDT",
"leverage":0,
"makerFee":0,
"openType":1,
"orderId":"102067003631907840",
"orderMargin":0,
"orderType":5,
"positionId":1397818,
"price":0.707,
"profit":-0.0005,
"remainVol":0,
"side":4,
"state":3,
"symbol":"CRV_USDT",
"takerFee":0.00004386,
"updateTime":1610005069983,
"usedMargin":0,
"version":2,
"vol":1
},
"ts":1610005069989
}

请求参数: channel = push.personal.order

响应参数:

参数名类型说明
orderIdlong订单id
symbolstring合约名
positionIdlong持仓id
pricedecimal委托价格
voldecimal委托数量
leveragelong杠杆倍数
sideint订单方向 1开多,2平空,3开空,4平多
categoryint订单类别:1限价委托,2强平代管委托,4ADL减仓
orderTypeint1:限价单,2:Post Only只做Maker,3:立即成交或立即取消,4:全部成交或者全部取消
dealAvgPricedecimal成交均价
dealVoldecimal成交数量
orderMargindecimal委托保证金
usedMargindecimal已经使用的保证金
takerFeedecimal买单手续费
makerFeedecimal卖单手续费
profitdecimal平仓盈亏
feeCurrencystring收费币种
openTypeint开仓类型,1逐仓,2全仓
stateint订单状态,1:待报,2未完成,3已完成,4已撤销,5无效
errorCodeint错误code,0:正常,1:参数错误,2:账户余额不足,3:仓位不存在,4:仓位可用持仓不足,5:多仓时, 委托价小于了强平价,空仓时, 委托价大于了强平价,6:开多时, 强平价大于了合理价,开空时, 强平价小于了合理价 ,7:超过风险限额限制,8:系统撤销
externalOidstring外部订单号
createTimedate创建时间
updateTimedate修改时间

资产

数据示例

{
"channel":"push.personal.asset",
"data":{
"availableBalance":0.7514236,
"bonus":0,
"currency":"USDT",
"frozenBalance":0,
"positionMargin":0
},
"ts":1610005070083
}

请求参数: channel = push.personal.asset

响应参数:

参数名类型说明
currencystring币种
positionMargindecimal仓位保证金
frozenBalancedecimal冻结余额
availableBalancedecimal当前可用余额
cashBalancedecimal可提现余 额

仓位

数据示例

{
"channel":"push.personal.position",
"data":{
"autoAddIm":false,
"closeAvgPrice":0.731,
"closeVol":1,
"frozenVol":0,
"holdAvgPrice":0.736,
"holdFee":0,
"holdVol":0,
"im":0,
"leverage":15,
"liquidatePrice":0,
"oim":0,
"openAvgPrice":0.736,
"openType":1,
"positionId":1397818,
"positionType":1,
"realised":-0.0005,
"state":3,
"symbol":"CRV_USDT"
},
"ts":1610005070157
}

请求参数: channel = push.personal.position

响应参数:

参数名类型说明
positionIdlong持仓id
symbolstring合约名
holdVoldecimal持仓数量
positionTypeint仓位类型, 1多 2空
openTypeint开仓类型, 1逐仓 2全仓
stateint仓位状态,1持仓中2系统代持3已平仓
frozenVoldecimal冻结量
closeVoldecimal平仓量
holdAvgPricedecimal持仓均价
closeAvgPricedecimal平仓均价
openAvgPricedecimal开仓均价
liquidatePricedecimal逐仓时的爆仓价
oimdecimal原始初始保证金
adlLevelintadl减仓等级,取值为 1-5,为空时需等待刷新
imdecimal初始保证金, 逐仓时可以加减此项以调节爆仓价
holdFeedecimal资金费, 正数表示得到,负数表示支出
realiseddecimal已实现盈亏
createTimedate创建时间
updateTimedate修改时间

风险限额

请求参数: channel = push.personal.risk.limit

响应参数:

参数名类型说明
symbolstring合约名
positionTypeint持仓类型 1:多仓,2:空仓
riskSourceint风险限制来源 0:其它 1:爆仓服务
levelint当前风险等级
maxVoldecimal最大可持仓数量
maxLeverageint最大杠杆倍数
mmrdecimal维持保证金率
imrdecimal初始保证金率

adl自动减仓等级

数据示例

{
"channel":"push.personal.adl.level",
"data":{
"adlLevel":0,
"positionId":1397818
},
"ts":1610005032231
}

请求参数: channel = push.personal.adl.level

响应参数:

参数名类型说明
adlLevelint当前adl等级 :1-5
positionIdlong仓位id

如何维护深度信息

例如订阅成交信息

{"method":"sub.deal",
"param":{
"symbol":"BTC_USDT"
}
}

订阅成功响应

{"channel":"rs.sub.deal",
"data":"success",
"ts":"1587442022003"
}

订阅失败响应

{"channel":"rs.error",
"data":"合约不存在!",
"ts":"1587442022003"
}

仓位模式

数据示例

{
"channel":"push.personal.position.mode",
"data":{
positionMode: 1
},
"ts":1610005070157
}

请求参数: channel = push.personal.position.mode

响应参数:

参数名类型说明
positionModeint仓位模式,1:双向,2:单向

如何维护增量深度信息:

  1. 通过接口 https://contract.mexc.com/api/v1/contract/depth/BTC_USDT获取全量深度信息,保存当前version
  2. 订阅ws深度信息,收到更新后,如果收到的数据version>当前version,同一个价位,后收到的更新覆盖前面的。
  3. 通过接口 https://contract.mexc.com/api/v1/contract/depth_commits/BTC_USDT/1000获取最新1000条深度快照
  4. 将目前缓存的深度信息中同一价格,version<步骤3获取到的快照中的version的数据丢弃
  5. 将深度快照中的内容更新至本地缓存,并从ws接收到的event开始继续更新
  6. 每一个新event的version应该恰好等于上一个event的version+1,否则可能出现了丢包,如出现丢包或者获取到的event的version不连续,请从步骤3重新进行初始化。
  7. 每一个event中的挂单量代表这个价格目前的挂单量绝对值,而不是相对变化。
  8. 如果某个价格对应的挂单量为0,表示该价位的挂单已经撤单或者被吃,应该移除这个价位。

订阅类事件,订阅成功响应:

channel 为 rs. + 订阅的method, data为 "success"