[TOC]
Avec la croissance rapide du volume des échanges de cryptomonnaies, l’efficacité et la stabilité de la transmission de données en temps réel sont devenues cruciales. La nouvelle solution WebSocket de MEXC Exchange, basée sur les tampons de protocole (protobuf), offre une meilleure efficacité de transmission et une latence plus faible que les formats JSON traditionnels. Cet article explique comment accéder aux données et les traiter grâce à la nouvelle interface WebSocket protobuf de MEXC sur la plateforme de trading quantitatif FMZ.
Protocol Buffers est une méthode de sérialisation des structures de données, indépendante du langage et de la plateforme, développée par Google. Comparé au format JSON, protobuf présente les avantages suivants :
L’interface push protobuf WebSocket nouvellement ajoutée de MEXC fournit principalement les flux de données suivants :
https://www.mexc.com/zh-MY/api-docs/spot-v3/websocket-market-streams
Private PrivateAccountV3Api PrivateDealsV3Api PrivateOrdersV3Api
Public PublicAggreBookTickerV3Api PublicAggreDealsV3Api PublicBookTickerV3Api …
L’implémentation de l’interface WebSocket du protocole MEXC sur la plate-forme FMZ nécessite les préparations suivantes :
Pour établirPublicAggreDealsV3ApiPrenons l’exemple de la connexion des canaux :
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)
}
}
}
Recherchez le fichier .proto requis :
https://github.com/mexcdevelop // Vous pouvez trouver les fichiers .proto de l’échange ici
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;
}
Étant donné que la plateforme FMZ est basée sur JavaScript, nous devons utiliser la bibliothèque protobuf.js pour gérer les données binaires :
Adresse de chargement de la bibliothèque JS :
https://cdnjs.cloudflare.com/ajax/libs/protobufjs/7.5.3/protobuf.js
Les données poussées par l’interface WebSocket sont des données binaires et doivent être décodées :
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)
}
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)
}
}

Comme vous pouvez le voir, les données binaires poussées par l’interface sont reçues et, après décodage, les données lisibles sont imprimées :
{
"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"
}
}
En implémentant l’interface WebSocket protobuf de MEXC sur la plateforme FMZ, nous obtenons les avantages suivants :
Ce programme est particulièrement adapté pour :
Cet article s’appuie sur la dernière spécification de l’interface WebSocket protobuf de la plateforme d’échange MEXC. Les exemples de code ont été testés et vérifiés sur la plateforme FMZ.