[TOC]
Dengan pertumbuhan pesat volum dagangan mata wang kripto, kecekapan dan kestabilan dorongan data masa nyata telah menjadi penting. Penyelesaian tolak WebSocket Exchange yang baru dilancarkan oleh MEXC Exchange berdasarkan Penampan Protokol (protobuf) menawarkan kecekapan penghantaran yang lebih tinggi dan kependaman yang lebih rendah daripada format JSON tradisional. Artikel ini memperincikan cara mengakses dan memproses data menggunakan antara muka protobuf WebSocket baharu MEXC pada platform dagangan kuantitatif FMZ.
Penampan Protokol ialah kaedah bebas bahasa dan bebas platform untuk menyusun struktur data yang dibangunkan oleh Google. Berbanding dengan format JSON, protobuf mempunyai kelebihan berikut:
Antara muka tolak protobuf WebSocket yang baru ditambah MEXC terutamanya menyediakan aliran data berikut:
https://www.mexc.com/zh-MY/api-docs/spot-v3/websocket-market-streams
Private PrivateAccountV3Api PrivateDealsV3Api PrivateOrdersV3Api
Public PublicAggreBookTickerV3Api PublicAggreDealsV3Api PublicBookTickerV3Api …
Melaksanakan antara muka WebSocket protobuf MEXC pada platform FMZ memerlukan persediaan berikut:
Untuk menubuhkanPublicAggreDealsV3ApiAmbil sambungan saluran sebagai contoh:
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)
}
}
}
Cari fail .proto yang diperlukan:
https://github.com/mexcdevelop // Anda boleh menemui fail .proto pertukaran di sini
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;
}
Memandangkan platform FMZ adalah berdasarkan JavaScript, kami perlu menggunakan perpustakaan protobuf.js untuk mengendalikan data binari:
Alamat pemuatan perpustakaan JS:
https://cdnjs.cloudflare.com/ajax/libs/protobufjs/7.5.3/protobuf.js
Data yang ditolak oleh antara muka WebSocket ialah data binari dan perlu dinyahkodkan:
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)
}
}

Seperti yang anda lihat, data binari yang ditolak oleh antara muka diterima, dan selepas penyahkodan, data yang boleh dibaca dicetak:
{
"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"
}
}
Dengan melaksanakan antara muka WebSocket protobuf MEXC pada platform FMZ, kami memperoleh kelebihan berikut:
Program ini amat sesuai untuk:
Artikel ini ditulis berdasarkan spesifikasi antara muka protobuf WebSocket terkini bagi pertukaran MEXC. Contoh kod telah diuji dan disahkan pada platform FMZ.