English Русский 中文 Español Deutsch 日本語
preview
Criando um Painel Administrativo de Negociação em MQL5 (Parte II): Aprimorando a Responsividade e Mensagens Rápidas

Criando um Painel Administrativo de Negociação em MQL5 (Parte II): Aprimorando a Responsividade e Mensagens Rápidas

MetaTrader 5Exemplos |
211 2
Clemence Benjamin
Clemence Benjamin

Conteúdo:

  1. Introdução
  2. Implementação em MQL5
  3. Conclusão



Introdução

Imagine perder um sinal de mercado crucial devido a uma mensagem atrasada — um obstáculo comum que custa aos traders oportunidades valiosas e lucros no ambiente dinâmico de negociações. Nesse contexto, os insights do administrador são tão vitais quanto os próprios sinais de mercado. Embora os sistemas algorítmicos sejam rápidos e “emocionalmente inteligentes”, eles não podem substituir a supervisão atenta de traders habilidosos, que monitoram continuamente o desempenho do sistema e tomam decisões críticas.


Pense sobre isso.

Comparando mensagem por clique e mensagem digitada.


Limitações do Painel Administrativo atual

Na imagem acima, há um problema: ao tentar arrastar o painel, o gráfico se move em vez disso, e o botão minimizar não responde.

À medida que a negociação algorítmica domina os mercados financeiros, a comunicação eficiente entre os usuários dos sistemas de negociação (Traders) e os administradores humanos (quem está por trás do sistema) tornou-se imprescindível. Anteriormente, criamos interfaces de mensagens no Painel Administrativo que apresentavam responsividade limitada para tarefas em tempo real, como mensagens rápidas e clicar e arrastar o próprio painel, criando um desafio significativo para administradores que precisam reagir rapidamente.

Melhorias para o Painel Administrativo atual:

Painel Administrativo: Melhorias focadas no Painel Administrativo anterior


Este artigo tem como objetivo romper essas barreiras de comunicação, introduzindo responsividade na Interface de Mensagens do Administrador usando MQL5. Além disso, destaca a importância das mensagens rápidas para apoiar decisões ágeis de negociação e eficiência operacional.

Nesta discussão, exploraremos como o MQL5 pode ser utilizado para melhorar a responsividade das mensagens dentro das plataformas de negociação. Vamos guiá-lo pelas principais etapas de implementação, ajudando a desenvolver uma compreensão mais aprofundada das possibilidades oferecidas pela programação MQL5. Juntos, criaremos uma interface de mensagens mais eficaz que atenda às demandas da negociação moderna.

Para acompanhar esta discussão do início ao fim, abordarei as seguintes perguntas:

  1. O que é responsividade em GUI?
  2. O que são mensagens rápidas?

Responsividade:

No MQL5, responsividade na GUI (Interface Gráfica do Usuário) refere-se a quão rapidamente e suavemente a interface reage às interações do usuário, como clicar em botões, mover controles deslizantes ou redimensionar painéis. Uma GUI responsiva fornece feedback imediato ao usuário, garantindo que a interface seja intuitiva e fácil de usar. Isso é especialmente importante em aplicativos de negociação, onde ações oportunas podem ser cruciais.

Alcançar a responsividade muitas vezes envolve otimizar o código para reduzir o tempo de execução de funções relacionadas à GUI, minimizar o número de objetos desenhados no gráfico e utilizar processamento assíncrono sempre que possível. Isso garante que a thread principal permaneça responsiva à entrada do usuário, proporcionando uma experiência fluida durante atividades críticas de negociação.

Vou detalhar os principais aspectos da responsividade em uma GUI MQL5: 

  • Feedback Imediato: A interface deve responder instantaneamente às ações do usuário, como clicar em botões ou digitar texto. Não deve haver atraso perceptível entre a ação do usuário e a resposta do sistema.

  • Desempenho Suave: Mesmo com múltiplos elementos de GUI e lógica complexa, a interface deve funcionar suavemente, sem travamentos ou congelamentos. Isso envolve práticas de codificação eficientes para minimizar a carga no processador e garantir execução rápida dos comandos do usuário.

  • Atualizações Dinâmicas: A GUI deve ser capaz de atualizar elementos dinamicamente sem exigir uma nova renderização completa da interface. Por exemplo, se um novo nível de preço for atingido, os elementos correspondentes (como rótulos ou linhas) devem ser atualizados suavemente, sem tremulação.

  • Escalabilidade: A interface deve lidar bem com alterações de tamanho ou resolução. Por exemplo, se o usuário redimensionar um painel, o conteúdo deve se ajustar automaticamente e manter a usabilidade.

  • Tratamento de Erros: A GUI deve gerenciar erros de forma adequada, fornecendo feedback claro e imediato ao usuário caso algo dê errado, sem travar ou ficar sem resposta.

Mensagens Rápidas:

Referem-se a mensagens pré-definidas e comumente usadas que podem ser enviadas com apenas um clique ou interação mínima. Essas mensagens são normalmente configuradas previamente para atender às necessidades frequentes de comunicação, permitindo que os usuários respondam ou enviem mensagens padronizadas rapidamente, sem precisar digitar manualmente.

Casos de Uso para Mensagens Rápidas

  • Respostas Padrão: Mensagens rápidas podem ser usadas para respostas ou comandos padrão, como confirmar um sinal de negociação, reconhecer uma ação ou notificar a equipe sobre um evento específico.
  • Notificações de Erro: Se ocorrer um erro na negociação, uma mensagem curta como “Sinal inválido” ou “Erro detectado” pode ser enviada imediatamente.
  • Comandos de Rotina: Mensagens rápidas podem incluir comandos ou instruções de rotina frequentemente usadas em operações de negociação, como “Fechar todas as posições” ou “Ativar EA”.

Exemplo:

Suponha que você tenha um Painel Administrativo em MQL5 com várias Mensagens Rápidas para um sistema de negociação automatizado. Elas podem incluir:

  • Iniciar monitoramento: Uma mensagem curta para começar a monitorar as condições do mercado.
  • Parar monitoramento: Uma mensagem curta para interromper o monitoramento.
  • Sinal inválido: Uma mensagem para notificar o usuário de que um sinal de negociação inválido foi detectado.

Cada uma dessas pode estar atrelada a um botão no painel. Ao clicar no botão, a mensagem pré-definida é enviada instantaneamente, economizando tempo e garantindo comunicação consistente.


Implementação em MQL5

No MQL5, Mensagens Rápidas podem ser implementadas em um Painel de Mensagens criando botões ou menus suspensos vinculados a strings de texto pré-definidas. Quando o usuário clica em um desses botões, a mensagem correspondente é enviada automaticamente pelo canal de comunicação desejado, como Telegram, e-mail ou outra API de mensagens. Algumas desvantagens óbvias visíveis na imagem animada de introdução mostrando nosso painel cobrindo parte do gráfico podem ser incômodas quando queremos ter uma visão mais ampla para analisar o gráfico. Para conquistar este segmento, dividirei em duas partes:

  1.  Posicionar logicamente os botões de controle do painel.
  2.  Codificar nossos botões de mensagens rápidas usando a função repeat.

Presumo que você tenha lido Parte I e tenha compreendido de onde viemos e para onde estamos indo.

1. Posicionar logicamente os botões de controle do painel.

Os botões de fechar, minimizar e maximizar.

Botões Minimizar, Maximizar e Fechar

  • Declaração dos Botões:

Aqui, mostramos como declaramos os botões antes de prosseguir:

///Global variables
CButton minimizeButton;
CButton maximizeButton;
CButton closeButton;
  • Botão Minimizar:

Para o botão de minimizar, criamos ele usando a classe CButton, posicionando-o em (375, -22) no gráfico com um tamanho de (30, 22) pixels. O botão exibe um sublinhado _, símbolo comum para minimizar janelas. Nós o adicionamos ao Painel Administrativo usando "adminPanel. Add(minimizeButton)". A finalidade desse botão é permitir que os usuários ocultem temporariamente o Painel Administrativo da tela sem fechá-lo completamente. Na função "OnMinimizeButtonClick()", programamos o botão para ocultar o Painel Administrativo e exibir apenas os botões de minimizar, maximizar e fechar. Isso simula a minimização da janela enquanto mantém os controles essenciais disponíveis.

// Create the minimize button
if (!minimizeButton.Create(chart_id, "MinimizeButton", 0, 375, -22, 405, 0))
{
    Print("Failed to create minimize button");
    return INIT_FAILED;
}
minimizeButton.Text("_");
adminPanel.Add(minimizeButton);

// Function to handle minimize button click
void OnMinimizeButtonClick()
{
    minimized = true;

    // Hide the full admin panel
    adminPanel.Hide();
    minimizeButton.Show();
    maximizeButton.Show();
    closeButton.Show();
}
  • Botão Maximizar:

Para o botão de maximizar, usamos a mesma classe CButton e o posicionamos ao lado do botão de minimizar em (405, -22). O botão exibe [ ], símbolo comum para maximizar ou restaurar janelas, e o adicionamos ao Painel Administrativo usando "adminPanel. Add(maximizeButton)". Esse botão permite aos usuários restaurar o Painel Administrativo para o tamanho original após ele ter sido minimizado. Na função "OnMaximizeButtonClick()", ao clicar nesse botão, o Painel Administrativo volta ao tamanho original e oculta os botões de minimizar, maximizar e fechar. Isso imita o comportamento de maximizar uma janela minimizada.

// Create the maximize button
if (!maximizeButton.Create(chart_id, "MaximizeButton", 0, 405, -22, 435, 0))
{
    Print("Failed to create maximize button");
    return INIT_FAILED;
}
maximizeButton.Text("[ ]");
adminPanel.Add(maximizeButton);

// Function to handle maximize button click
void OnMaximizeButtonClick()
{
    if (minimized)
    {
        minimizeButton.Hide();
        maximizeButton.Hide();
        closeButton.Hide();
        adminPanel.Show();
    }
}

  • Botão de fechar:

Para o botão de fechar, nós o criamos da mesma forma que os outros dois botões, posicionando-o em (435, -22) e exibindo um X, um símbolo universal para fechar janelas. Adicionamos este botão ao Painel de Administração usando "adminPanelAdd(closeButton)". Este botão permite que os usuários removam completamente o Expert Advisor (EA) do gráfico chamando "ExpertRemove()" na função "OnCloseButtonClick()"". Ele fornece uma maneira simples de fechar o Painel de Administração e parar o EA quando o usuário terminar de usar o painel.

// Create the close button
if (!closeButton.Create(chart_id, "CloseButton", 0, 435, -22, 465, 0))
{
    Print("Failed to create close button");
    return INIT_FAILED;
}
closeButton.Text("X");
adminPanel.Add(closeButton);

// Function to handle close button click
void OnCloseButtonClick()
{
    ExpertRemove(); // Completely remove the EA
    Print("Admin Panel closed.");
}
2. Programando nossos botões de mensagens rápidas usando a função de repetição (loop)

Botões de Mensagens Rápidas.

Interface de múltiplos Botões de Mensagens Rápidas

Entradas para Mensagens Rápidas:

  •  Usamos variáveis de entrada (QuickMessage1 a QuickMessage8) para tornar as mensagens personalizáveis. Essas entradas permitem que os usuários modifiquem o texto de cada mensagem rápida diretamente nas configurações do Expert Advisor, sem alterar o código principal. Essa flexibilidade facilita a adaptação das mensagens a diferentes cenários de negociação ou preferências dos usuários. Além disso, a colocação dos botões é dinâmica, o que significa que você pode ajustar o número de botões, o tamanho ou a posição modificando os parâmetros do loop ou o array "quickMessages". Essa estrutura garante que o Painel de Administração possa ser facilmente adaptado a diferentes necessidades, proporcionando uma interface robusta e amigável.

//+------------------------------------------------------------------+
//| Inputs                                                                       |
//+------------------------------------------------------------------+
input string QuickMessage1 = "Updates";
input string QuickMessage2 = "Close all";
input string QuickMessage3 = "In deep profits";
input string QuickMessage4 = "Hold position";
input string QuickMessage5 = "Swing Entry";
input string QuickMessage6 = "Scalp Entry";
input string QuickMessage7 = "Book profit";
input string QuickMessage8 = "Invalid Signal";
input string InputChatId = "Enter Chat ID from Telegram bot API";  // User's Telegram chat ID
input string InputBotToken = "Enter BOT TOKEN from your Telegram bot"; // User's Telegram bot token

Implementação do Loop:

  • Nós estabelecemos múltiplos botões de mensagens rápidas criando um array de objetos (CButton) (quickMessageButtons[8]) e inicializando-os em um loop. O loop itera sobre o array (quickMessages), que contém mensagens pré-definidas. Cada iteração cria um botão, atribui um rótulo a partir de (quickMessages) e posiciona os botões dinamicamente com base no índice. A essência da função de repetição é capturada pela estrutura do loop, que replica o processo de criação e configuração de cada botão, garantindo consistência e eficiência. No MQL5, essa abordagem minimiza a redundância usando um loop para lidar com tarefas repetitivas, como criar vários botões com características semelhantes, simplificando assim o código e reduzindo a chance de erros.

// Array of predefined quick messages
string quickMessages[8] = { 
    QuickMessage1, QuickMessage2, QuickMessage3, QuickMessage4, 
    QuickMessage5, QuickMessage6, QuickMessage7, QuickMessage8 
};

// Coordinates and dimensions for the buttons
int startX = 5, startY = 160, width = 222, height = 65, spacing = 5;

// Loop to create and configure quick message buttons
for (int i = 0; i < 8; i++)
{
    if (!quickMessageButtons[i].Create(chart_id, "QuickMessageButton" + IntegerToString(i + 1), 0, 
        startX + (i % 2) * (width + spacing), 
        startY + (i / 2) * (height + spacing), 
        startX + (i % 2) * (width + spacing) + width, 
        startY + (i / 2) * (height + spacing) + height))
    {
        Print("Failed to create quick message button ", i + 1);
        return INIT_FAILED;
    }
    quickMessageButtons[i].Text(quickMessages[i]);
    adminPanel.Add(quickMessageButtons[i]);
}

Gerenciamento do Tamanho da Mensagem:

  • A implementação do limite de caracteres envolve um contador de caracteres que rastreia o número de caracteres digitados na caixa de entrada e atualiza um rótulo para exibir o comprimento atual junto com o comprimento máximo permitido da mensagem. A função (OnInputChange) é acionada sempre que o texto de entrada muda, recuperando o texto, calculando seu comprimento usando (StringLen) e então atualizando o rótulo (charCounter) com o formato "comprimento_atual/MAX_MESSAGE_LENGTH". Isso garante que os usuários saibam quantos caracteres ainda têm disponíveis ao compor sua mensagem, evitando que ultrapassem o limite permitido. Opcionalmente, usei 600 como comprimento máximo da mensagem.

// Maximum number of characters allowed in a message
int MAX_MESSAGE_LENGTH = 600;

// Function to update the character counter
void OnInputChange()
{
    string text = inputBox.Text();
    int currentLength = StringLen(text);
    charCounter.Text(IntegerToString(currentLength) + "/" + IntegerToString(MAX_MESSAGE_LENGTH));
}

Nosso programa totalmente integrado está aqui:

//+------------------------------------------------------------------+
//|                                          Admin Panel.mq5         |
//|                   Copyright 2024, Clemence Benjamin              |
//|       https://www.mql5.com/en/users/billionaire2024/seller       |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Clemence Benjamin"
#property link      "https://www.mql5.com/en/users/billionaire2024/seller"
#property description "A responsive Admin Panel. Send messages to your telegram clients without leaving MT5"
#property version   "1.09"

#include <Trade\Trade.mqh>
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Label.mqh>  // Use CLabel for displaying text

//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
input string QuickMessage1 = "Updates";
input string QuickMessage2 = "Close all";
input string QuickMessage3 = "In deep profits";
input string QuickMessage4 = "Hold position";
input string QuickMessage5 = "Swing Entry";
input string QuickMessage6 = "Scalp Entry";
input string QuickMessage7 = "Book profit";
input string QuickMessage8 = "Invalid Signal";
input string InputChatId = "Enter Chat ID from Telegram bot API";  // User's Telegram chat ID
input string InputBotToken = "Enter BOT TOKEN from your Telegram bot"; // User's Telegram bot token

//+------------------------------------------------------------------+
//| Global variables                                                 |
//+------------------------------------------------------------------+
CDialog adminPanel;
CButton sendButton;
CButton clearButton;
CButton minimizeButton;
CButton maximizeButton;
CButton closeButton;
CButton quickMessageButtons[8];
CEdit inputBox;
CLabel charCounter;  // Use CLabel for the character counter
bool minimized = false;
int MAX_MESSAGE_LENGTH = 600;  // Maximum number of characters

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    long chart_id = ChartID();

    // Create the dialog
    if (!adminPanel.Create(chart_id, "Admin Panel", 0, 30, 30, 500, 500))
    {
        Print("Failed to create dialog");
        return INIT_FAILED;
    }

    // Create the input box
    if (!inputBox.Create(chart_id, "InputBox", 0, 5, 5, 460, 75))
    {
        Print("Failed to create input box");
        return INIT_FAILED;
    }
    adminPanel.Add(inputBox);

    // Create the clear button for the input box
    if (!clearButton.Create(chart_id, "ClearButton", 0, 180, 75, 270, 105))
    {
        Print("Failed to create clear button");
        return INIT_FAILED;
    }
    clearButton.Text("Clear");
    adminPanel.Add(clearButton);

    // Create the send button for custom messages
    if (!sendButton.Create(chart_id, "SendButton", 0, 270, 75, 460, 105))
    {
        Print("Failed to create send button");
        return INIT_FAILED;
    }
    sendButton.Text("Send Message");
    adminPanel.Add(sendButton);

    // Create the character counter label
    if (!charCounter.Create(chart_id, "CharCounter", 0, 380, 110, 460, 130))
    {
        Print("Failed to create character counter label");
        return INIT_FAILED;
    }
    charCounter.Text("0/" + IntegerToString(MAX_MESSAGE_LENGTH));
    adminPanel.Add(charCounter);

    // Create the quick message buttons
    string quickMessages[8] = { QuickMessage1, QuickMessage2, QuickMessage3, QuickMessage4, QuickMessage5, QuickMessage6, QuickMessage7, QuickMessage8 };
    int startX = 5, startY = 160, width = 222, height = 65, spacing = 5;

    for (int i = 0; i < 8; i++)
    {
        if (!quickMessageButtons[i].Create(chart_id, "QuickMessageButton" + IntegerToString(i + 1), 0, startX + (i % 2) * (width + spacing), startY + (i / 2) * (height + spacing), startX + (i % 2) * (width + spacing) + width, startY + (i / 2) * (height + spacing) + height))
        {
            Print("Failed to create quick message button ", i + 1);
            return INIT_FAILED;
        }
        quickMessageButtons[i].Text(quickMessages[i]);
        adminPanel.Add(quickMessageButtons[i]);
    }

    adminPanel.Show();
     // Create the minimize button
    if (!minimizeButton.Create(chart_id, "MinimizeButton", 0, 375, -22, 405, 0))
    {
        Print("Failed to create minimize button");
        return INIT_FAILED;
    }
    minimizeButton.Text("_");
    adminPanel.Add(minimizeButton);

    // Create the maximize button
    if (!maximizeButton.Create(chart_id, "MaximizeButton", 0, 405, -22, 435, 0))
    {
        Print("Failed to create maximize button");
        return INIT_FAILED;
    }
    maximizeButton.Text("[ ]");
    adminPanel.Add(maximizeButton);

    // Create the close button
    if (!closeButton.Create(chart_id, "CloseButton", 0, 435, -22, 465, 0))
    {
        Print("Failed to create close button");
        return INIT_FAILED;
    }
    closeButton.Text("X");
    adminPanel.Add(closeButton);

    adminPanel.Show();

    // Enable chart events
    ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
    ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_DELETE, true);
    ChartSetInteger(ChartID(), CHART_EVENT_MOUSE_WHEEL, true);
    ChartRedraw();

    Print("Initialization complete");
    return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    adminPanel.Destroy();
    Print("Deinitialization complete");
}

//+------------------------------------------------------------------+
//| Expert event handling function                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
    // Handle different types of events
    switch (id)
    {
        case CHARTEVENT_OBJECT_CLICK:
            if (sparam == "SendButton")
            {
                OnSendButtonClick();
            }
            else if (sparam == "ClearButton")
            {
                OnClearButtonClick();
            }
            else if (sparam == "MinimizeButton")
            {
                OnMinimizeButtonClick();
            }
            else if (sparam == "MaximizeButton")
            {
                OnMaximizeButtonClick();
            }
            else if (sparam == "CloseButton")
            {
                OnCloseButtonClick();
            }
            else if (StringFind(sparam, "QuickMessageButton") >= 0)
            {
                int index = StringToInteger(StringSubstr(sparam, StringLen("QuickMessageButton")));
                OnQuickMessageButtonClick(index - 1);
            }
            break;

        case CHARTEVENT_OBJECT_CHANGE:
            if (sparam == "InputBox")
            {
                OnInputChange();
            }
            break;

        default:
            break;
    }
}

//+------------------------------------------------------------------+
//| Function to handle custom message send button click              |
//+------------------------------------------------------------------+
void OnSendButtonClick()
{
    string message = inputBox.Text();
    if (message != "")
    {
        if (SendMessageToTelegram(message))
            Print("Custom message sent: ", message);
        else
            Print("Failed to send custom message.");
    }
    else
    {
        Print("No message entered.");
    }
}

//+------------------------------------------------------------------+
//| Function to handle clear button click                            |
//+------------------------------------------------------------------+
void OnClearButtonClick()
{
    inputBox.Text(""); // Clear the text in the input box
    OnInputChange();   // Update the character counter
    Print("Input box cleared.");
}

//+------------------------------------------------------------------+
//| Function to handle quick message button click                    |
//+------------------------------------------------------------------+
void OnQuickMessageButtonClick(int index)
{
    string quickMessages[8] = { QuickMessage1, QuickMessage2, QuickMessage3, QuickMessage4, QuickMessage5, QuickMessage6, QuickMessage7, QuickMessage8 };
    string message = quickMessages[index];

    if (SendMessageToTelegram(message))
        Print("Quick Message Button Clicked - Quick message sent: ", message);
    else
        Print("Failed to send quick message.");
}

//+------------------------------------------------------------------+
//| Function to update the character counter                         |
//+------------------------------------------------------------------+
void OnInputChange()
{
    string text = inputBox.Text();
    int currentLength = StringLen(text);
    charCounter.Text(IntegerToString(currentLength) + "/" + IntegerToString(MAX_MESSAGE_LENGTH));
}
//+------------------------------------------------------------------+
//| Function to handle minimize button click                         |
//+------------------------------------------------------------------+
void OnMinimizeButtonClick()
{
    minimized = true;

    // Hide the full admin panel
    adminPanel.Hide();
    minimizeButton.Show();
    maximizeButton.Show();
    closeButton.Show();
    
}    

   

//+------------------------------------------------------------------+
//| Function to handle maximize button click                         |
//+------------------------------------------------------------------+
void OnMaximizeButtonClick()
{
    if (minimized)
    {
      

        minimizeButton.Hide();
        maximizeButton.Hide();
        closeButton.Hide();
        adminPanel.Show();
    }
    
}

//+------------------------------------------------------------------+
//| Function to handle close button click                            |
//+------------------------------------------------------------------+
void OnCloseButtonClick()
{
    ExpertRemove(); // Completely remove the EA
    Print("Admin Panel closed.");
}

//+------------------------------------------------------------------+
//| Function to send the message to Telegram                         |
//+------------------------------------------------------------------+
bool SendMessageToTelegram(string message)
{
    // Use the input values for bot token and chat ID
    string botToken = InputBotToken;
    string chatId = InputChatId;

    string url = "https://api.telegram.org/bot" + botToken + "/sendMessage";
    char post_data[];

    // Prepare the message data
    string jsonMessage = "{\"chat_id\":\"" + chatId + "\", \"text\":\"" + message + "\"}";

    // Resize the character array to fit the JSON payload
    ArrayResize(post_data, StringToCharArray(jsonMessage, post_data));

    int timeout = 5000;
    char result[];
    string responseHeaders;

    // Make the WebRequest
    int res = WebRequest("POST", url, "Content-Type: application/json\r\n", timeout, post_data, result, responseHeaders);

    if (res == 200) // HTTP 200 OK
    {
        Print("Message sent successfully: ", message);
        return true;
    }
    else
    {
        Print("Failed to send message. HTTP code: ", res, " Error code: ", GetLastError());
        Print("Response: ", CharArrayToString(result));
        return false;
    }
}

Testando o Painel de Administração avançado e responsivo:

Aqui, eu iniciei o Painel de Administração, e ele estava funcionando bem com poucos problemas. Veja a imagem abaixo.


Testando o Painel de Administração avançado

Índice de Volatilidade 150s: Teste do Painel de Administração

A integração com o Telegram funcionou bem, nossas mensagens chegam com um clique!

Mensagens Rápidas do Telegram Recebidas

Mensagens Rápidas do Telegram Recebidas


Conclusão

Em conclusão, a integração de recursos de responsividade e mensagens rápidas no Painel de Administração do Expert Advisor (EA) representa um aprimoramento significativo em sua utilidade e experiência do usuário. Os botões recentemente adicionados de minimizar, maximizar e fechar oferecem uma interface fluida e intuitiva, permitindo que os usuários gerenciem a visibilidade e a operação do painel com facilidade. Esses recursos garantem que o painel não seja apenas funcional, mas também adaptável às necessidades do usuário, seja para uma visualização completa ou para uma exibição compacta e discreta.
A implementação de mensagens rápidas agiliza ainda mais a comunicação, permitindo que os usuários enviem mensagens predefinidas instantaneamente aos seus clientes do Telegram sem sair do ambiente do MetaTrader 5. Esse recurso é particularmente valioso em cenários de negociação acelerada, onde o tempo é crucial. A capacidade do painel de enviar mensagens personalizadas, combinada com a conveniência dos botões de mensagens rápidas, capacita os usuários a manter uma comunicação eficaz com interrupção mínima de suas atividades de negociação.

De modo geral, essas melhorias tornam o Painel de Administração uma ferramenta mais poderosa para traders e administradores, aumentando tanto a eficiência quanto a flexibilidade. Essa evolução reflete nosso compromisso em fornecer soluções que atendam aos desafios reais da negociação algorítmica, garantindo que os usuários possam gerenciar suas operações de negociação com maior controle e conveniência.

Ainda há muito o que fazer, mas hoje chegamos até aqui. Em anexo está um arquivo-fonte. Bom desenvolvimento e boas negociações, pessoal!

Voltar ao topo

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

Arquivos anexados |
Admin_Panel.mq5 (11.83 KB)
Últimos Comentários | Ir para discussão (2)
Hamed Sadeghi
Hamed Sadeghi | 11 set. 2024 em 22:26
Este artigo é incrivelmente útil e altamente prático. Muito obrigado
Clemence Benjamin
Clemence Benjamin | 12 set. 2024 em 08:04
Hamed Sadeghi #:
Este artigo é incrivelmente útil e altamente prático. Obrigado pela atenção

Obrigado por seu valioso feedback, ele é muito apreciado!

Introdução ao Connexus (Parte 1): Como usar a função WebRequest? Introdução ao Connexus (Parte 1): Como usar a função WebRequest?
Este artigo é o início de uma série de desenvolvimentos para uma biblioteca chamada “Connexus”, que tem como objetivo facilitar requisições HTTP com MQL5. O objetivo deste projeto é fornecer ao usuário final essa oportunidade e mostrar como usar esta biblioteca auxiliar. Eu procurei torná-lo o mais simples possível para facilitar o estudo e proporcionar a possibilidade de futuros desenvolvimentos.
Exemplo de Otimização Estocástica e Controle Ótimo Exemplo de Otimização Estocástica e Controle Ótimo
Este Expert Advisor, chamado SMOC (provavelmente abreviação de Stochastic Model Optimal Control), é um exemplo simples de um sistema de negociação algorítmica avançado para o MetaTrader 5. Ele utiliza uma combinação de indicadores técnicos, controle preditivo baseado em modelos e gerenciamento dinâmico de risco para tomar decisões de negociação. O EA incorpora parâmetros adaptativos, dimensionamento de posição baseado em volatilidade e análise de tendências para otimizar seu desempenho em diferentes condições de mercado.
Algoritmo do buraco negro — Black Hole Algorithm (BHA) Algoritmo do buraco negro — Black Hole Algorithm (BHA)
O algoritmo do buraco negro (Black Hole Algorithm, BHA) utiliza os princípios da gravidade dos buracos negros para otimizar soluções. Neste artigo, vamos explorar como o BHA atrai as melhores soluções, evitando mínimos locais, e por que esse algoritmo se tornou uma ferramenta poderosa para resolver problemas complexos. Descubra como ideias simples podem gerar resultados impressionantes no mundo da otimização.
Do básico ao intermediário: Objetos (II) Do básico ao intermediário: Objetos (II)
Neste artigo veremos como controlar de forma simples via código algumas propriedades de objetos. Vermos como podemos colocar mais de um objeto em um mesmo gráfico, usando para isto uma aplicação. E além disto, começaremos a ver a importância de definir um nome curto, para todo e qualquer indicador que venhamos a implementar.