4
Подписаться
1271
Подписчики

Стратегия ускорения потока данных: применение технологии Protobuf на платформе FMZ

Создано: 2025-08-08 16:09:52, Обновлено: 2025-08-11 11:59:09
comments   0
hits   368

[TOC]

краткое содержание

В условиях быстрого роста объёма торговли криптовалютами эффективность и стабильность передачи данных в режиме реального времени стали критически важными. Недавно запущенное биржей MEXC решение WebSocket Push на основе Protocol Buffers (protobuf) обеспечивает более высокую эффективность передачи и меньшую задержку по сравнению с традиционными форматами JSON. В этой статье подробно описывается, как получать доступ к данным и обрабатывать их с помощью нового интерфейса WebSocket protobuf от MEXC на платформе количественной торговли FMZ.

1. Техническая информация

1.1 Введение в буферы протоколов

Protocol Buffers — это независимый от языка и платформы метод сериализации структур данных, разработанный Google. По сравнению с форматом JSON, protobuf обладает следующими преимуществами:

  • Меньший размер данных: Двоичное кодирование экономит 30–50 % места по сравнению с текстовым форматом.
  • Более высокая скорость анализа: Двоичный парсинг в 3–10 раз быстрее парсинга JSON
  • Строгая проверка типов: проверка типов во время компиляции для уменьшения ошибок во время выполнения
  • Обратная совместимость: Поддерживает добавление и удаление полей без изменения существующего кода.

1.2 Обзор интерфейса MEXC WebSocket

Недавно добавленный интерфейс WebSocket protobuf push MEXC в основном обеспечивает следующие потоки данных:

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 Подготовка окружающей среды

Реализация интерфейса MEXC protobuf WebSocket на платформе FMZ требует следующей подготовки:

  1. Получить API-ключ MEXC:Подайте заявку на получение API-ключа и секретного ключа на официальном сайте MEXC (требуется только для закрытого интерфейса)
  2. Подготовить файл определения protobuf: Получите файл .proto, предоставленный MEXC

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 Тест реальной торговли

Стратегия ускорения потока данных: применение технологии Protobuf на платформе FMZ

Как вы можете видеть, двоичные данные, переданные интерфейсом, принимаются, и после декодирования выводятся на печать читаемые данные:

{
    "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 Эффект реализации

Реализуя интерфейс Protobuf WebSocket от MEXC на платформе FMZ, мы получаем следующие преимущества:

  1. Повышение эффективности передачи данных: Значительно снижает использование полосы пропускания по сравнению с форматом JSON
  2. Уменьшенная задержка: Более быстрый двоичный анализ, сокращающий время обработки
  3. Оптимизация использования ресурсов: Меньше использования ЦП и памяти

4.2 Сценарии применения

Эта программа особенно подходит для:

  • Стратегии высокочастотной торговли
  • Система арбитража в реальном времени
  • Анализ рыночных данных
  • Система мониторинга рисков

4.3 Направления будущей оптимизации

  1. Поддержка большего количества типов данных: Расширение поддержки большего количества потоков данных MEXC

Справочная информация

  1. Официальная документация API MEXC
  2. Официальная документация Protocol Buffers
  3. Руководство по разработке количественной платформы FMZ

Статья написана на основе последней спецификации интерфейса WebSocket Protobuf биржи MEXC. Примеры кода протестированы и проверены на платформе FMZ.