English Русский 中文 Español Deutsch 日本語
preview
Integrando Discord com MetaTrader 5: Construindo um Bot de Trading com Notificações em Tempo Real

Integrando Discord com MetaTrader 5: Construindo um Bot de Trading com Notificações em Tempo Real

MetaTrader 5Integração |
191 0
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

Introdução

A capacidade de monitorar e controlar remotamente atividades de negociação tornou-se mais importante no acelerado mercado financeiro atual. Uma das soluções possíveis para implementar esse recurso de monitoramento remoto é integrar notificações do Discord ao MetaTrader 5. Ao receber alertas diretamente no seu Discord, você pode acompanhar suas atividades em tempo real de qualquer lugar. Neste artigo, utilizamos um exemplo real de um robô de negociação aleatória para ilustrar ideias e etapas de implementação. Assim, estabeleceremos uma comunicação confiável entre o MetaTrader 5 e a plataforma Discord, através da qual você poderá receber notificações em tempo real sobre execuções de trades, mudanças de mercado e outros alertas.

Neste artigo, veremos quais configurações você precisa fazer no lado da plataforma para habilitar esse tipo de integração. Em particular, veremos as configurações de WebRequest, que permitem conectar a plataforma com outros recursos, como Discord e outros mensageiros instantâneos. Também veremos como configurar seu servidor Discord para conseguir receber notificações do MetaTrader 5.

O material abordado neste artigo exige algum conhecimento prévio de programação MQL5 e bom entendimento de como a plataforma opera.


Configuração do Discord e MetaTrader 5

Você precisa adicionar esses dois https e verificar se a URL especificada permite WebRequests:

Permitir WebRequests


Além de criar e copiar um webhook, você também precisa configurar um servidor (ou utilizar um que você já tenha no Discord).


Exemplo de código EA

No Expert Advisor, não se esqueça de colar o link do WebHook.

#include <Trade/Trade.mqh>

CTrade trade;
// Discord webhook URL - Replace with your webhook URL
string discord_webhook = "https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXXXXXXXX";

// Strategy Parameters

*** Eu não sei por quê, mas o webhook precisa ser alterado de discordapp.com para discord.com.

Aqui está como configuramos as definições básicas do Discord do nosso Expert Advisor MetaTrader 5:

string discord_webhook = "https://discord.com/api/webhooks/your-webhook-url";

input group "Discord Settings"
input string DiscordBotName = "MT5 Trading Bot";    
input color MessageColor = clrBlue;                 
input bool SendPriceUpdates = true;

O link mais importante entre o Discord e o seu Expert Advisor MetaTrader 5 é o URL do webhook. Além disso, incluímos entradas que os usuários podem personalizar para alterar a aparência e o comportamento do bot. Essas opções oferecem flexibilidade à integração, permitindo que os traders modifiquem o sistema para atender às suas próprias necessidades.

Um passo crucial para garantir uma conexão confiável entre o MetaTrader 5 e o Discord é o processo de ativação. Nesta etapa, devemos confirmar que o webhook do Discord está funcionando corretamente e que o Expert Advisor possui a autorização necessária para enviar solicitações web. Vários testes importantes fazem parte desse processo de verificação:

int OnInit() {
    Print("Initialization step 1: Checking WebRequest permissions...");
    
    if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) {
        Print("Error: WebRequest is not allowed. Please allow in Tool -> Options -> Expert Advisors");
        return INIT_FAILED;
    }
    
    string test_message = "{\"content\":\"Test message from MT5\"}";
    string headers = "Content-Type: application/json\r\n";
    char data[], result[];
    ArrayResize(data, StringToCharArray(test_message, data, 0, WHOLE_ARRAY, CP_UTF8) - 1);
    
    int res = WebRequest(
        "POST",
        discord_webhook,
        headers,
        5000,
        data,
        result,
        headers
    );
    
    if(res == -1) {
        Print("Make sure these URLs are allowed: https://discord.com/*, https://discordapp.com/*");
        return INIT_FAILED;
    }
    
    return(INIT_SUCCEEDED);
}

Para tornar os alertas do Discord informativos e esteticamente agradáveis, a formatação das mensagens é essencial. Como o Discord oferece suporte à formatação markdown, podemos organizar nossas mensagens para destacar informações importantes. Implementamos um método completo para formatar dados de negociação que torna simples compreender rapidamente os detalhes de cada operação:

string FormatTradeMessage(TradeInfo& tradeInfo) {
    string message = "**New " + tradeInfo.type + " Signal Alert!**\n";
    message += "Symbol: " + tradeInfo.symbol + "\n";
    message += "Type: " + tradeInfo.type + "\n";
    message += "Price: " + DoubleToString(tradeInfo.price, _Digits) + "\n";
    message += "Lots: " + DoubleToString(tradeInfo.lots, 2) + "\n";
    message += "Stop Loss: " + DoubleToString(tradeInfo.sl, _Digits) + "\n";
    message += "Take Profit: " + DoubleToString(tradeInfo.tp, _Digits) + "\n";
    message += "Time: " + TimeToString(TimeCurrent());
    return message;
}

O tratamento correto de caracteres especiais é crucial ao trabalhar com dados JSON no MetaTrader 5, a fim de evitar strings JSON incorretas que possam resultar em falha no envio de mensagens. Um método robusto de escape JSON capaz de lidar com todos os caracteres especiais comuns faz parte da nossa implementação:

string EscapeJSON(string text) {
    string escaped = text;
    StringReplace(escaped, "\\", "\\\\");
    StringReplace(escaped, "\"", "\\\"");
    StringReplace(escaped, "\n", "\\n");
    StringReplace(escaped, "\r", "\\r");
    StringReplace(escaped, "\t", "\\t");
    return escaped;
}

A função SendDiscordMessage lida com o envio confiável de mensagens do MetaTrader 5 para o Discord através da API de webhook do Discord. No núcleo, essa função recebe uma string de mensagem e um indicador opcional de erro como parâmetros, transformando-os em uma solicitação HTTP formatada corretamente para que os servidores do Discord possam entender e processar.

A função começa com uma verificação de segurança, verificando se as solicitações web estão habilitadas através do sinalizador isWebRequestEnabled. Essa etapa de verificação impede qualquer tentativa de comunicação quando a plataforma MetaTrader 5 não possui as permissões necessárias, evitando travamentos ou falhas do sistema. Se as solicitações web não estiverem habilitadas, a função retorna imediatamente false, indicando que a mensagem não pôde ser enviada.

Ao construir a mensagem, a função utiliza marcadores visuais para melhorar a legibilidade. Ela adiciona um emoji de X vermelho (❌) para mensagens de erro ou um emoji de marca de verificação verde (✅) para operações bem-sucedidas. Essas pistas visuais permitem que os traders compreendam rapidamente a natureza das notificações com apenas um olhar dentro do canal Discord.

A mensagem é então encapsulada em um payload JSON, que é o formato esperado pela API do Discord. A função EscapeJSON (chamada durante a construção do payload) desempenha um papel fundamental ao garantir que caracteres especiais na mensagem não quebrem a estrutura JSON. Isso inclui o tratamento de aspas, quebras de linha e outros caracteres especiais que poderiam causar erros de análise.

A função configura os cabeçalhos HTTP adequados, especificando que o tipo de conteúdo é JSON. Essa informação de cabeçalho é crucial, pois informa aos servidores do Discord como interpretar os dados recebidos. O cabeçalho Content-Type é definido como "application/json", o que é padrão para comunicações REST API.

Um dos aspectos mais técnicos envolve a conversão do payload de string para um array de caracteres. Essa conversão é necessária porque a função WebRequest do MetaTrader 5 espera dados binários em vez de strings simples. A função ArrayResize garante que o array de caracteres tenha o tamanho adequado para armazenar a mensagem convertida, considerando a codificação UTF-8, essencial para lidar corretamente com caracteres especiais e emojis.

A comunicação real ocorre através da chamada da função WebRequest, que envia uma solicitação POST para o URL do webhook do Discord. A função inclui vários parâmetros importantes:

  • Um valor de timeout de 5000 milissegundos (5 segundos) para evitar travamentos caso os servidores do Discord estejam lentos para responder
  • Os cabeçalhos e dados preparados anteriormente
  • Arrays para armazenar os dados e cabeçalhos de resposta

A função monitora o sucesso do envio da mensagem através dos códigos de resposta HTTP. Um código 200 ou 204 indica entrega bem-sucedida (200 significa sucesso com conteúdo retornado, 204 significa sucesso sem conteúdo). Quando o sucesso é detectado, a função atualiza o timestamp lastMessageTime, que pode ser utilizado para fins de controle de taxa, e retorna true para indicar envio bem-sucedido.

Nos casos em que a mensagem falha ao ser enviada (indicada por qualquer código diferente de 200 ou 204), a função retorna false, permitindo que o código chamador trate o erro de forma adequada. Esse mecanismo de tratamento de erros permite a implementação de lógica de repetição ou métodos alternativos de notificação quando a comunicação com o Discord falha.

Esta implementação cria um canal de comunicação robusto e confiável entre MetaTrader 5 e Discord, lidando com todas as complexidades de comunicação entre plataformas enquanto fornece feedback claro de sucesso/erro ao código chamador. A atenção ao tratamento adequado de erros, codificação de caracteres e conformidade com API torna essa função um componente central confiável do sistema de integração com Discord.

bool SendDiscordMessage(string message, bool isError = false) {
    if(!isWebRequestEnabled) return false;
    
    message = (isError ? "❌ " : "✅ ") + message;
    string payload = "{\"content\":\"" + EscapeJSON(message) + "\"}";
    string headers = "Content-Type: application/json\r\n";
    
    char post[], result[];
    ArrayResize(post, StringToCharArray(payload, post, 0, WHOLE_ARRAY, CP_UTF8) - 1);
    
    int res = WebRequest(
        "POST",
        discord_webhook,
        headers,
        5000,
        post,
        result,
        headers
    );
    
    if(res == 200 || res == 204) {
        lastMessageTime = TimeCurrent();
        return true;
    }
    
    return false;
}

Implementamos nossa integração com Discord colocando em prática um método básico de negociação aleatória. Essa tática demonstra como combinar logicamente operações de trade com alertas no Discord, mesmo que seu propósito principal seja educacional:

void PlaceRandomTrade() {
    bool isBuy = (MathRand() % 2) == 1;
    
    double price = isBuy ? SymbolInfoDouble(_Symbol, SYMBOL_ASK) 
                        : SymbolInfoDouble(_Symbol, SYMBOL_BID);
    
    int slPoints = 50 + (MathRand() % 100);
    int tpPoints = 50 + (MathRand() % 100);
    
    double sl = isBuy ? price - slPoints * _Point : price + slPoints * _Point;
    double tp = isBuy ? price + tpPoints * _Point : price - tpPoints * _Point;
    
    TradeInfo tradeInfo;
    tradeInfo.symbol = _Symbol;
    tradeInfo.type = isBuy ? "BUY" : "SELL";
    tradeInfo.price = price;
    tradeInfo.lots = LotSize;
    tradeInfo.sl = sl;
    tradeInfo.tp = tp;
    
    string message = FormatTradeMessage(tradeInfo);
    if(SendDiscordMessage(message)) {
        trade.SetExpertMagicNumber(magicNumber);
        
        bool success = isBuy ? 
            trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LotSize, price, sl, tp, "Random Strategy Trade") :
            trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, LotSize, price, sl, tp, "Random Strategy Trade");
            
        if(success) {
            SendDiscordMessage("✅ Trade executed successfully! Ticket: " + IntegerToString(trade.ResultOrder()));
        }
    }
}

Para traders que desejam acompanhar os movimentos de preço sem monitorar continuamente sua plataforma de negociação, atualizações regulares do mercado podem ser bastante úteis. Implementamos um recurso de atualização de preços que informa o Discord regularmente:

void SendPriceUpdate() {
    if(!SendPriceUpdates) return;
    if(TimeCurrent() - lastMessageTime < 300) return;
    
    string message = "```\n";
    message += "Price Update for " + _Symbol + "\n";
    message += "Bid: " + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits) + "\n";
    message += "Ask: " + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits) + "\n";
    message += "Spread: " + DoubleToString(SymbolInfoInteger(_Symbol, SYMBOL_SPREAD), 0) + " points\n";
    message += "```";
    
    SendDiscordMessage(message);
}

Quando o Expert Advisor é encerrado, a implementação contém os seguintes procedimentos de limpeza apropriados:

void OnDeinit(const int reason) {
    SendDiscordMessage("```\nEA stopped. Reason code: " + 
                      IntegerToString(reason) + "```");
}


Resultado de Exemplo

Com este exemplo de integração, você deverá observar o seguinte:


Segurança e Gerenciamento de Webhook

Vários fatores cruciais precisam ser levados em consideração ao integrar o Discord em um ambiente de produção. A segurança vem primeiro. Como qualquer pessoa com acesso ao URL do webhook pode enviar mensagens para o seu canal do Discord, ele deve ser tratado como um dado sensível. Para proteger o URL do webhook, recomenda-se empregar técnicas de criptografia ou colocá-lo em um arquivo de configuração seguro.

Outro fator importante a ser considerado é a confiabilidade da rede. A API do Discord pode ocasionalmente enfrentar interrupções ou limitações de taxa, e conexões de internet podem ser instáveis. Para lidar com essas circunstâncias de forma eficiente, sua solução deve incluir um tratamento de erros robusto e recursos de repetição. Isso pode envolver manter uma fila de mensagens para tentar novamente envios malsucedidos e implementar uma técnica de exponential backoff para mensagens que falham repetidamente.


Considerações de Desempenho

A otimização de desempenho também é crucial, especialmente para sistemas de negociação de alta frequência. Alertas no Discord são úteis, mas não devem afetar o funcionamento da lógica principal de negociação. Para gerenciar as interações com o Discord sem interferir nas atividades primárias do trading, considere implementar uma thread separada ou utilizar enfileiramento assíncrono de mensagens.

Existem vários métodos para expandir as capacidades da integração com Discord. Por exemplo, você pode querer incluir recursos como indicadores de desempenho em tempo real, como estatísticas de negociação e cálculos de lucro/prejuízo. Alertas de gerenciamento de risco que informam quando determinados níveis de exposição são atingidos. A análise de mercado é atualizada de acordo com os indicadores do seu plano de negociação. Você também deve monitorar a saúde do sistema, incluindo taxas de erro e comandos personalizados baseados no Discord que permitem alterar parâmetros ou verificar o status do seu sistema de negociação.

Para colocar essas adições em prática, você precisará considerar cuidadosamente como organizar adequadamente os diferentes tipos de informações e como estruturar suas mensagens. É possível usar o estilo markdown do Discord para produzir mensagens visualmente distintas para vários tipos de notificação, o que facilita a identificação rápida de informações essenciais.

De qualquer forma, é sempre bom encontrar um equilíbrio entre oferecer informações úteis e evitar excesso de informações ao adicionar novos recursos. Pense nas notificações mais importantes. Você pode querer desabilitar determinados tipos de alertas ou utilizar URLs de webhook distintos para diferentes categorias de mensagens.


Casos de Uso Práticos

A seguir estão alguns possíveis usos reais para essa integração com Discord:

  • Gerenciamento de Portfólio: Acompanhar diversas estratégias de negociação em diferentes contas
  • Gestão de Risco: Ser alertado imediatamente quando seus níveis predefinidos forem ultrapassados
  • Obter atualizações frequentes sobre o desempenho da estratégia e condições de mercado
  • Compartilhar análises de mercado e sinais de negociação com uma equipe de trading

A abordagem que discutimos oferece uma base sólida para essas aplicações, além de ser adaptável o suficiente para atender a requisitos específicos. Compreender os aspectos técnicos da integração, bem como as necessidades reais dos traders que utilizarão o sistema, é essencial para uma implementação eficaz.

Manter o funcionamento confiável da integração com Discord requer testes e monitoramento periódicos. Isso envolve acompanhar taxas de entrega de mensagens, rastrear falhas de comunicação e garantir que todos os alertas importantes sejam enviados pontualmente. Considere implementar sistemas de registro (logging) que armazenem todas as interações com o Discord e quaisquer erros que ocorram, permitindo localizar e corrigir rapidamente eventuais problemas.

Sua criatividade e suas necessidades operacionais são os únicos limites para as inúmeras possibilidades de expansão e melhoria dessa integração. Você pode construir um sistema de comunicação sólido que melhora suas operações de trading e permite manter-se informado sobre suas atividades de qualquer lugar do mundo, começando por essa base estável e adicionando recursos gradualmente conforme o uso real e os resultados indicarem melhorias.


Monitoramento e Manutenção

Lembre-se de que ter os recursos e conhecimentos adequados é tão importante para o trading quanto ter boas estratégias. Essa integração com Discord é uma ferramenta essencial para traders modernos, pois estabelece uma conexão direta entre o sistema automatizado de negociação e a capacidade de monitorar e reagir às condições do mercado instantaneamente.


Conclusão

Em conclusão, a integração do Discord com o MetaTrader 5 é uma solução útil que oferece aos traders uma forma de acompanhar e reagir às condições do mercado. As vantagens de notificações em tempo real, comunicação em equipe e monitoramento remoto tornam essa integração muito útil e conveniente. No entanto, você precisará de tempo e conhecimento para implementá-la. Além disso, é necessário ter muita atenção quanto à segurança, confiabilidade da rede e otimização de desempenho. A possibilidade de desenvolvimento de recursos adicionais, como notificações por canal de voz, instruções interativas e filtragem de alertas baseada em aprendizado de máquina, amplia ainda mais o potencial de eficiência operacional à medida que ambas as plataformas evoluem. Independentemente de onde estejam, os traders podem manter maior controle sobre suas operações e garantir que nunca percam movimentos importantes do mercado ou sinais de negociação ao criar essa conexão fundamental entre sistemas automatizados de trading e comunicação em tempo real.


Arquivo Salvar Caminho
Discord_examples.mq5 Salve-o na seguinte pasta: MQL5/Experts/

Atenciosamente, Javier S. Gastón de Iriarte Cabrera

Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/16682

Arquivos anexados |
Discord_example.mq5 (20.38 KB)
Classes de tabela e cabeçalho baseadas no modelo de tabela em MQL5: Aplicação do conceito MVC Classes de tabela e cabeçalho baseadas no modelo de tabela em MQL5: Aplicação do conceito MVC
Esta é a segunda parte do artigo dedicada à implementação de um modelo de tabela em MQL5, utilizando o paradigma arquitetural MVC (Model-View-Controller). O artigo aborda o desenvolvimento das classes da tabela e de seu cabeçalho, com base no modelo de tabela criado anteriormente. As classes desenvolvidas servirão como base para a futura implementação dos componentes de visualização (View) e controle (Controller), que serão abordados nos próximos artigos.
Como construir e otimizar um sistema de trading baseado em volume (Chaikin Money Flow - CMF) Como construir e otimizar um sistema de trading baseado em volume (Chaikin Money Flow - CMF)
Neste artigo, forneceremos um indicador baseado em volume, o Chaikin Money Flow (CMF), após identificar como ele pode ser construído, calculado e utilizado. Vamos compreender como construir um indicador personalizado. Compartilharemos algumas estratégias simples que podem ser usadas e, em seguida, as testaremos para entender qual delas é melhor.
Do básico ao intermediário: Sobrecarga de operadores (I) Do básico ao intermediário: Sobrecarga de operadores (I)
Neste artigo começaremos a ver como seria a implementação da chamada sobrecarga de operadores. Iremos começar vendo a motivação por detrás de tal implementação. Assim como também veremos que nem sempre as coisas são tão complicadas como parecem.
Implementação do modelo de tabela em MQL5: Aplicação do conto MVC Implementação do modelo de tabela em MQL5: Aplicação do conto MVC
Neste artigo, analisaremos o desenvolvimento do modelo de tabela na linguagem MQL5, usando o conceito arquitetônico MVC (Model-View-Controller), que separa a lógica dos dados, a apresentação e o controle, o que ajuda a criar um código estruturado, flexível e escalável. Examinaremos a implementação das classes para construir o modelo de tabela, incluindo o uso de listas ligadas para armazenar dados.