Type/to search
8
Follow
1364
Followers
数据流提速攻略:FMZ平台Protobuf技术实践
Discussions
Created 2025-08-08 16:09:52  Updated 2025-08-11 11:59:09
 0
 747

img

摘要

随着数字货币交易量的急剧增长,实时数据推送的效率和稳定性变得至关重要。MEXC交易所最新推出的基于Protocol Buffers(protobuf)的WebSocket推送方案,相比传统JSON格式具有更高的传输效率和更低的延迟。本文将详细介绍如何在FMZ量化交易平台上实现对MEXC新增WebSocket protobuf接口的访问和数据处理。

1. 技术背景

1.1 Protocol Buffers简介

Protocol Buffers是Google开发的一种语言无关、平台无关的序列化数据结构的方法。相比JSON格式,protobuf具有以下优势:

  • 数据体积更小:二进制编码比文本格式节省30-50%的空间
  • 解析速度更快:二进制解析比JSON解析快3-10倍
  • 强类型检查:编译时类型检查,减少运行时错误
  • 向后兼容:支持字段的增加和删除而不影响现有代码

1.2 MEXC WebSocket接口概述

MEXC新增的WebSocket protobuf推送接口主要提供以下数据流:

https://www.mexc.com/zh-MY/api-docs/spot-v3/websocket-market-streams

  • Private
    PrivateAccountV3Api
    PrivateDealsV3Api
    PrivateOrdersV3Api

  • Public
    PublicAggreBookTickerV3Api
    PublicAggreDealsV3Api
    PublicBookTickerV3Api
    ...

2. FMZ平台集成方案

2.1 环境准备

在FMZ平台上实现MEXC protobuf WebSocket接口需要以下准备工作:

  1. 获取MEXC API密钥:从MEXC官网申请API Key和Secret Key (仅私有接口需要)
  2. 准备protobuf定义文件:获取MEXC提供的.proto文件

2.2 连接建立流程

以建立PublicAggreDealsV3Api频道连接为例:

javascript
function main() { var payload = { "method": "SUBSCRIPTION", "params": [ "[email protected]@100ms@BTCUSDT" ] } var conn = Dial("wss://wbs-api.mexc.com/ws|payload=" + JSON.stringify(payload)) while (true) { var ret = conn.read() if (ret) { Log(ret) } } }

2.3 Protobuf数据解析

找到需要的 .proto 文件:

https://github.com/mexcdevelop // 可以在这里找到交易所的 .proto 文件

javascript
syntax = "proto3"; option java_package = "com.mxc.push.common.protobuf"; option optimize_for = SPEED; option java_multiple_files = true; option java_outer_classname = "PushDataV3ApiWrapperProto"; message PublicAggreDealsV3Api { repeated PublicAggreDealsV3ApiItem deals = 1; string eventType = 2; } message PublicAggreDealsV3ApiItem { string price = 1; string quantity = 2; int32 tradeType = 3; int64 time = 4; } message PushDataV3ApiWrapper { string channel = 1; oneof body { PublicAggreDealsV3Api publicAggreDeals = 314; } optional string symbol = 3; optional string symbolId = 4; optional int64 createTime = 5; optional int64 sendTime = 6; }

由于FMZ平台基于JavaScript,我们需要使用protobuf.js库来处理二进制数据:

JS库加载地址:

https://cdnjs.cloudflare.com/ajax/libs/protobufjs/7.5.3/protobuf.js

2.4 数据订阅与处理

WebSocket接口推送的数据为二进制数据,需要解码:

javascript
while (true) { var ret = conn.read() if (ret) { const uint8arrayData = new Uint8Array(ret) const message = PushDataV3ApiWrapper.decode(uint8arrayData) data = PushDataV3ApiWrapper.toObject(message, { longs: String, enums: String, bytes: String, defaults: true, arrays: true, objects: true }) Log("data:", data) } LogStatus(_D(), data) }

3. 具体实现示例

3.1 订阅PublicAggreDealsV3Api频道数据

javascript
let strPushDataV3ApiWrapper = `syntax = "proto3"; option java_package = "com.mxc.push.common.protobuf"; option optimize_for = SPEED; option java_multiple_files = true; option java_outer_classname = "PushDataV3ApiWrapperProto"; message PublicAggreDealsV3Api { repeated PublicAggreDealsV3ApiItem deals = 1; string eventType = 2; } message PublicAggreDealsV3ApiItem { string price = 1; string quantity = 2; int32 tradeType = 3; int64 time = 4; } message PushDataV3ApiWrapper { string channel = 1; oneof body { PublicAggreDealsV3Api publicAggreDeals = 314; } optional string symbol = 3; optional string symbolId = 4; optional int64 createTime = 5; optional int64 sendTime = 6; }` let code = HttpQuery("https://cdnjs.cloudflare.com/ajax/libs/protobufjs/7.5.3/protobuf.js") let exports = {} let module = { exports } new Function("module", "exports", code)(module, exports) let protobuf = module.exports function main() { const PushDataV3ApiWrapper = protobuf.parse(strPushDataV3ApiWrapper).root.lookupType("PushDataV3ApiWrapper") var payload = { "method": "SUBSCRIPTION", "params": [ "[email protected]@100ms@BTCUSDT" ] } // proxy=socks5://x.x.x.x:xxxx var conn = Dial("wss://wbs-api.mexc.com/ws|payload=" + JSON.stringify(payload)) var data = null while (true) { var ret = conn.read() if (ret) { const uint8arrayData = new Uint8Array(ret) const message = PushDataV3ApiWrapper.decode(uint8arrayData) data = PushDataV3ApiWrapper.toObject(message, { longs: String, enums: String, bytes: String, defaults: true, arrays: true, objects: true }) Log("data:", data) } LogStatus(_D(), data) } }

3.2 实盘测试

img

可以看到,接收到了接口推送的数据二进制数据,经过解码后,打印出了可读的数据:

json
{ "channel":"[email protected]@100ms@BTCUSDT", "symbol":"BTCUSDT", "sendTime":"1754487330985", "publicAggreDeals":{ "deals":[ {"price":"113897.97","quantity":"0.00003103","tradeType":2,"time":"1754487330933"}, {"price":"113897.97","quantity":"0.00095331","tradeType":2,"time":"1754487330934"}, {"price":"113897.97","quantity":"0.00154766","tradeType":2,"time":"1754487330935"} ], "eventType":"[email protected]@100ms" } }

4. 结论与展望

4.1 实现效果

通过在FMZ平台上实现MEXC的protobuf WebSocket接口,我们获得了以下优势:

  1. 数据传输效率提升:相比JSON格式显著减少带宽占用
  2. 延迟降低:二进制解析速度更快,减少处理时间
  3. 资源利用率优化:更少的CPU和内存占用

4.2 应用场景

该方案特别适用于:

  • 高频交易策略
  • 实时套利系统
  • 市场数据分析
  • 风险监控系统

4.3 未来优化方向

  1. 支持更多数据类型:扩展对更多MEXC数据流的支持

参考资料

  1. MEXC官方API文档
  2. Protocol Buffers官方文档
  3. FMZ量化平台开发指南

本文基于MEXC交易所最新的WebSocket protobuf接口规范编写,代码示例已在FMZ平台测试验证。

Comment
All comments (0)
No data
No data
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)