avatar of 发明者量化-小小梦 发明者量化-小小梦
关注 私信
4
关注
1271
关注者

数据流提速攻略:FMZ平台Protobuf技术实践

创建于: 2025-08-08 16:09:52, 更新于: 2025-08-11 11:59:09
comments   0
hits   367

[TOC]

数据流提速攻略:FMZ平台Protobuf技术实践

摘要

随着数字货币交易量的急剧增长,实时数据推送的效率和稳定性变得至关重要。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频道连接为例:

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 文件

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接口推送的数据为二进制数据,需要解码:

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频道数据

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 实盘测试

数据流提速攻略:FMZ平台Protobuf技术实践

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

{
    "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平台测试验证。

相关推荐