краткое содержание
В условиях быстрого роста объёма торговли криптовалютами эффективность и стабильность передачи данных в режиме реального времени стали критически важными. Недавно запущенное биржей 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 требует следующей подготовки:
- Получить API-ключ MEXC:Подайте заявку на получение API-ключа и секретного ключа на официальном сайте MEXC (требуется только для закрытого интерфейса)
- Подготовить файл определения protobuf: Получите файл .proto, предоставленный MEXC
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 Тест реальной торговли
Как вы можете видеть, двоичные данные, переданные интерфейсом, принимаются, и после декодирования выводятся на печать читаемые данные:
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 Эффект реализации
Реализуя интерфейс Protobuf WebSocket от MEXC на платформе FMZ, мы получаем следующие преимущества:
- Повышение эффективности передачи данных: Значительно снижает использование полосы пропускания по сравнению с форматом JSON
- Уменьшенная задержка: Более быстрый двоичный анализ, сокращающий время обработки
- Оптимизация использования ресурсов: Меньше использования ЦП и памяти
4.2 Сценарии применения
Эта программа особенно подходит для:
- Стратегии высокочастотной торговли
- Система арбитража в реальном времени
- Анализ рыночных данных
- Система мониторинга рисков
4.3 Направления будущей оптимизации
- Поддержка большего количества типов данных: Расширение поддержки большего количества потоков данных MEXC
Справочная информация
- Официальная документация API MEXC
- Официальная документация Protocol Buffers
- Руководство по разработке количественной платформы FMZ
Статья написана на основе последней спецификации интерфейса WebSocket Protobuf биржи MEXC. Примеры кода протестированы и проверены на платформе FMZ.
- 1

