avatar of 发明者量化-小小梦 发明者量化-小小梦
focar em Mensagem privada
4
focar em
1271
Seguidores

Estratégia de Aceleração do Fluxo de Dados: Prática da Tecnologia Protobuf na Plataforma FMZ

Criado em: 2025-08-08 16:09:52, atualizado em: 2025-08-11 11:59:09
comments   0
hits   368

[TOC]

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:

  1. 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)
  2. 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:

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

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:

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

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

Estratégia de Aceleração do Fluxo de Dados: Prática da Tecnologia Protobuf na Plataforma FMZ

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:

{
    "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:

  1. Melhoria na eficiência da transmissão de dados: Reduz significativamente o uso de largura de banda em comparação ao formato JSON
  2. Latência reduzida: Análise binária mais rápida, reduzindo o tempo de processamento
  3. 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

  1. Suporte para mais tipos de dados: Expandir o suporte para mais fluxos de dados MEXC

Referências

  1. Documentação oficial da API do MEXC
  2. Documentação oficial do Protocol Buffers
  3. 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.