resumo
Com o rápido crescimento do volume de negociação de criptomoedas, a eficiência e a estabilidade do envio de dados em tempo real tornaram-se cruciais. A recém-lançada solução de envio WebSocket da MEXC Exchange, baseada em Buffers de Protocolo (protobuf), oferece maior eficiência de transmissão e menor latência do que os formatos JSON tradicionais. Este artigo detalha como acessar e processar dados usando a nova interface WebSocket protobuf da MEXC na plataforma de negociação quantitativa FMZ.
1. Histórico técnico
1.1 Introdução aos Buffers de Protocolo
Protocol Buffers é um método independente de linguagem e plataforma para serializar estruturas de dados desenvolvido pelo Google. Comparado ao formato JSON, o protobuf apresenta as seguintes vantagens:
- Tamanho de dados menor: A codificação binária economiza 30-50% de espaço em comparação ao formato de texto
- Velocidade de análise mais rápida: A análise binária é de 3 a 10 vezes mais rápida que a análise JSON
- Verificação de tipo forte: verificação de tipo em tempo de compilação para reduzir erros de tempo de execução
- Compatibilidade com versões anteriores: Suporta adição e exclusão de campos sem afetar o código existente
1.2 Visão geral da interface MEXC WebSocket
A interface push protobuf WebSocket recém-adicionada do MEXC fornece principalmente os seguintes fluxos de dados:
https://www.mexc.com/zh-MY/api-docs/spot-v3/websocket-market-streams
-
Private
PrivateAccountV3Api
PrivateDealsV3Api
PrivateOrdersV3Api -
Public
PublicAggreBookTickerV3Api
PublicAggreDealsV3Api
PublicBookTickerV3Api
...
2. Solução de integração de plataforma FMZ
2.1 Preparação Ambiental
A implementação da interface MEXC protobuf WebSocket na plataforma FMZ requer os seguintes preparativos:
- Obtenha a chave da API MEXC:Solicite a chave API e a chave secreta no site oficial da MEXC (necessária apenas para interface privada)
- Preparar arquivo de definição protobuf: Obtenha o arquivo .proto fornecido pelo MEXC
2.2 Processo de Estabelecimento de Conexão
Para estabelecerPublicAggreDealsV3ApiTomemos como exemplo a conexão de canais:
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 Análise de dados Protobuf
Encontre o arquivo .proto necessário:
https://github.com/mexcdevelop // Você pode encontrar os arquivos .proto da exchange aqui
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;
}
Como a plataforma FMZ é baseada em JavaScript, precisamos usar a biblioteca protobuf.js para manipular dados binários:
Endereço de carregamento da biblioteca JS:
https://cdnjs.cloudflare.com/ajax/libs/protobufjs/7.5.3/protobuf.js
2.4 Assinatura e processamento de dados
Os dados enviados pela interface WebSocket são dados binários e precisam ser decodificados:
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. Exemplo de implementação específica
3.1 Assine os dados do canal 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 Teste de negociação ao vivo
Como você pode ver, os dados binários enviados pela interface são recebidos e, após a decodificação, os dados legíveis são impressos:
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. Conclusão e Perspectivas
4.1 Efeito de Implementação
Ao implementar a interface protobuf WebSocket do MEXC na plataforma FMZ, obtemos as seguintes vantagens:
- Melhoria na eficiência da transmissão de dados: Reduz significativamente o uso de largura de banda em comparação ao formato JSON
- Latência reduzida: Análise binária mais rápida, reduzindo o tempo de processamento
- Otimização da utilização de recursos: Menos uso de CPU e memória
4.2 Cenários de Aplicação
Este programa é particularmente adequado para:
- Estratégias de negociação de alta frequência
- Sistema de arbitragem em tempo real
- Análise de dados de mercado
- Sistema de Monitoramento de Riscos
4.3 Direções de otimização futuras
- Suporte para mais tipos de dados: Expandir o suporte para mais fluxos de dados MEXC
Referências
- Documentação oficial da API do MEXC
- Documentação oficial do Protocol Buffers
- Guia de Desenvolvimento da Plataforma Quantitativa FMZ
Este artigo foi escrito com base na especificação mais recente da interface protobuf WebSocket da exchange MEXC. Os exemplos de código foram testados e verificados na plataforma FMZ.
- 1

