English Русский 中文 Español Deutsch 日本語
preview
Criando um painel MQL5 interativo usando a classe Controls (Parte 1): Configurando o painel

Criando um painel MQL5 interativo usando a classe Controls (Parte 1): Configurando o painel

MetaTrader 5Negociação |
33 2
Allan Munene Mutiiria
Allan Munene Mutiiria

Introdução

Neste artigo, vamos montar um painel de controle interativo com a ajuda da classe Controls na MetaQuotes Language 5 (MQL5). A estrutura visual dará ao painel uma aparência funcional básica que servirá de base para operações mais avançadas. O foco será em tornar o processo de trading mais intuitivo e rápido para o trader. Ao fim do artigo, teremos um painel básico de controle MetaTrader 5 com um cabeçalho, além de botões de navegação e ações essenciais.

O painel de navegação principal terá três botões: Trade (trading), Close (fechar) e Information (informações). Cada seção contará com elementos de controle específicos para diferentes comandos. Por exemplo, na seção Trade haverá botões para definir o volume da operação, preço, stop-loss (SL), take-profit (TP) e para colocar ordens Buy, Sell e Buy Stop. Na seção Close, entre outros, será possível fechar todas as ordens lucrativas (Close All Profit) e todas as ordens pendentes (Close All Pending Orders). A seção Information exibirá dados relevantes sobre o trading e atualizações de status. O artigo está dividido em três partes principais:

  1. Descrição dos elementos
  2. Montagem do painel gráfico em MQL5
  3. Considerações finais

Neste trabalho, utilizaremos ativamente a linguagem MetaQuotes Language 5 (MQL5) como nosso ambiente principal de desenvolvimento (IDE) no MetaEditor, o que nos permitirá criar aplicações e interfaces de trading avançadas. Executaremos nosso programa diretamente no terminal de negociação MetaTrader 5, onde poderemos monitorar os dados do mercado em tempo real e interagir diretamente com nosso programa de trading. Portanto, ter as versões mais recentes do MQL5 e do MetaTrader 5 instaladas é crucial para garantir compatibilidade e acesso a todos os recursos disponíveis.


Descrição dos elementos

Aqui vamos explorar os principais componentes do nosso painel interativo. O painel será composto por diversos elementos básicos, cada um com uma função específica para aumentar a eficiência da negociação. Vamos focar em três botões principais de navegação — Trade, Close e Information — cada um equipado com seus respectivos botões de ação.

Na seção Trade, além dos demais elementos, estarão presentes botões para volume, preço, stop-loss (SL) e take-profit (TP), bem como botões para execução de ordens Buy, Sell e Buy Stop. Na seção Close, entre outros, será possível fechar todas as ordens lucrativas (Close All Profit) e todas as ordens pendentes (Close All Pending Orders). Por fim, na seção Information serão exibidos dados relevantes de trading, como saldo da conta, níveis de margem e atualizações de mercado em tempo real.

Para visualizar melhor esses elementos, forneceremos um esquema de layout que mostrará como esses componentes estarão organizados dentro do painel. A ilustração servirá como um roteiro para construirmos nossa interface gráfica nas próximas seções do artigo, ajudando a integrar esses elementos de forma coesa e funcional.

Painel


Montagem do painel gráfico em MQL5

O painel será criado com base em um EA. Para criar o EA no terminal MetaTrader 5, selecione "Serviço" > "Editor MetaQuotes Language" ou simplesmente pressione F4. Você também pode clicar no ícone da IDE (ambiente de desenvolvimento integrado) na barra de ferramentas. Isso abrirá o ambiente de desenvolvimento MQL5, que permite criar robôs de trading, indicadores técnicos, scripts e bibliotecas de funções.

IDE

Na barra de ferramentas, selecione "Arquivo" → "Novo Arquivo" ou pressione CTRL + N para criar um novo documento. Você também pode clicar no ícone "Criar" na barra de ferramentas. Isso abrirá a janela do Assistente MQL.

Novo EA

Na janela do Assistente que será exibida, selecione EA (modelo) e clique em Avançar.

Assistente

Nas propriedades gerais, defina o nome do arquivo do seu EA. Para especificar ou criar uma pasta caso ela ainda não exista, utilize uma barra invertida antes do nome do EA. Por padrão, a pasta especificada é "Experts". Isso significa que nosso EA será criado dentro dessa pasta. Os outros campos são bem simples, mas você pode acessar um link na parte inferior do assistente para obter mais detalhes.

Nome do EA

Após especificar o nome do arquivo do EA, clique em "Avançar" > "Avançar" > "Concluir". Agora estamos prontos para implementar nosso painel gráfico.

No novo conjunto de dados do programa, exibido por padrão, estão presentes os metadados que mostram as propriedades necessárias associadas ao arquivo. Durante a configuração, temos os seguintes metadados.

//+------------------------------------------------------------------+
//|                                         CONTROL PANEL PART 1.mq5 |
//|                           Copyright 2024, Allan Munene Mutiiria. |
//|                                     https://forexalgo-trader.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Allan Munene Mutiiria." //--- Set copyright information
#property link      "https://forexalgo-trader.com"            //--- Link to the author's website
#property version   "1.00"                                    //--- Version of the script

Agora, a primeira coisa que precisamos fazer é acessar a biblioteca padrão de usuário do MQL5, que permitirá criar o painel. Ela já está organizada em classes, o que facilita nosso trabalho. Os arquivos que vamos utilizar estão na pasta Include (subpasta Controls). Para acessá-los, basta navegar até essas pastas e abri-las.

Caminho para os arquivos na pasta Include

Depois de visualizar os arquivos, a primeira ação necessária é incluí-los no programa, para que possamos acessar suas propriedades e outras utilidades. A primeira inclusão que faremos será dos arquivos de botões. Isso é feito com a seguinte lógica.

#include <Controls/Button.mqh>                                 //--- Include button control library

Nesta seção, utilizamos a biblioteca Button.mqh, que faz parte das bibliotecas padrão do MQL5 para elementos de controle da interface gráfica do usuário (GUI). Com a biblioteca Button.mqh, obtemos acesso à classe CButton, que podemos usar para criar, configurar e gerenciar os elementos de botão do nosso painel de trading. Usando a biblioteca Button.mqh, conseguimos implementar os botões do painel, que servem a diferentes propósitos de interação, como os botões de navegação, os botões de ações de trading (em especial para ordens de compra e venda) e outros componentes do painel que exigem botões como elementos de interface gráfica. Ao compilar o programa, precisamos implementar algumas extensões adicionais de arquivos no código, conforme mostrado a seguir.

Arquivos adicionais de botões conectados

Podemos confirmar que os arquivos foram adicionados corretamente. Agora podemos criar um objeto que nos dará acesso aos membros da classe e permitirá criar a moldura de fundo principal do painel. Fazemos isso com a seguinte lógica.

CButton obj_Btn_MAIN;                                       //--- Main button object

Aqui, declaramos a variável obj_Btn_MAIN como uma instância da classe CButton. Isso significa que obj_Btn_MAIN atuará como um objeto de botão em nosso programa. Ao criar esse objeto de botão, estamos basicamente reservando espaço na memória para representar e controlar o principal elemento de botão da nossa interface. A classe CButton oferece diversos métodos e propriedades para criar, configurar e interagir com elementos de controle de botão, como definir o texto, tamanho e cor do botão, além de lidar com eventos de clique. Agora podemos passar à criação do botão durante a inicialização do EA. Esse é o manipulador de eventos OnInit.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   //--- Start of the initialization function

   //--- MAIN BUTTON
   obj_Btn_MAIN.Create(0, Btn_MAIN, 0, 30, 30, 0, 0); //--- Create the main button at specified coordinates
   

   //--- End of initialization function
   return(INIT_SUCCEEDED); //--- Return initialization success status
}

Aqui, no manipulador de eventos OnInit, quando o EA é anexado ao gráfico pela primeira vez ou reinicializado, criamos o botão principal do painel. Chamamos o objeto obj_Btn_MAIN e usamos o operador ponto para acessar todos os membros da classe. Com o operador ponto, devemos obter algo parecido com o seguinte:

Membros do operador ponto

Create é uma função-membro que escolhemos e à qual fornecemos os parâmetros necessários. Para entender claramente o que cada item significa, vamos analisar os parâmetros:

  • O primeiro parâmetro (0) indica o identificador do gráfico. O valor 0 se refere ao gráfico atual, no qual o EA está em execução.
  • O segundo parâmetro (Btn_MAIN) é uma constante string predefinida que representa o nome deste botão. Esse nome é usado para se referir ao botão em outras partes do programa. Para facilitar as referências, definimos esse nome na área de escopo global da seguinte forma:

//--- Define button names for easier reference
#define Btn_MAIN "Btn_MAIN"                                   //--- Button name for the main button

  • O terceiro parâmetro (0) está relacionado ao índice da subjanela. Aqui, 0 indica que o botão será posicionado na janela principal do gráfico.
  • O quarto (30) e o quinto (30) parâmetros definem, respectivamente, as coordenadas X e Y do botão. Eles determinam a posição do botão no gráfico.
  • Os dois últimos parâmetros (0 e 0) especificam a largura e altura do botão. Neste caso, o valor 0 indica que o botão usará as dimensões padrão. Isso é ilustrado abaixo:

Distância e tamanho

Ao executar o programa, vemos o seguinte.

Botão padrão sem altura e largura

Na imagem, vemos que nossas primeiras coordenadas estão definidas como 30 e 30 pixels, mas as segundas coordenadas aparecem como 0, pois deixamos esses valores iguais a 0. Assim, nossas segundas coordenadas são exibidas na origem (0,0). Para definir essas coordenadas secundárias, há algumas abordagens. A primeira é defini-las diretamente dentro da função-membro. 

   //--- MAIN BUTTON
   obj_Btn_MAIN.Create(0, Btn_MAIN, 0, 30, 30, 310, 300); //--- Create the main button at specified coordinates

Aqui definimos as coordenadas finais do botão. No nosso caso, elas são 310 e 300 pixels para os eixos x e y, respectivamente. Para melhor visualização, também destacamos essas medidas em amarelo. Após a execução, obtemos o seguinte resultado.

Saída X e Y

Obtivemos os resultados esperados. No entanto, ao usar esse método, é necessário atenção ao definir os valores em pixels, pois as coordenadas finais não têm ligação direta com as iniciais. Portanto, é necessário fazer cálculos cuidadosos, já que todos os pixels são contados a partir da origem. Por exemplo, se definirmos as coordenadas finais como 10 e 10, o botão terá coordenadas finais nas direções y e x a uma distância de 10 pixels a partir da origem. Assim, nosso botão será exibido em sentido inverso, com tamanho igual a (30 - 10 = 20), ou seja, 20 pixels.

Exibição em sentido inverso

Para evitar os cálculos matemáticos envolvidos no primeiro método, podemos usar o segundo método, que consiste em definir a altura e a largura do botão diretamente, sendo esses valores calculados com base nas coordenadas iniciais. Utilizamos a seguinte lógica.

   //--- MAIN BUTTON
   obj_Btn_MAIN.Create(0, Btn_MAIN, 0, 30, 30, 0, 0); //--- Create the main button at specified coordinates
   obj_Btn_MAIN.Width(20); //---  Set width of the main button
   obj_Btn_MAIN.Height(20); //---  Set height of the main button

Aqui usamos as funções-membro width e height para definir o tamanho do botão. Utilizamos um tamanho único de 20 pixels para observar a diferença. Após compilar o programa, obtemos os seguintes resultados.

Exibição no sentido correto

Na ilustração, vemos que o botão é exibido corretamente, o que significa que não precisamos nos preocupar com as coordenadas finais ao definir o ponto inicial. Existe ainda uma terceira forma de definir os pontos diretamente, que economiza espaço ao combinar os parâmetros de largura e altura. O trecho de código correspondente é o seguinte:

   //--- MAIN BUTTON
   obj_Btn_MAIN.Create(0, Btn_MAIN, 0, 30, 30, 0, 0); //--- Create the main button at specified coordinates
   //obj_Btn_MAIN.Width(310); //--- (Commented out) Set width of the main button
   //obj_Btn_MAIN.Height(300); //--- (Commented out) Set height of the main button
   obj_Btn_MAIN.Size(310, 300); //--- Set size of the main button

Aqui definimos diretamente o tamanho do botão. No entanto, precisamos também definir as cores de fundo e da borda do botão. 

   obj_Btn_MAIN.ColorBackground(C'070,070,070'); //--- Set background color of the main button
   obj_Btn_MAIN.ColorBorder(clrBlack); //--- Set border color of the main button

Neste ponto, configuramos a aparência do nosso botão obj_Btn_MAIN, definindo as cores do fundo e da borda. Primeiro, chamamos o método ColorBackground do objeto obj_Btn_MAIN e passamos os valores RGB C'070,070,070' como parâmetro. RGB representa vermelho (Red), verde (Green) e azul (Blue) — as três cores primárias utilizadas para gerar uma ampla gama de cores em telas digitais.

O formato RGB aceita três valores que representam a intensidade das cores vermelho, verde e azul, variando de 0 a 255, onde 0 significa nenhuma intensidade e 255 significa intensidade máxima. Por exemplo, C'070,070,070' significa que:

  • Definimos o componente vermelho com intensidade 70 (de 255)
  • Verde também com 70
  • E azul com 70

Se definirmos todos os três valores RGB iguais, o resultado será uma tonalidade de cinza. Como usamos o valor 70 para todos os três componentes, o fundo do botão fica em um tom cinza-escuro. Essa cor é visualmente neutra, permitindo que outros elementos mais chamativos que criaremos se destaquem no painel.

Em seguida, chamamos o método ColorBorder e definimos a cor usando a constante clrBlack, que representa o preto puro. Nesse caso, cada valor RGB é 0 (C'000,000,000'), o que indica ausência de componentes vermelho, verde ou azul. Ao usar o preto para a borda, criamos um contorno visual bem definido, demarcando claramente os limites do botão sobre o fundo cinza mais escuro, o que faz com que ele se destaque com mais clareza e estrutura. Essa abordagem garante que o botão seja facilmente identificável, além de conferir um visual mais profissional e atrativo à interface gráfica. Após compilar, obtemos o seguinte resultado.

Botão principal

Aqui está nosso botão principal. Por fim, precisamos atualizar o gráfico para que as alterações entrem em vigor automaticamente, sem a necessidade de aguardar um evento manual no gráfico que provoque essa atualização. A lógica utilizada é mostrada abaixo.

   ChartRedraw(0); //--- Redraw the chart to update the panel

Aqui chamamos a função ChartRedraw para atualizar visualmente a interface do gráfico. Fazemos isso para garantir a exibição correta de todos os elementos gráficos recém-adicionados — botões, rótulos e assim por diante. A função ChartRedraw é indispensável sempre que adicionamos, alteramos ou removemos elementos gráficos, pois ela força o terminal a redesenhar o gráfico atual. Isso é especialmente importante quando criamos painéis interativos e queremos ter certeza de que a interface exibe para o usuário o estado mais recente possível.

Ao chamar a função, usamos o parâmetro 0. Esse valor representa o identificador do gráfico. Cada gráfico no MetaTrader 5 possui um identificador único, e o valor 0 se refere ao gráfico atual ao qual o EA está vinculado. Para redesenhar o gráfico corretamente, é essencial passar o identificador adequado. Com isso, garantimos que a atualização seja aplicada exatamente a esse gráfico. Se não chamarmos a função ChartRedraw, podemos enfrentar problemas — objetos gráficos recém-criados podem não aparecer, ou objetos modificados podem não refletir as mudanças feitas. Eles continuarão mostrando suas propriedades antigas. Ao chamar ChartRedraw para o painel, garantimos que ele e seu conteúdo sejam exibidos corretamente. O código final de inicialização responsável pela criação do botão principal fica assim.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   //--- Start of the initialization function

   //--- MAIN BUTTON
   obj_Btn_MAIN.Create(0, Btn_MAIN, 0, 30, 30, 0, 0); //--- Create the main button at specified coordinates
   //obj_Btn_MAIN.Width(310); //--- (Commented out) Set width of the main button
   //obj_Btn_MAIN.Height(300); //--- (Commented out) Set height of the main button
   obj_Btn_MAIN.Size(310, 300); //--- Set size of the main button
   obj_Btn_MAIN.ColorBackground(C'070,070,070'); //--- Set background color of the main button
   obj_Btn_MAIN.ColorBorder(clrBlack); //--- Set border color of the main button


   ChartRedraw(0); //--- Redraw the chart to update the panel

   //--- End of initialization function
   return(INIT_SUCCEEDED); //--- Return initialization success status
}

Neste ponto, já temos uma base sólida do que estamos fazendo e dos elementos necessários que precisaremos criar. Com isso, podemos definir os objetos de todos os botões que usaremos no layout inicial da interface.

#include <Controls/Button.mqh>                                 //--- Include button control library
CButton obj_Btn_MAIN;                                       //--- Main button object
CButton obj_Btn_HEADER;                                     //--- Header button object
CButton obj_Btn_X;                                          //--- Close button (X) object
CButton obj_Btn_TRADE;                                     //--- Trade button object
CButton obj_Btn_CLOSE;                                      //--- Close button object
CButton obj_Btn_INFO;                                       //--- Information button object
CButton obj_Btn_RISK;                                       //--- Risk button object
CButton obj_Btn_POINTS;                                     //--- Points button object
CButton obj_Btn_SELL;                                       //--- Sell button object
CButton obj_Btn_ENTRY;                                      //--- Entry button object
CButton obj_Btn_BUY;                                        //--- Buy button object
CButton obj_Btn_SELLSTOP;                                   //--- Sell Stop button object
CButton obj_Btn_BUYSTOP;                                    //--- Buy Stop button object
CButton obj_Btn_SELLLIMIT;                                  //--- Sell Limit button object
CButton obj_Btn_BUYLIMIT;                                   //--- Buy Limit button object
CButton obj_Btn_FOOTER;                                     //--- Footer button object

Aqui definimos vários objetos do tipo botão utilizando a classe CButton, para representar diferentes elementos interativos do painel. Cada linha cria um objeto de botão exclusivo, formando a estrutura básica de cada seção da interface que precisaremos montar. Vamos analisar a função de cada botão:

  • obj_Btn_HEADER – botão do cabeçalho do painel. Podemos usar esse objeto para exibir o título, um ícone ou como um divisor visual da parte superior do painel.
  • obj_Btn_X – botão de fechamento (frequentemente representado como X), permitindo ao usuário sair ou ocultar o painel.
  • obj_Btn_TRADE – botão Trade, que funciona como o elemento central de controle. Ao ser pressionado, ativa as funções de trading, acessa os parâmetros de operação e abre submenus relacionados às ações de negociação.
  • obj_Btn_CLOSE – botão Close para gerenciar o encerramento de ordens. Ele funcionará como um alternador para trocar entre a seção de operações e a de fechamento no painel.
  • obj_Btn_INFO – botão Info será usado para fornecer informações ao usuário, incluindo métricas de negociação, dados da conta e descrições da interface do painel.

Para os botões de funções de trading, os objetos terão finalidades específicas no contexto operacional:

  • obj_Btn_RISK – botão de controle de risco. Permitirá ao usuário configurar ou ajustar parâmetros como percentual de risco por operação.
  • obj_Btn_POINTS – esse botão será usado para ativar ou alternar para opções de trading baseadas em pontos, onde níveis como stop-loss ou take-profit são definidos em pontos e não em preços.
  • obj_Btn_SELL, obj_Btn_ENTRY e obj_Btn_BUY – botões de ações de trading. obj_Btn_SELL representa a venda, obj_Btn_BUY representa a compra, e obj_Btn_ENTRY corresponde à entrada no mercado.

Para ordens pendentes, usamos os seguintes botões:

  • obj_Btn_SELLSTOP e obj_Btn_BUYSTOP controlam o posicionamento das ordens pendentes Sell Stop e Buy Stop, colocadas abaixo ou acima do preço atual, respectivamente.
  • obj_Btn_SELLLIMIT e obj_Btn_BUYLIMIT lidam com as ordens pendentes Sell Limit e Buy Limit, permitindo que o usuário posicione ordens em níveis específicos aguardando uma possível correção de preço.

obj_Btn_FOOTER é usado para definir o botão do rodapé do painel. Esse botão pode funcionar como um elemento decorativo, botão de reset ou um controle de navegação para alternar para um modo de dados resumidos. No nosso caso, será usado para exibir os dados consolidados da interface de controle.

Da mesma forma, também precisaremos definir os campos de edição e os campos de texto. A lógica aplicada é a seguinte:

#include <Controls/Edit.mqh>                                   //--- Include edit control library
CEdit obj_Edit_RISK;                                        //--- Risk edit field object
CEdit obj_Edit_PRICE;                                       //--- Price edit field object
CEdit obj_Edit_LOTS;                                        //--- Lots edit field object
CEdit obj_Edit_SL;                                          //--- Stop Loss edit field object
CEdit obj_Edit_TP;                                          //--- Take Profit edit field object

#include <Controls/Label.mqh>                                  //--- Include label control library
CLabel obj_Lbl_HEADER;                                      //--- Header label object
CLabel obj_Lbl_PRICE;                                       //--- Price label object
CLabel obj_Lbl_LOTS;                                        //--- Lots label object
CLabel obj_Lbl_SL;                                          //--- Stop Loss label object
CLabel obj_Lbl_TP;                                          //--- Take Profit label object

Aqui incluímos as bibliotecas essenciais para controlar a entrada de dados do usuário e a exibição de texto na interface do painel. Primeiro, incluímos a biblioteca Edit.mqh, que fornece as funcionalidades para os campos de entrada editáveis. Foram definidos diversos objetos da classe CEdit, incluindo obj_Edit_RISK como o campo de edição de risco. O objeto obj_Edit_PRICE representa o campo onde o usuário pode informar o preço desejado para a operação. O objeto chamado obj_Edit_LOTS é usado para definir o tamanho do lote, permitindo que o usuário escolha a quantidade de lotes a negociar. obj_Edit_SL é o campo para definir o stop-loss. E por fim, obj_Edit_TP é o campo usado para definir o take-profit.

Em seguida, integramos a biblioteca Label.mqh. Ela facilita o processo de criação de rótulos de texto estáticos no painel, o que é especialmente útil para melhorar a usabilidade da interface. A biblioteca foi desenvolvida especificamente para nosso ambiente de trabalho e inclui a classe CLabel, que utilizamos repetidamente para criar os diversos rótulos necessários na nossa interface. O primeiro rótulo de texto que criamos é chamado obj_Lbl_HEADER e é usado para exibir o título ou alguma informação relevante no topo do painel. O próximo rótulo se chama obj_Lbl_PRICE e serve para indicar o preço atual do ativo com o qual estamos operando. Ao lado do campo de entrada do tamanho do lote, há o rótulo obj_Lbl_LOTS, que é usado para identificar o campo correspondente ao tamanho do lote. Após isso, podemos definir os campos restantes do painel, como também:

//--- Define button names for easier reference
#define Btn_MAIN "Btn_MAIN"                                   //--- Button name for the main button
#define Btn_HEADER "Btn_HEADER"                               //--- Button name for the header button
#define Btn_X "Btn_X"                                        //--- Button name for the close button
#define Btn_TRADE "Btn_TRADE"                               //--- Button name for the trade button
#define Btn_CLOSE "Btn_CLOSE"                                //--- Button name for the close button
#define Btn_INFO "Btn_INFO"                                  //--- Button name for the info button

#define Btn_RISK "Btn_RISK"                                  //--- Button name for the risk button
#define Btn_POINTS "Btn_POINTS"                              //--- Button name for the points button
#define Btn_SELL "Btn_SELL"                                  //--- Button name for the sell button
#define Btn_ENTRY "Btn_ENTRY"                                //--- Button name for the entry button
#define Btn_BUY "Btn_BUY"                                    //--- Button name for the buy button
#define Btn_SELLSTOP "Btn_SELLSTOP"                          //--- Button name for the sell stop button
#define Btn_BUYSTOP "Btn_BUYSTOP"                            //--- Button name for the buy stop button
#define Btn_SELLLIMIT "Btn_SELLLIMIT"                        //--- Button name for the sell limit button
#define Btn_BUYLIMIT "Btn_BUYLIMIT"                          //--- Button name for the buy limit button
#define Btn_FOOTER "Btn_FOOTER"                              //--- Button name for the footer button

//---
//--- Define edit field names for easier reference
#define Edit_RISK "Edit_RISK"                                //--- Edit field name for risk input
#define Edit_PRICE "Edit_PRICE"                              //--- Edit field name for price input
#define Edit_LOTS "Edit_LOTS"                                //--- Edit field name for lots input
#define Edit_SL "Edit_SL"                                    //--- Edit field name for stop loss input
#define Edit_TP "Edit_TP"                                    //--- Edit field name for take profit input

//--- Define label names for easier reference
#define Lbl_HEADER "Lbl_HEADER"                              //--- Label name for the header
#define Lbl_PRICE "Lbl_PRICE"                                //--- Label name for the price
#define Lbl_LOTS "Lbl_LOTS"                                  //--- Label name for the lots
#define Lbl_SL "Lbl_SL"                                      //--- Label name for the stop loss
#define Lbl_TP "Lbl_TP"                                      //--- Label name for the take profit

Tendo identificado os elementos-chave de que precisaremos na interface de inicialização, podemos começar a montar o cabeçalho do nosso painel usando os utilitários que já foram definidos. A lógica adotada para o cabeçalho está demonstrada no trecho de código abaixo:

   //--- HEADER BUTTON 
   obj_Btn_HEADER.Create(0, Btn_HEADER, 0, 30, 30, 0, 0); //--- Create the header button at specified coordinates
   obj_Btn_HEADER.Size(310, 25); //--- Set size of the header button
   obj_Btn_HEADER.ColorBackground(clrLightBlue); //--- Set background color of the header button
   obj_Btn_HEADER.ColorBorder(clrBlack); //--- Set border color of the header button

Aqui, criamos e configuramos o botão do cabeçalho do painel de controle. Começamos utilizando o método Create no objeto obj_Btn_HEADER para inicializar o botão com os seguintes parâmetros: identificador do gráfico, nome ("Btn_HEADER"), coordenadas iniciais (30, 30) e coordenadas finais (0, 0). Em seguida, usamos o método Size para definir o tamanho do botão em 310 pixels de largura por 25 pixels de altura, para que ele se encaixe bem no layout do painel.

Depois, ajustamos a cor de fundo do botão do cabeçalho usando o método ColorBackground e atribuímos a ele o valor clrLightBlue, para tornar o visual mais atrativo. Também especificamos a cor da borda com o método ColorBorder, definindo-a como clrBlack, o que melhora a visibilidade do botão e destaca seus contornos sobre o fundo do painel. Após compilar, obtemos o seguinte resultado.

Exibição do cabeçalho

Tudo está funcionando como esperado. Agora podemos dar mais vida ao cabeçalho adicionando a ele um rótulo e o botão lateral de fechamento. Vamos começar pelo botão de fechamento. A lógica está mostrada a seguir:

   //--- X BUTTON
   obj_Btn_X.Create(0, Btn_X, 0, 30 + 280, 30 + 1, 0, 0); //--- Create the close button (X) at specified coordinates
   obj_Btn_X.Size(30 - 1, 25 - 1 - 1); //--- Set size of the close button
   obj_Btn_X.ColorBackground(clrLightBlue); //--- Set background color of the close button
   obj_Btn_X.ColorBorder(clrLightBlue); //--- Set border color of the close button
   obj_Btn_X.Text(CharToString(255)); //--- Set the close button text to an "X" character
   obj_Btn_X.Color(clrBlack); //--- Set text color of the close button
   obj_Btn_X.Font("Wingdings"); //--- Set font of the close button to Wingdings
   obj_Btn_X.FontSize(17); //--- Set font size of the close button

Aqui, criamos e configuramos o botão de fechamento (X) do painel. Começamos inicializando o botão com o método Create no objeto obj_Btn_X. Os parâmetros fornecidos definem o identificador do gráfico, o nome ("Btn_X") e a posição no gráfico, calculada para posicioná-lo nas coordenadas x (30 + 280) e y (30 + 1), garantindo o alinhamento correto dentro do layout do painel.

Em seguida, definimos o tamanho do botão de fechamento como 29 (30 - 1) pixels de largura e 23 (25 - 1 - 1) pixels de altura utilizando o método Size, reduzindo ligeiramente o tamanho padrão para que ele se encaixe adequadamente na interface do usuário. Estamos ajustando com 1 pixel de margem para criar uma borda que não ultrapasse os limites do cabeçalho, mas sim fique dentro dele. Depois, aplicamos a cor de fundo azul claro ao botão usando o método ColorBackground, estilizando-o de forma a combiná-lo com o botão do cabeçalho. A cor da borda também é definida como azul claro com o método ColorBorder, o que dá ao botão uma aparência limpa e sem bordas contrastantes.

Prosseguimos com a definição do texto do botão no formato de ícone, utilizando a função CharToString com o valor 255 como parâmetro, o que permite que o botão mostre visualmente sua função como botão de fechamento. No MQL5, esse caractere representa um ícone do sistema Windows, mas poderia ser qualquer símbolo. A cor do texto é definida como preta através do método Color, garantindo visibilidade sobre o fundo claro. Por fim, escolhemos a fonte Wingdings para o botão de fechamento com o método Font, já que ela é apropriada para exibir ícones do Windows, e definimos o tamanho da fonte como 17 com o método FontSize, melhorando a legibilidade. Abaixo, temos os possíveis códigos de símbolos disponíveis no MQL5.

Códigos de símbolos possíveis no MQL5titleCódigos de símbolos possíveis no MQL5title

Percebemos que há uma grande variedade de opções disponíveis, mas decidimos manter o código inicial 255. Para finalizar, precisamos agora configurar o título.

   //--- HEADER LABEL
   obj_Lbl_HEADER.Create(0, Lbl_HEADER, 0, 40, 30, 0, 0); //--- Create the header label at specified coordinates
   obj_Lbl_HEADER.Text("Control Panel"); //--- Set text of the header label
   obj_Lbl_HEADER.Color(clrRed); //--- Set text color of the header label
   obj_Lbl_HEADER.Font("Cooper black"); //--- Set font of the header label to Cooper Black
   obj_Lbl_HEADER.FontSize(14); //--- Set font size of the header label

Aqui, criamos e configuramos o título para o painel de trading. Começamos inicializando o rótulo com o método Create no objeto obj_Lbl_HEADER, especificando o identificador do gráfico, o nome do rótulo ("Lbl_HEADER") e sua posição no gráfico: (40) para a coordenada x e (30) para a coordenada y. Essa posição garante que o título apareça corretamente no layout do painel.

Depois, definimos o texto do cabeçalho como "Control Panel" com o método Text, deixando claro o propósito do painel. Claro que você pode personalizar esse título. Em seguida, aplicamos a cor vermelha ao texto com o método Color, para garantir que ele se destaque no fundo e seja mais visível. A fonte usada no título é Cooper Black, definida com o método Font, que dá ao texto uma aparência clara e profissional. Por fim, definimos o tamanho da fonte como 14 através do método FontSize, garantindo que o texto do cabeçalho seja fácil de ler. Após compilar, obtemos o seguinte resultado.

Cabeçalho pronto

Tudo está funcionando como esperado. Da mesma forma, podemos criar os botões de navegação. Primeiro, vamos criar o botão para exibição das operações de trading, usando a lógica a seguir. 

   //--- TRADE BUTTON
   obj_Btn_TRADE.Create(0, Btn_TRADE, 0, 40, 60, 0, 0); //--- Create the trade button at specified coordinates
   obj_Btn_TRADE.Size(90, 30); //--- Set size of the trade button
   obj_Btn_TRADE.ColorBackground(clrYellow); //--- Set background color of the trade button
   obj_Btn_TRADE.ColorBorder(clrYellow); //--- Set border color of the trade button
   obj_Btn_TRADE.Text("Trade"); //--- Set text of the trade button
   obj_Btn_TRADE.Color(clrBlack); //--- Set text color of the trade button
   obj_Btn_TRADE.Font("Arial Black"); //--- Set font of the trade button to Arial Black
   obj_Btn_TRADE.FontSize(13); //--- Set font size of the trade button

Aqui, alteramos o tamanho do botão e também mudamos a cor de fundo para amarelo. Após compilar, obtemos o seguinte resultado.

Botão Trade

Funcionou perfeitamente. Definimos a cor amarela para o botão como forma de indicar que ele está ativo. Ao definirmos os demais botões de navegação, manteremos a mesma lógica, mas com a diferença de que a cor será alterada para indicar que estão inativos. A lógica completa é a seguinte.

   //--- CLOSE BUTTON
   obj_Btn_CLOSE.Create(0, Btn_CLOSE, 0, 40 + obj_Btn_TRADE.Width() + 10, 60, 0, 0); //--- Create the close button at specified coordinates
   obj_Btn_CLOSE.Size(90, 30); //--- Set size of the close button
   obj_Btn_CLOSE.ColorBackground(clrSilver); //--- Set background color of the close button
   obj_Btn_CLOSE.ColorBorder(clrSilver); //--- Set border color of the close button
   obj_Btn_CLOSE.Text("Close"); //--- Set text of the close button
   obj_Btn_CLOSE.Color(clrBlack); //--- Set text color of the close button
   obj_Btn_CLOSE.Font("Arial Black"); //--- Set font of the close button to Arial Black
   obj_Btn_CLOSE.FontSize(13); //--- Set font size of the close button

   //--- INFO BUTTON
   obj_Btn_INFO.Create(0, Btn_INFO, 0, 40 + obj_Btn_TRADE.Width() + 10 + obj_Btn_CLOSE.Width() + 10, 60, 0, 0); //--- Create the info button at specified coordinates
   obj_Btn_INFO.Size(90, 30); //--- Set size of the info button
   obj_Btn_INFO.ColorBackground(clrSilver); //--- Set background color of the info button
   obj_Btn_INFO.ColorBorder(clrSilver); //--- Set border color of the info button
   obj_Btn_INFO.Text("Inform'n"); //--- Set text of the info button
   obj_Btn_INFO.Color(clrBlack); //--- Set text color of the info button
   obj_Btn_INFO.Font("Arial Black"); //--- Set font of the info button to Arial Black
   obj_Btn_INFO.FontSize(13); //--- Set font size of the info button

Aqui, criamos os botões de fechamento e de informação e aplicamos para eles a cor de fundo prateada, indicando que estão inicialmente em estado inativo. Veja como fica:

Botões de navegação

Depois de definir os botões de navegação, podemos introduzir a seção do rodapé. A lógica é a seguinte:

   //--- FOOTER BUTTON
   obj_Btn_FOOTER.Create(0, Btn_FOOTER, 0, 30 + 1, 305 - 1, 0, 0); //--- Create the footer button at specified coordinates
   obj_Btn_FOOTER.Size(310 - 1 - 1, 25); //--- Set size of the footer button
   obj_Btn_FOOTER.ColorBackground(C'070,070,070'); //--- Set background color of the footer button
   obj_Btn_FOOTER.ColorBorder(C'070,070,070'); //--- Set border color of the footer button
   obj_Btn_FOOTER.Text(ShortToString(0x23F0) + "https://t.me/Forex_Algo_Trader"); //--- Set text of the footer button with a link
   obj_Btn_FOOTER.Color(clrWhite); //--- Set text color of the footer button
   obj_Btn_FOOTER.Font("Calibri bold italic"); //--- Set font of the footer button to Calibri bold italic
   obj_Btn_FOOTER.FontSize(12); //--- Set font size of the footer button

Aqui, criamos e configuramos o botão do rodapé da interface de trading, passando os parâmetros usuais e posicionando-o na parte inferior do painel. Em seguida, definimos seu tamanho com o método Size, estabelecendo largura de 310 - 1 - 1 e altura de 25 pixels. Isso garante que o botão se encaixe perfeitamente na base do painel. Depois, usamos o método ColorBackground com os valores RGB C'070,070,070' para definir a cor de fundo como cinza escuro, melhorando o apelo visual e mantendo a harmonia com o design geral.

A cor da borda também é definida como cinza escuro por meio do método ColorBorder, o que dá ao botão um visual uniforme e sem divisões visíveis. Para o texto do botão, usamos o método Text, onde aplicamos um ícone representado pelo símbolo Unicode 0x23F0 (que se parece com um relógio) e adicionamos um link para https://t.me/Forex_Algo_Trader como recurso adicional. Utilizamos a função ShortToString para converter símbolos Unicode em ícones visuais. Símbolos estão em formato hexadecimal, como mostrado abaixo, e por isso precisamos dessa função.

Caracteres Unicode

Definimos a cor do texto como branca com o método Color, para garantir boa visibilidade sobre o fundo escuro. Por fim, escolhemos a fonte Calibri em estilo negrito itálico para o botão do rodapé, utilizando o método Font, o que proporciona um visual mais profissional, e estabelecemos o tamanho da fonte como 12 com o método FontSize, garantindo legibilidade. Após a compilação, temos o seguinte resultado:

Rodapé no estágio atual

Tudo está funcionando como esperado. Agora, precisamos finalizar o corpo do painel. Como será necessário alternar constantemente o conteúdo do corpo a cada ativação de botão de navegação, podemos encapsular essa lógica em uma função e chamá-la apenas quando necessário. 

   // BODY OF THE PANEL
   createSection_Trade(); //--- Call function to create the trade section

Aqui criamos uma função chamada createSection_Trade dentro do corpo do painel para configurar a seção Trade da interface de controle. Normalmente, isso significa apenas chamar uma função. Essa função é utilizada para criar e configurar os elementos interativos relacionados às operações de trading, como os botões de compra, venda e seleção do tipo de ordem. Ao utilizar essa função, tornamos o código modular e bem organizado, o que nos permite lidar com todos os elementos relacionados à negociação dentro de uma função separada. Isso torna a estrutura principal do painel mais limpa, facilitando a manutenção e a expansão do painel conforme necessário.

Em seguida, precisamos definir a função. Como ela é simples, vamos declará-la como void e não vamos passar nenhum parâmetro. 

void createSection_Trade(){

//---

}

Para implementar a funcionalidade necessária, utilizamos a mesma lógica já aplicada no restante do código. O trecho completo da função se apresenta da seguinte forma.

//+------------------------------------------------------------------+
//|     FUNCTION TO CREATE THE TRADE SECTION                         |
//+------------------------------------------------------------------+
void createSection_Trade(){
   //--- RISK BUTTON
   obj_Btn_RISK.Create(0,Btn_RISK,0,40,100,0,0); //--- Create the risk button
   obj_Btn_RISK.Size(210,25); //--- Set the button size
   obj_Btn_RISK.ColorBackground(clrTurquoise); //--- Set the background color
   obj_Btn_RISK.ColorBorder(clrTurquoise); //--- Set the border color
   obj_Btn_RISK.Text("Risk based on Equity (%)"); //--- Set the button text
   obj_Btn_RISK.Color(clrBlack); //--- Set the text color
   obj_Btn_RISK.Font("Arial Black"); //--- Set the font style
   obj_Btn_RISK.FontSize(11); //--- Set the font size
   
   //--- RISK EDIT
   obj_Edit_RISK.Create(0,Edit_RISK,0,40+220,100,0,0); //--- Create the risk edit field
   obj_Edit_RISK.Size(70,25); //--- Set the edit field size
   obj_Edit_RISK.ColorBackground(clrWhite); //--- Set the background color
   obj_Edit_RISK.ColorBorder(clrBlack); //--- Set the border color
   obj_Edit_RISK.Text("78"); //--- Set the default text
   obj_Edit_RISK.Color(clrBlack); //--- Set the text color
   obj_Edit_RISK.Font("Times new roman bold"); //--- Set the font style
   obj_Edit_RISK.FontSize(15); //--- Set the font size
   
   //--- PRICE LABEL
   obj_Lbl_PRICE.Create(0,Lbl_PRICE,0,40,130,0,0); //--- Create the price label
   obj_Lbl_PRICE.Text("Price"); //--- Set the label text
   obj_Lbl_PRICE.Color(clrWhite); //--- Set the text color
   obj_Lbl_PRICE.Font("Arial black"); //--- Set the font style
   obj_Lbl_PRICE.FontSize(13); //--- Set the font size   
   
   //--- PRICE EDIT
   obj_Edit_PRICE.Create(0,Edit_PRICE,0,40+60,130,0,0); //--- Create the price edit field
   obj_Edit_PRICE.Size(90,25); //--- Set the edit field size
   obj_Edit_PRICE.ColorBackground(clrWhite); //--- Set the background color
   obj_Edit_PRICE.ColorBorder(clrBlack); //--- Set the border color
   obj_Edit_PRICE.Text(DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits)); //--- Set the default text to current ask price
   obj_Edit_PRICE.Color(clrBlack); //--- Set the text color
   obj_Edit_PRICE.Font("Times new roman bold"); //--- Set the font style
   obj_Edit_PRICE.FontSize(13); //--- Set the font size
   
   //--- LOTS LABEL
   obj_Lbl_LOTS.Create(0,Lbl_LOTS,0,40+160,130,0,0); //--- Create the lot size label
   obj_Lbl_LOTS.Text("Lot size"); //--- Set the label text
   obj_Lbl_LOTS.Color(clrWhite); //--- Set the text color
   obj_Lbl_LOTS.Font("Arial black"); //--- Set the font style
   obj_Lbl_LOTS.FontSize(13); //--- Set the font size   
   
   //--- LOTS EDIT
   obj_Edit_LOTS.Create(0,Edit_LOTS,0,40+60+180,130,0,0); //--- Create the lot size edit field
   obj_Edit_LOTS.Size(50,25); //--- Set the edit field size
   obj_Edit_LOTS.ColorBackground(clrWhite); //--- Set the background color
   obj_Edit_LOTS.ColorBorder(clrBlack); //--- Set the border color
   obj_Edit_LOTS.Text("0.01"); //--- Set the default text
   obj_Edit_LOTS.Color(clrBlack); //--- Set the text color
   obj_Edit_LOTS.Font("Times new roman bold"); //--- Set the font style
   obj_Edit_LOTS.FontSize(13); //--- Set the font size
   
   //--- SL LABEL
   obj_Lbl_SL.Create(0,Lbl_SL,0,40,160,0,0); //--- Create the stop loss label
   obj_Lbl_SL.Text("SL"); //--- Set the label text
   obj_Lbl_SL.Color(clrWhite); //--- Set the text color
   obj_Lbl_SL.Font("Arial black"); //--- Set the font style
   obj_Lbl_SL.FontSize(13); //--- Set the font size   
   
   //--- SL EDIT
   obj_Edit_SL.Create(0,Edit_SL,0,40+30,160,0,0); //--- Create the stop loss edit field
   obj_Edit_SL.Size(70,25); //--- Set the edit field size
   obj_Edit_SL.ColorBackground(clrWhite); //--- Set the background color
   obj_Edit_SL.ColorBorder(clrBlack); //--- Set the border color
   obj_Edit_SL.Text("300"); //--- Set the default text
   obj_Edit_SL.Color(clrBlack); //--- Set the text color
   obj_Edit_SL.Font("Times new roman bold"); //--- Set the font style
   obj_Edit_SL.FontSize(13); //--- Set the font size
   
   //--- TP LABEL
   obj_Lbl_TP.Create(0,Lbl_TP,0,40+190,160,0,0); //--- Create the take profit label
   obj_Lbl_TP.Text("TP"); //--- Set the label text
   obj_Lbl_TP.Color(clrWhite); //--- Set the text color
   obj_Lbl_TP.Font("Arial black"); //--- Set the font style
   obj_Lbl_TP.FontSize(13); //--- Set the font size   
   
   //--- TP EDIT
   obj_Edit_TP.Create(0,Edit_TP,0,40+30+190,160,0,0); //--- Create the take profit edit field
   obj_Edit_TP.Size(70,25); //--- Set the edit field size
   obj_Edit_TP.ColorBackground(clrWhite); //--- Set the background color
   obj_Edit_TP.ColorBorder(clrBlack); //--- Set the border color
   obj_Edit_TP.Text("750"); //--- Set the default text
   obj_Edit_TP.Color(clrBlack); //--- Set the text color
   obj_Edit_TP.Font("Times new roman bold"); //--- Set the font style
   obj_Edit_TP.FontSize(13); //--- Set the font size
    
   //--- POINTS BUTTON
   obj_Btn_POINTS.Create(0,Btn_POINTS,0,40+110,160,0,0); //--- Create the points button
   obj_Btn_POINTS.Size(70,25); //--- Set the button size
   obj_Btn_POINTS.ColorBackground(clrGoldenrod); //--- Set the background color
   obj_Btn_POINTS.ColorBorder(clrGoldenrod); //--- Set the border color
   obj_Btn_POINTS.Text("Points"); //--- Set the button text
   obj_Btn_POINTS.Color(clrBlack); //--- Set the text color
   obj_Btn_POINTS.Font("Calibri bold"); //--- Set the font style
   obj_Btn_POINTS.FontSize(14); //--- Set the font size
   
   //--- SELL BUTTON
   obj_Btn_SELL.Create(0,Btn_SELL,0,40,210,0,0); //--- Create the sell button
   obj_Btn_SELL.Size(100,25); //--- Set the button size
   obj_Btn_SELL.ColorBackground(clrOrangeRed); //--- Set the background color
   obj_Btn_SELL.ColorBorder(clrOrangeRed); //--- Set the border color
   obj_Btn_SELL.Text("Sell"); //--- Set the button text
   obj_Btn_SELL.Color(clrWhite); //--- Set the text color
   obj_Btn_SELL.Font("Calibri bold"); //--- Set the font style
   obj_Btn_SELL.FontSize(14); //--- Set the font size
   
   //--- ENTRY BUTTON
   obj_Btn_ENTRY.Create(0,Btn_ENTRY,0,150,210,0,0); //--- Create the entry button
   obj_Btn_ENTRY.Size(70,25); //--- Set the button size
   obj_Btn_ENTRY.ColorBackground(clrGoldenrod); //--- Set the background color
   obj_Btn_ENTRY.ColorBorder(clrGoldenrod); //--- Set the border color
   obj_Btn_ENTRY.Text("Entry"); //--- Set the button text
   obj_Btn_ENTRY.Color(clrBlack); //--- Set the text color
   obj_Btn_ENTRY.Font("Calibri bold"); //--- Set the font style
   obj_Btn_ENTRY.FontSize(14); //--- Set the font size
   
   //--- BUY BUTTON
   obj_Btn_BUY.Create(0,Btn_BUY,0,40+190,210,0,0); //--- Create the buy button
   obj_Btn_BUY.Size(100,25); //--- Set the button size
   obj_Btn_BUY.ColorBackground(clrLimeGreen); //--- Set the background color
   obj_Btn_BUY.ColorBorder(clrLimeGreen); //--- Set the border color
   obj_Btn_BUY.Text("Buy"); //--- Set the button text
   obj_Btn_BUY.Color(clrWhite); //--- Set the text color
   obj_Btn_BUY.Font("Calibri bold"); //--- Set the font style
   obj_Btn_BUY.FontSize(14); //--- Set the font size
   
   //--- SELL STOP BUTTON
   obj_Btn_SELLSTOP.Create(0,Btn_SELLSTOP,0,40,240,0,0); //--- Create the sell stop button
   obj_Btn_SELLSTOP.Size(140,25); //--- Set the button size
   obj_Btn_SELLSTOP.ColorBackground(clrOrangeRed); //--- Set the background color
   obj_Btn_SELLSTOP.ColorBorder(clrOrangeRed); //--- Set the border color
   obj_Btn_SELLSTOP.Text("Sell Stop"); //--- Set the button text
   obj_Btn_SELLSTOP.Color(clrWhite); //--- Set the text color
   obj_Btn_SELLSTOP.Font("Calibri bold"); //--- Set the font style
   obj_Btn_SELLSTOP.FontSize(14); //--- Set the font size
   
   //--- BUY STOP BUTTON
   obj_Btn_BUYSTOP.Create(0,Btn_BUYSTOP,0,40+190-40,240,0,0); //--- Create the buy stop button
   obj_Btn_BUYSTOP.Size(140,25); //--- Set the button size
   obj_Btn_BUYSTOP.ColorBackground(clrLimeGreen); //--- Set the background color
   obj_Btn_BUYSTOP.ColorBorder(clrLimeGreen); //--- Set the border color
   obj_Btn_BUYSTOP.Text("Buy Stop"); //--- Set the button text
   obj_Btn_BUYSTOP.Color(clrWhite); //--- Set the text color
   obj_Btn_BUYSTOP.Font("Calibri bold"); //--- Set the font style
   obj_Btn_BUYSTOP.FontSize(14); //--- Set the font size
   
   //--- SELL LIMIT BUTTON
   obj_Btn_SELLLIMIT.Create(0,Btn_SELLLIMIT,0,40,270,0,0); //--- Create the sell limit button
   obj_Btn_SELLLIMIT.Size(140,25); //--- Set the button size
   obj_Btn_SELLLIMIT.ColorBackground(clrOrangeRed); //--- Set the background color
   obj_Btn_SELLLIMIT.ColorBorder(clrOrangeRed); //--- Set the border color
   obj_Btn_SELLLIMIT.Text("Sell Limit"); //--- Set the button text
   obj_Btn_SELLLIMIT.Color(clrWhite); //--- Set the text color
   obj_Btn_SELLLIMIT.Font("Calibri bold"); //--- Set the font style
   obj_Btn_SELLLIMIT.FontSize(14); //--- Set the font size
   
   //--- BUY LIMIT BUTTON
   obj_Btn_BUYLIMIT.Create(0,Btn_BUYLIMIT,0,40+190-40,270,0,0); //--- Create the buy limit button
   obj_Btn_BUYLIMIT.Size(140,25); //--- Set the button size
   obj_Btn_BUYLIMIT.ColorBackground(clrLimeGreen); //--- Set the background color
   obj_Btn_BUYLIMIT.ColorBorder(clrLimeGreen); //--- Set the border color
   obj_Btn_BUYLIMIT.Text("Buy Limit"); //--- Set the button text
   obj_Btn_BUYLIMIT.Color(clrWhite); //--- Set the text color
   obj_Btn_BUYLIMIT.Font("Calibri bold"); //--- Set the font style
   obj_Btn_BUYLIMIT.FontSize(14); //--- Set the font size
}

Após compilar, obtemos o seguinte resultado.

Corpo final da seção Trade

Funcionou perfeitamente. Agora temos uma interface de trading visualmente agradável. Vamos seguir para as outras seções de navegação. Primeiro, vamos criar a interface de fechamento e organizar sua lógica dentro de uma função. No entanto, antes de definir as utilidades da função, precisamos declarar os nomes correspondentes aos botões, junto com a criação dos seus objetos. Lógica de definição dos objetos.

CButton obj_Btn_CLOSE_ALL;                                  //--- Close All button object
CButton obj_Btn_CLOSE_ALL_SELL;                             //--- Close All Sell button object
CButton obj_Btn_CLOSE_ALL_BUY;                              //--- Close All Buy button object
CButton obj_Btn_CLOSE_LOSS_SELL;                            //--- Close Loss Sell button object
CButton obj_Btn_CLOSE_LOSS_BUY;                             //--- Close Loss Buy button object
CButton obj_Btn_CLOSE_PROFIT_SELL;                          //--- Close Profit Sell button object
CButton obj_Btn_CLOSE_PROFIT_BUY;                           //--- Close Profit Buy button object
CButton obj_Btn_CLOSE_ALL_LOSS;                             //--- Close All Loss button object
CButton obj_Btn_CLOSE_ALL_PROFIT;                           //--- Close All Profit button object
CButton obj_Btn_CLOSE_PENDING;                              //--- Close Pending button object

//--- 

CButton obj_Btn_ACC_NUMBER;                                 //--- Account Number button object
CButton obj_Btn_ACC_NAME;                                   //--- Account Name button object
CButton obj_Btn_ACC_TYPE;                                   //--- Account Type button object
CButton obj_Btn_ACC_LEVERAGE;                               //--- Account Leverage button object

CButton obj_Btn_ACC_EQUITY;                                 //--- Account Equity button object
CButton obj_Btn_ACC_BALANCE;                                //--- Account Balance button object
CButton obj_Btn_TIME;                                       //--- Time button object


//---
CLabel obj_Lbl_ACC_NUMBER;                                  //--- Account Number label object
CLabel obj_Lbl_ACC_NAME;                                    //--- Account Name label object
CLabel obj_Lbl_ACC_TYPE;                                    //--- Account Type label object
CLabel obj_Lbl_ACC_LEVERAGE;                                //--- Account Leverage label object

CLabel obj_Lbl_ACC_EQUITY;                                  //--- Account Equity label object
CLabel obj_Lbl_ACC_BALANCE;                                 //--- Account Balance label object
CLabel obj_Lbl_TIME;                                        //--- Time label object

Lógica de definição dos objetos.

#define Btn_CLOSE_ALL "Btn_CLOSE_ALL"                        //--- Button name for closing all trades
#define Btn_CLOSE_ALL_SELL "Btn_CLOSE_ALL_SELL"              //--- Button name for closing all sell trades
#define Btn_CLOSE_ALL_BUY "Btn_CLOSE_ALL_BUY"                //--- Button name for closing all buy trades
#define Btn_CLOSE_LOSS_SELL "Btn_CLOSE_LOSS_SELL"            //--- Button name for closing all loss sell trades
#define Btn_CLOSE_LOSS_BUY "Btn_CLOSE_LOSS_BUY"              //--- Button name for closing all loss buy trades
#define Btn_CLOSE_PROFIT_SELL "Btn_CLOSE_PROFIT_SELL"        //--- Button name for closing all profit sell trades
#define Btn_CLOSE_PROFIT_BUY "Btn_CLOSE_PROFIT_BUY"          //--- Button name for closing all profit buy trades
#define Btn_CLOSE_ALL_LOSS "Btn_CLOSE_ALL_LOSS"              //--- Button name for closing all loss trades
#define Btn_CLOSE_ALL_PROFIT "Btn_CLOSE_ALL_PROFIT"          //--- Button name for closing all profit trades
#define Btn_CLOSE_PENDING "Btn_CLOSE_PENDING"                //--- Button name for closing all pending trades

#define Btn_ACC_NUMBER "Btn_ACC_NUMBER"                      //--- Button name for the account number
#define Btn_ACC_NAME "Btn_ACC_NAME"                          //--- Button name for the account name
#define Btn_ACC_TYPE "Btn_ACC_TYPE"                          //--- Button name for the account type
#define Btn_ACC_LEVERAGE "Btn_ACC_LEVERAGE"                  //--- Button name for the account leverage

#define Btn_ACC_EQUITY "Btn_ACC_EQUITY"                      //--- Button name for the account equity
#define Btn_ACC_BALANCE "Btn_ACC_BALANCE"                    //--- Button name for the account balance
#define Btn_TIME "Btn_TIME"                                  //--- Button name for the time

//---
#define Lbl_ACC_NUMBER "Lbl_ACC_NUMBER"                      //--- Label name for the account number
#define Lbl_ACC_NAME "Lbl_ACC_NAME"                          //--- Label name for the account name
#define Lbl_ACC_TYPE "Lbl_ACC_TYPE"                          //--- Label name for the account type
#define Lbl_ACC_LEVERAGE "Lbl_ACC_LEVERAGE"                  //--- Label name for the account leverage

#define Lbl_ACC_EQUITY "Lbl_ACC_EQUITY"                      //--- Label name for the account equity
#define Lbl_ACC_BALANCE "Lbl_ACC_BALANCE"                    //--- Label name for the account balance
#define Lbl_TIME "Lbl_TIME"                                  //--- Label name for the time

Após definirmos todos os parâmetros necessários, passamos à criação da função de fechamento.

//+------------------------------------------------------------------+
//|      FUNCTION TO CREATE THE CLOSE SECTION                        |
//+------------------------------------------------------------------+
void createSection_Close(){
   //--- CLOSE ALL BUTTON
   obj_Btn_CLOSE_ALL.Create(0, Btn_CLOSE_ALL, 0, 80, 120, 0, 0); //--- Create the close all button
   obj_Btn_CLOSE_ALL.Size(210, 25); //--- Set the button size
   obj_Btn_CLOSE_ALL.ColorBackground(clrPeru); //--- Set the background color
   obj_Btn_CLOSE_ALL.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_ALL.Text("Close All"); //--- Set the button text
   obj_Btn_CLOSE_ALL.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_ALL.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_ALL.FontSize(14); //--- Set the font size
   
   //--- CLOSE ALL SELL BUTTON
   obj_Btn_CLOSE_ALL_SELL.Create(0, Btn_CLOSE_ALL_SELL, 0, 40, 150, 0, 0); //--- Create the close all sell button
   obj_Btn_CLOSE_ALL_SELL.Size(140, 25); //--- Set the button size
   obj_Btn_CLOSE_ALL_SELL.ColorBackground(clrSalmon); //--- Set the background color
   obj_Btn_CLOSE_ALL_SELL.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_ALL_SELL.Text("Close All Sell"); //--- Set the button text
   obj_Btn_CLOSE_ALL_SELL.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_ALL_SELL.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_ALL_SELL.FontSize(14); //--- Set the font size
   
   //--- CLOSE ALL BUY BUTTON
   obj_Btn_CLOSE_ALL_BUY.Create(0, Btn_CLOSE_ALL_BUY, 0, 190, 150, 0, 0); //--- Create the close all buy button
   obj_Btn_CLOSE_ALL_BUY.Size(140, 25); //--- Set the button size
   obj_Btn_CLOSE_ALL_BUY.ColorBackground(clrMediumSeaGreen); //--- Set the background color
   obj_Btn_CLOSE_ALL_BUY.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_ALL_BUY.Text("Close All Buy"); //--- Set the button text
   obj_Btn_CLOSE_ALL_BUY.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_ALL_BUY.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_ALL_BUY.FontSize(14); //--- Set the font size
   
   //--- CLOSE LOSS SELL BUTTON
   obj_Btn_CLOSE_LOSS_SELL.Create(0, Btn_CLOSE_LOSS_SELL, 0, 40, 180, 0, 0); //--- Create the close loss sell button
   obj_Btn_CLOSE_LOSS_SELL.Size(140, 25); //--- Set the button size
   obj_Btn_CLOSE_LOSS_SELL.ColorBackground(clrSalmon); //--- Set the background color
   obj_Btn_CLOSE_LOSS_SELL.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_LOSS_SELL.Text("Close Loss Sell"); //--- Set the button text
   obj_Btn_CLOSE_LOSS_SELL.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_LOSS_SELL.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_LOSS_SELL.FontSize(14); //--- Set the font size
   
   //--- CLOSE LOSS BUY BUTTON
   obj_Btn_CLOSE_LOSS_BUY.Create(0, Btn_CLOSE_LOSS_BUY, 0, 190, 180, 0, 0); //--- Create the close loss buy button
   obj_Btn_CLOSE_LOSS_BUY.Size(140, 25); //--- Set the button size
   obj_Btn_CLOSE_LOSS_BUY.ColorBackground(clrMediumSeaGreen); //--- Set the background color
   obj_Btn_CLOSE_LOSS_BUY.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_LOSS_BUY.Text("Close Loss Buy"); //--- Set the button text
   obj_Btn_CLOSE_LOSS_BUY.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_LOSS_BUY.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_LOSS_BUY.FontSize(14); //--- Set the font size
   
   //--- CLOSE PROFIT SELL BUTTON
   obj_Btn_CLOSE_PROFIT_SELL.Create(0, Btn_CLOSE_PROFIT_SELL, 0, 40, 210, 0, 0); //--- Create the close profit sell button
   obj_Btn_CLOSE_PROFIT_SELL.Size(140, 25); //--- Set the button size
   obj_Btn_CLOSE_PROFIT_SELL.ColorBackground(clrSalmon); //--- Set the background color
   obj_Btn_CLOSE_PROFIT_SELL.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_PROFIT_SELL.Text("Close Profit Sell"); //--- Set the button text
   obj_Btn_CLOSE_PROFIT_SELL.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_PROFIT_SELL.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_PROFIT_SELL.FontSize(14); //--- Set the font size
   
   //--- CLOSE PROFIT BUY BUTTON
   obj_Btn_CLOSE_PROFIT_BUY.Create(0, Btn_CLOSE_PROFIT_BUY, 0, 190, 210, 0, 0); //--- Create the close profit buy button
   obj_Btn_CLOSE_PROFIT_BUY.Size(140, 25); //--- Set the button size
   obj_Btn_CLOSE_PROFIT_BUY.ColorBackground(clrMediumSeaGreen); //--- Set the background color
   obj_Btn_CLOSE_PROFIT_BUY.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_PROFIT_BUY.Text("Close Profit Buy"); //--- Set the button text
   obj_Btn_CLOSE_PROFIT_BUY.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_PROFIT_BUY.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_PROFIT_BUY.FontSize(14); //--- Set the font size
   
   //--- CLOSE ALL LOSS BUTTON
   obj_Btn_CLOSE_ALL_LOSS.Create(0, Btn_CLOSE_ALL_LOSS, 0, 40, 240, 0, 0); //--- Create the close all loss button
   obj_Btn_CLOSE_ALL_LOSS.Size(140, 25); //--- Set the button size
   obj_Btn_CLOSE_ALL_LOSS.ColorBackground(clrSalmon); //--- Set the background color
   obj_Btn_CLOSE_ALL_LOSS.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_ALL_LOSS.Text("CLOSE LOSS"); //--- Set the button text
   obj_Btn_CLOSE_ALL_LOSS.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_ALL_LOSS.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_ALL_LOSS.FontSize(14); //--- Set the font size
   
   //--- CLOSE ALL PROFIT BUTTON
   obj_Btn_CLOSE_ALL_PROFIT.Create(0, Btn_CLOSE_ALL_PROFIT, 0, 190, 240, 0, 0); //--- Create the close all profit button
   obj_Btn_CLOSE_ALL_PROFIT.Size(140, 25); //--- Set the button size
   obj_Btn_CLOSE_ALL_PROFIT.ColorBackground(clrMediumSeaGreen); //--- Set the background color
   obj_Btn_CLOSE_ALL_PROFIT.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_ALL_PROFIT.Text("CLOSE PROFIT"); //--- Set the button text
   obj_Btn_CLOSE_ALL_PROFIT.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_ALL_PROFIT.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_ALL_PROFIT.FontSize(14); //--- Set the font size
   
   //--- CLOSE ALL PENDING BUTTON
   obj_Btn_CLOSE_PENDING.Create(0, Btn_CLOSE_PENDING, 0, 80, 270, 0, 0); //--- Create the close all pending button
   obj_Btn_CLOSE_PENDING.Size(210, 25); //--- Set the button size
   obj_Btn_CLOSE_PENDING.ColorBackground(clrPeru); //--- Set the background color
   obj_Btn_CLOSE_PENDING.ColorBorder(clrWhite); //--- Set the border color
   obj_Btn_CLOSE_PENDING.Text("Close All Pending"); //--- Set the button text
   obj_Btn_CLOSE_PENDING.Color(clrBlack); //--- Set the text color
   obj_Btn_CLOSE_PENDING.Font("Calibri bold"); //--- Set the font style
   obj_Btn_CLOSE_PENDING.FontSize(14); //--- Set the font size
}

No manipulador de eventos de inicialização, podemos comentar a chamada da função da seção Trade e ativar a lógica da seção de fechamento chamando a nova função. Fazemos isso comentando, e não removendo a chamada anterior, pois precisaremos dela novamente mais tarde.

   // BODY OF THE PANEL
   //createSection_Trade(); //--- Call function to create the trade section
   createSection_Close(); //--- Call function to create the close section

Depois de executar o programa, obtemos o seguinte resultado.

Seção de fechamento

Tudo está funcionando como esperado. Agora podemos começar a criar a última seção, que exibirá informações da conta de trading. Também usaremos uma função para isso. 

//+------------------------------------------------------------------+
//|        FUNCTION TO CREATE THE INFO SECTION                       |
//+------------------------------------------------------------------+
void createSection_Information() {
   //--- Create Account Number Label
   obj_Lbl_ACC_NUMBER.Create(0, Lbl_ACC_NUMBER, 0, 40, 100, 0, 0); //--- Initialize label for Account Number
   obj_Lbl_ACC_NUMBER.Text("Account Number"); //--- Set label text to "Account Number"
   obj_Lbl_ACC_NUMBER.Color(clrWhite); //--- Set label color to white
   obj_Lbl_ACC_NUMBER.Font("Calibri bold"); //--- Set label font to Calibri bold
   obj_Lbl_ACC_NUMBER.FontSize(14); //--- Set label font size to 14

   //--- Create Account Number Button
   obj_Btn_ACC_NUMBER.Create(0, Btn_ACC_NUMBER, 0, 40 + 140, 100 + 2, 0, 0); //--- Initialize button for Account Number
   obj_Btn_ACC_NUMBER.Size(150, 20); //--- Set button size to 150x20
   obj_Btn_ACC_NUMBER.ColorBackground(clrGainsboro); //--- Set button background color to Gainsboro
   obj_Btn_ACC_NUMBER.ColorBorder(clrWhite); //--- Set button border color to white
   obj_Btn_ACC_NUMBER.Text(IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN))); //--- Set button text with account number
   obj_Btn_ACC_NUMBER.Color(clrBlack); //--- Set button text color to black
   obj_Btn_ACC_NUMBER.Font("Calibri bold"); //--- Set button font to Calibri bold
   obj_Btn_ACC_NUMBER.FontSize(13); //--- Set button font size to 13

}

Usamos novamente o mesmo formato ao criar a seção de informações. No entanto, ao configurar o texto, usamos algumas funções adicionais, cuja lógica vale a pena esclarecer. Para facilitar a visualização, a linha foi destacada em amarelo. Utilizamos uma combinação das funções AccountInfoInteger e IntegerToString para definir o texto do botão obj_Btn_ACC_NUMBER, que exibe o número da conta.

Usamos a função AccountInfoInteger para obter informações da conta com base em um parâmetro específico. Neste caso, o parâmetro é ACCOUNT_LOGIN, que informa à função que deve buscar o número de login da conta diretamente do terminal MetaTrader. Esse número é retornado como um valor inteiro.

Em seguida, aplicamos a função IntegerToString para converter esse valor inteiro em uma string. Isso é necessário porque o método Text do botão exige que o valor esteja em formato de texto para ser exibido corretamente. Sem essa conversão, o botão não conseguiria mostrar corretamente o número da conta. Da mesma forma, definimos os botões para o nome e o tipo da conta.

   //--- Create Account Name Label
   obj_Lbl_ACC_NAME.Create(0, Lbl_ACC_NAME, 0, 40, 125, 0, 0); //--- Initialize label for Account Name
   obj_Lbl_ACC_NAME.Text("Account Name"); //--- Set label text to "Account Name"
   obj_Lbl_ACC_NAME.Color(clrWhite); //--- Set label color to white
   obj_Lbl_ACC_NAME.Font("Calibri bold"); //--- Set label font to Calibri bold
   obj_Lbl_ACC_NAME.FontSize(14); //--- Set label font size to 14

   //--- Create Account Name Button
   obj_Btn_ACC_NAME.Create(0, Btn_ACC_NAME, 0, 40 + 120, 125 + 2, 0, 0); //--- Initialize button for Account Name
   obj_Btn_ACC_NAME.Size(170, 20); //--- Set button size to 170x20
   obj_Btn_ACC_NAME.ColorBackground(clrGainsboro); //--- Set button background color to Gainsboro
   obj_Btn_ACC_NAME.ColorBorder(clrWhite); //--- Set button border color to white
   obj_Btn_ACC_NAME.Text(AccountInfoString(ACCOUNT_SERVER)); //--- Set button text with account server name
   obj_Btn_ACC_NAME.Color(clrBlack); //--- Set button text color to black
   obj_Btn_ACC_NAME.Font("Calibri bold"); //--- Set button font to Calibri bold
   obj_Btn_ACC_NAME.FontSize(13); //--- Set button font size to 13

   //--- Create Account Type Label
   obj_Lbl_ACC_TYPE.Create(0, Lbl_ACC_TYPE, 0, 40, 150, 0, 0); //--- Initialize label for Account Type
   obj_Lbl_ACC_TYPE.Text("Account Type"); //--- Set label text to "Account Type"
   obj_Lbl_ACC_TYPE.Color(clrWhite); //--- Set label color to white
   obj_Lbl_ACC_TYPE.Font("Calibri bold"); //--- Set label font to Calibri bold
   obj_Lbl_ACC_TYPE.FontSize(14); //--- Set label font size to 14

   //--- Create Account Type Button
   obj_Btn_ACC_TYPE.Create(0, Btn_ACC_TYPE, 0, 40 + 110, 150 + 2, 0, 0); //--- Initialize button for Account Type
   obj_Btn_ACC_TYPE.Size(180, 20); //--- Set button size to 180x20
   obj_Btn_ACC_TYPE.ColorBackground(clrGainsboro); //--- Set button background color to Gainsboro
   obj_Btn_ACC_TYPE.ColorBorder(clrWhite); //--- Set button border color to white
   ENUM_ACCOUNT_TRADE_MODE account_type = (ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE); //--- Retrieve account type
   string trade_mode; //--- Initialize variable for trade mode description
   switch (account_type) { //--- Determine account type
      case ACCOUNT_TRADE_MODE_DEMO: trade_mode = "Demo Account"; break; //--- Set trade_mode for Demo account
      case ACCOUNT_TRADE_MODE_CONTEST: trade_mode = "Contest Account"; break; //--- Set trade_mode for Contest account
      default: trade_mode = "Real Account"; break; //--- Set trade_mode for Real account
   }
   obj_Btn_ACC_TYPE.Text(trade_mode); //--- Set button text to account type description
   obj_Btn_ACC_TYPE.Color(clrBlack); //--- Set button text color to black
   obj_Btn_ACC_TYPE.Font("Calibri bold"); //--- Set button font to Calibri bold
   obj_Btn_ACC_TYPE.FontSize(13); //--- Set button font size to 13

Aqui configuramos os botões do nome e do tipo da conta. No entanto, utilizamos uma lógica mais elaborada para obter o tipo da conta, já que não existe um método direto para isso. A lógica foi destacada em amarelo para facilitar a visualização. Começamos definindo uma variável chamada account_type, do tipo de enumeração ENUM_ACCOUNT_TRADE_MODE. Esse é um tipo de dado enumerado, criado especificamente para armazenar diferentes modos de conta, como Demo, Contest ou Real. Atribuímos um valor a essa variável com a função AccountInfoInteger usando o parâmetro ACCOUNT_TRADE_MODE. Essa função recupera o modo de operação atual da conta como um número inteiro enumerado.

Em seguida, declaramos uma variável string chamada trade_mode, que armazenará a etiqueta descritiva com base no tipo da conta. Depois, usamos a estrutura switch para determinar o tipo de conta verificando o valor da variável account_type. O comando switch apresenta três opções:

  • ACCOUNT_TRADE_MODE_DEMO – se for uma conta demo, trade_mode será definido como "Demo Account".
  • ACCOUNT_TRADE_MODE_CONTEST – se for uma conta de concurso, trade_mode será "Contest Account".
  • Caso contrário (modo padrão) – para qualquer outro tipo (geralmente uma conta real), trade_mode será "Real Account".

Por fim, chamamos o método Text do botão obj_Btn_ACC_TYPE e passamos a string trade_mode. Isso atualiza o texto do botão para exibir o tipo de conta corretamente. As demais funcionalidades auxiliares são definidas de forma semelhante.

   //--- Create Account Leverage Label
   obj_Lbl_ACC_LEVERAGE.Create(0, Lbl_ACC_LEVERAGE, 0, 40, 175, 0, 0); //--- Initialize label for Account Leverage
   obj_Lbl_ACC_LEVERAGE.Text("Account Leverage"); //--- Set label text to "Account Leverage"
   obj_Lbl_ACC_LEVERAGE.Color(clrWhite); //--- Set label color to white
   obj_Lbl_ACC_LEVERAGE.Font("Calibri bold"); //--- Set label font to Calibri bold
   obj_Lbl_ACC_LEVERAGE.FontSize(14); //--- Set label font size to 14

   //--- Create Account Leverage Button
   obj_Btn_ACC_LEVERAGE.Create(0, Btn_ACC_LEVERAGE, 0, 40 + 150, 175 + 2, 0, 0); //--- Initialize button for Account Leverage
   obj_Btn_ACC_LEVERAGE.Size(140, 20); //--- Set button size to 140x20
   obj_Btn_ACC_LEVERAGE.ColorBackground(clrGainsboro); //--- Set button background color to Gainsboro
   obj_Btn_ACC_LEVERAGE.ColorBorder(clrWhite); //--- Set button border color to white
   obj_Btn_ACC_LEVERAGE.Text(IntegerToString(AccountInfoInteger(ACCOUNT_LEVERAGE))); //--- Set button text with account leverage
   obj_Btn_ACC_LEVERAGE.Color(clrBlack); //--- Set button text color to black
   obj_Btn_ACC_LEVERAGE.Font("Calibri bold"); //--- Set button font to Calibri bold
   obj_Btn_ACC_LEVERAGE.FontSize(13); //--- Set button font size to 13

   //--- Create Account Equity Label
   obj_Lbl_ACC_EQUITY.Create(0, Lbl_ACC_EQUITY, 0, 40, 220, 0, 0); //--- Initialize label for Account Equity
   obj_Lbl_ACC_EQUITY.Text("Account Equity"); //--- Set label text to "Account Equity"
   obj_Lbl_ACC_EQUITY.Color(clrAqua); //--- Set label color to Aqua
   obj_Lbl_ACC_EQUITY.Font("Cooper Black"); //--- Set label font to Cooper Black
   obj_Lbl_ACC_EQUITY.FontSize(14); //--- Set label font size to 14

   //--- Create Account Equity Button
   obj_Btn_ACC_EQUITY.Create(0, Btn_ACC_EQUITY, 0, 40 + 170, 220 + 2, 0, 0); //--- Initialize button for Account Equity
   obj_Btn_ACC_EQUITY.Size(120, 20); //--- Set button size to 120x20
   obj_Btn_ACC_EQUITY.ColorBackground(clrBlack); //--- Set button background color to black
   obj_Btn_ACC_EQUITY.ColorBorder(clrBlanchedAlmond); //--- Set button border color to Blanched Almond
   obj_Btn_ACC_EQUITY.Text(DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY), 2)); //--- Set button text with account equity
   obj_Btn_ACC_EQUITY.Color(clrWhite); //--- Set button text color to white
   obj_Btn_ACC_EQUITY.Font("Times new roman bold"); //--- Set button font to Times New Roman bold
   obj_Btn_ACC_EQUITY.FontSize(13); //--- Set button font size to 13

   //--- Create Account Balance Label
   obj_Lbl_ACC_BALANCE.Create(0, Lbl_ACC_BALANCE, 0, 40, 245, 0, 0); //--- Initialize label for Account Balance
   obj_Lbl_ACC_BALANCE.Text("Account Balance"); //--- Set label text to "Account Balance"
   obj_Lbl_ACC_BALANCE.Color(clrAqua); //--- Set label color to Aqua
   obj_Lbl_ACC_BALANCE.Font("Cooper Black"); //--- Set label font to Cooper Black
   obj_Lbl_ACC_BALANCE.FontSize(14); //--- Set label font size to 14

   //--- Create Account Balance Button
   obj_Btn_ACC_BALANCE.Create(0, Btn_ACC_BALANCE, 0, 40 + 170, 245 + 2, 0, 0); //--- Initialize button for Account Balance
   obj_Btn_ACC_BALANCE.Size(120, 20); //--- Set button size to 120x20
   obj_Btn_ACC_BALANCE.ColorBackground(clrBlack); //--- Set button background color to black
   obj_Btn_ACC_BALANCE.ColorBorder(clrBlanchedAlmond); //--- Set button border color to Blanched Almond
   obj_Btn_ACC_BALANCE.Text(DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE), 2)); //--- Set button text with account balance
   obj_Btn_ACC_BALANCE.Color(clrWhite); //--- Set button text color to white
   obj_Btn_ACC_BALANCE.Font("Times new roman bold"); //--- Set button font to Times New Roman bold
   obj_Btn_ACC_BALANCE.FontSize(13); //--- Set button font size to 13

   //--- Create Server Time Label
   obj_Lbl_TIME.Create(0, Lbl_TIME, 0, 40, 270, 0, 0); //--- Initialize label for Server Time
   obj_Lbl_TIME.Text("Server Time"); //--- Set label text to "Server Time"
   obj_Lbl_TIME.Color(clrLime); //--- Set label color to Lime
   obj_Lbl_TIME.Font("Cooper Black"); //--- Set label font to Cooper Black
   obj_Lbl_TIME.FontSize(14); //--- Set label font size to 14

   //--- Create Server Time Button
   obj_Btn_TIME.Create(0, Btn_TIME, 0, 40 + 120, 270 + 2, 0, 0); //--- Initialize button for Server Time
   obj_Btn_TIME.Size(170, 20); //--- Set button size to 170x20
   obj_Btn_TIME.ColorBackground(clrBlack); //--- Set button background color to black
   obj_Btn_TIME.ColorBorder(clrBlanchedAlmond); //--- Set button border color to Blanched Almond
   obj_Btn_TIME.Text(TimeToString(TimeTradeServer(), TIME_DATE | TIME_SECONDS)); //--- Set button text with server time
   obj_Btn_TIME.Color(clrWhite); //--- Set button text color to white
   obj_Btn_TIME.Font("Times new roman bold"); //--- Set button font to Times New Roman bold
   obj_Btn_TIME.FontSize(13); //--- Set button font size to 13

Para verificar o efeito dessas alterações, precisamos chamar essa função na etapa de inicialização e comentar os outros chamados de funções de navegação. Isso está mostrado a seguir.

   // BODY OF THE PANEL
   //createSection_Trade(); //--- Call function to create the trade section
   //createSection_Close(); //--- Call function to create the close section
   createSection_Information(); //--- Call function to create the information section

Após compilar e executar o programa, obtemos o seguinte resultado.

Seção de informações

Agora temos um conjunto completo de componentes da interface de controle. Podemos então retornar ao layout original da interface de operações de trading, já que esse é o botão ativo no momento. Comentamos as funções referentes às seções de fechamento e informações. Os respectivos campos de visualização dessas seções ainda serão necessários mais adiante. Assim, o código final de inicialização responsável por montar a interface do painel fica da seguinte forma:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   //--- Start of the initialization function

   //--- MAIN BUTTON
   obj_Btn_MAIN.Create(0, Btn_MAIN, 0, 30, 30, 0, 0); //--- Create the main button at specified coordinates
   //obj_Btn_MAIN.Width(310); //--- (Commented out) Set width of the main button
   //obj_Btn_MAIN.Height(300); //--- (Commented out) Set height of the main button
   obj_Btn_MAIN.Size(310, 300); //--- Set size of the main button
   obj_Btn_MAIN.ColorBackground(C'070,070,070'); //--- Set background color of the main button
   obj_Btn_MAIN.ColorBorder(clrBlack); //--- Set border color of the main button

   //--- HEADER BUTTON 
   obj_Btn_HEADER.Create(0, Btn_HEADER, 0, 30, 30, 0, 0); //--- Create the header button at specified coordinates
   obj_Btn_HEADER.Size(310, 25); //--- Set size of the header button
   obj_Btn_HEADER.ColorBackground(clrLightBlue); //--- Set background color of the header button
   obj_Btn_HEADER.ColorBorder(clrBlack); //--- Set border color of the header button

   //--- X BUTTON
   obj_Btn_X.Create(0, Btn_X, 0, 30 + 280, 30 + 1, 0, 0); //--- Create the close button (X) at specified coordinates
   obj_Btn_X.Size(30 - 1, 25 - 1 - 1); //--- Set size of the close button
   obj_Btn_X.ColorBackground(clrLightBlue); //--- Set background color of the close button
   obj_Btn_X.ColorBorder(clrLightBlue); //--- Set border color of the close button
   obj_Btn_X.Text(CharToString(255)); //--- Set the close button text to an "X" character
   obj_Btn_X.Color(clrBlack); //--- Set text color of the close button
   obj_Btn_X.Font("Wingdings"); //--- Set font of the close button to Wingdings
   obj_Btn_X.FontSize(17); //--- Set font size of the close button

   //--- HEADER LABEL
   obj_Lbl_HEADER.Create(0, Lbl_HEADER, 0, 40, 30, 0, 0); //--- Create the header label at specified coordinates
   obj_Lbl_HEADER.Text("Control Panel"); //--- Set text of the header label
   obj_Lbl_HEADER.Color(clrRed); //--- Set text color of the header label
   obj_Lbl_HEADER.Font("Cooper black"); //--- Set font of the header label to Cooper Black
   obj_Lbl_HEADER.FontSize(14); //--- Set font size of the header label
   
   //--- TRADE BUTTON
   obj_Btn_TRADE.Create(0, Btn_TRADE, 0, 40, 60, 0, 0); //--- Create the trade button at specified coordinates
   obj_Btn_TRADE.Size(90, 30); //--- Set size of the trade button
   obj_Btn_TRADE.ColorBackground(clrYellow); //--- Set background color of the trade button
   obj_Btn_TRADE.ColorBorder(clrYellow); //--- Set border color of the trade button
   obj_Btn_TRADE.Text("Trade"); //--- Set text of the trade button
   obj_Btn_TRADE.Color(clrBlack); //--- Set text color of the trade button
   obj_Btn_TRADE.Font("Arial Black"); //--- Set font of the trade button to Arial Black
   obj_Btn_TRADE.FontSize(13); //--- Set font size of the trade button
   
   //--- CLOSE BUTTON
   obj_Btn_CLOSE.Create(0, Btn_CLOSE, 0, 40 + obj_Btn_TRADE.Width() + 10, 60, 0, 0); //--- Create the close button at specified coordinates
   obj_Btn_CLOSE.Size(90, 30); //--- Set size of the close button
   obj_Btn_CLOSE.ColorBackground(clrSilver); //--- Set background color of the close button
   obj_Btn_CLOSE.ColorBorder(clrSilver); //--- Set border color of the close button
   obj_Btn_CLOSE.Text("Close"); //--- Set text of the close button
   obj_Btn_CLOSE.Color(clrBlack); //--- Set text color of the close button
   obj_Btn_CLOSE.Font("Arial Black"); //--- Set font of the close button to Arial Black
   obj_Btn_CLOSE.FontSize(13); //--- Set font size of the close button

   //--- INFO BUTTON
   obj_Btn_INFO.Create(0, Btn_INFO, 0, 40 + obj_Btn_TRADE.Width() + 10 + obj_Btn_CLOSE.Width() + 10, 60, 0, 0); //--- Create the info button at specified coordinates
   obj_Btn_INFO.Size(90, 30); //--- Set size of the info button
   obj_Btn_INFO.ColorBackground(clrSilver); //--- Set background color of the info button
   obj_Btn_INFO.ColorBorder(clrSilver); //--- Set border color of the info button
   obj_Btn_INFO.Text("Inform'n"); //--- Set text of the info button
   obj_Btn_INFO.Color(clrBlack); //--- Set text color of the info button
   obj_Btn_INFO.Font("Arial Black"); //--- Set font of the info button to Arial Black
   obj_Btn_INFO.FontSize(13); //--- Set font size of the info button
   
   // BODY OF THE PANEL
   createSection_Trade(); //--- Call function to create the trade section
   //createSection_Close(); //--- (Commented out) Call function to create the close section
   //createSection_Information(); //--- (Commented out) Call function to create the information section

   //--- FOOTER BUTTON
   obj_Btn_FOOTER.Create(0, Btn_FOOTER, 0, 30 + 1, 305 - 1, 0, 0); //--- Create the footer button at specified coordinates
   obj_Btn_FOOTER.Size(310 - 1 - 1, 25); //--- Set size of the footer button
   obj_Btn_FOOTER.ColorBackground(C'070,070,070'); //--- Set background color of the footer button
   obj_Btn_FOOTER.ColorBorder(C'070,070,070'); //--- Set border color of the footer button
   obj_Btn_FOOTER.Text(ShortToString(0x23F0) + "https://t.me/Forex_Algo_Trader"); //--- Set text of the footer button with a link
   obj_Btn_FOOTER.Color(clrWhite); //--- Set text color of the footer button
   obj_Btn_FOOTER.Font("Calibri bold italic"); //--- Set font of the footer button to Calibri bold italic
   obj_Btn_FOOTER.FontSize(12); //--- Set font size of the footer button

   ChartRedraw(0); //--- Redraw the chart to update the panel

   //--- End of initialization function
   return(INIT_SUCCEEDED); //--- Return initialization success status
}

Resultado final até o momento:

Aparência final do painel neste estágio

Embora tenhamos criado todos os componentes necessários, precisamos garantir que cada um deles seja removido assim que o programa for encerrado ou removido do gráfico. A melhor forma de fazer isso é criando funções específicas para cada seção construída, de modo que possamos reutilizá-las para remoção e, futuramente, para recriação. Afinal, precisamos manter tudo bem organizado. Se compararmos esse processo com a demolição de um edifício, faz sentido primeiro remover o revestimento, depois as divisórias, em seguida os andares superiores, e por último os alicerces. É claro que poderíamos começar por qualquer parte, mas o ideal é seguir uma sequência lógica. Acho que você concorda. Aqui estão nossas funções:

//--- Function to destroy main panel objects
void destroySection_Main_Panel() {
   obj_Btn_MAIN.Destroy(); //--- Destroy the main button
   obj_Btn_HEADER.Destroy(); //--- Destroy the header button
   obj_Btn_X.Destroy(); //--- Destroy the close (X) button
   obj_Lbl_HEADER.Destroy(); //--- Destroy the header label
   obj_Btn_TRADE.Destroy(); //--- Destroy the trade section button
   obj_Btn_CLOSE.Destroy(); //--- Destroy the close section button
   obj_Btn_INFO.Destroy(); //--- Destroy the information section button
   obj_Btn_FOOTER.Destroy(); //--- Destroy the footer button
}

//--- Function to destroy trade section objects
void destroySection_Trade() {
   obj_Btn_RISK.Destroy(); //--- Destroy the risk button
   obj_Edit_RISK.Destroy(); //--- Destroy the risk input field
   obj_Lbl_PRICE.Destroy(); //--- Destroy the price label
   obj_Edit_PRICE.Destroy(); //--- Destroy the price input field
   obj_Lbl_LOTS.Destroy(); //--- Destroy the lot size label
   obj_Edit_LOTS.Destroy(); //--- Destroy the lot size input field
   obj_Lbl_SL.Destroy(); //--- Destroy the stop loss label
   obj_Edit_SL.Destroy(); //--- Destroy the stop loss input field
   obj_Lbl_TP.Destroy(); //--- Destroy the take profit label
   obj_Edit_TP.Destroy(); //--- Destroy the take profit input field
   obj_Btn_POINTS.Destroy(); //--- Destroy the points button
   obj_Btn_SELL.Destroy(); //--- Destroy the sell button
   obj_Btn_ENTRY.Destroy(); //--- Destroy the entry button
   obj_Btn_BUY.Destroy(); //--- Destroy the buy button
   obj_Btn_SELLSTOP.Destroy(); //--- Destroy the sell stop button
   obj_Btn_BUYSTOP.Destroy(); //--- Destroy the buy stop button
   obj_Btn_SELLLIMIT.Destroy(); //--- Destroy the sell limit button
   obj_Btn_BUYLIMIT.Destroy(); //--- Destroy the buy limit button
}

//--- Function to destroy close section objects
void destroySection_Close() {
   obj_Btn_CLOSE_ALL.Destroy(); //--- Destroy the button to close all positions
   obj_Btn_CLOSE_ALL_SELL.Destroy(); //--- Destroy the button to close all sell positions
   obj_Btn_CLOSE_ALL_BUY.Destroy(); //--- Destroy the button to close all buy positions
   obj_Btn_CLOSE_LOSS_SELL.Destroy(); //--- Destroy the button to close losing sell positions
   obj_Btn_CLOSE_LOSS_BUY.Destroy(); //--- Destroy the button to close losing buy positions
   obj_Btn_CLOSE_PROFIT_SELL.Destroy(); //--- Destroy the button to close profitable sell positions
   obj_Btn_CLOSE_PROFIT_BUY.Destroy(); //--- Destroy the button to close profitable buy positions
   obj_Btn_CLOSE_ALL_LOSS.Destroy(); //--- Destroy the button to close all losing positions
   obj_Btn_CLOSE_ALL_PROFIT.Destroy(); //--- Destroy the button to close all profitable positions
   obj_Btn_CLOSE_PENDING.Destroy(); //--- Destroy the button to close pending orders
}

//--- Function to destroy information section objects
void destroySection_Information() {
   obj_Lbl_ACC_NUMBER.Destroy(); //--- Destroy the account number label
   obj_Btn_ACC_NUMBER.Destroy(); //--- Destroy the account number button
   obj_Lbl_ACC_NAME.Destroy(); //--- Destroy the account name label
   obj_Btn_ACC_NAME.Destroy(); //--- Destroy the account name button
   obj_Lbl_ACC_TYPE.Destroy(); //--- Destroy the account type label
   obj_Btn_ACC_TYPE.Destroy(); //--- Destroy the account type button
   obj_Lbl_ACC_LEVERAGE.Destroy(); //--- Destroy the account leverage label
   obj_Btn_ACC_LEVERAGE.Destroy(); //--- Destroy the account leverage button
   obj_Lbl_ACC_EQUITY.Destroy(); //--- Destroy the account equity label
   obj_Btn_ACC_EQUITY.Destroy(); //--- Destroy the account equity button
   obj_Lbl_ACC_BALANCE.Destroy(); //--- Destroy the account balance label
   obj_Btn_ACC_BALANCE.Destroy(); //--- Destroy the account balance button
   obj_Lbl_TIME.Destroy(); //--- Destroy the server time label
   obj_Btn_TIME.Destroy(); //--- Destroy the server time button
}

Neste ponto, simplesmente utilizamos os objetos apropriados e chamamos o método `Destroy` para eliminar os elementos específicos. Depois disso, chamamos essas funções dentro do manipulador de eventos OnDeinit.

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
   //--- Start of the deinitialization function

   destroySection_Main_Panel(); //--- Call function to destroy the main panel section
   destroySection_Trade(); //--- Call function to destroy the trade section
   destroySection_Close(); //--- Call function to destroy the close section
   destroySection_Information(); //--- Call function to destroy the information section
   
   ChartRedraw(0);
   
   //--- End of deinitialization function
}

Funcionou perfeitamente. Criamos o painel de controle com os botões de navegação e os componentes necessários. Assim, atingimos o objetivo da primeira parte desta série. Agora precisamos fazer com que os botões respondam aos cliques e sejam atualizados automaticamente quando necessário. Vamos tratar disso nas próximas partes.


Considerações finais

Neste artigo, focamos na configuração da estrutura básica para criar um painel interativo usando MetaQuotes Language 5 (MQL5) com o auxílio da classe Controls. Mostramos, passo a passo, como criar os principais componentes — como botões, rótulos de texto e campos de edição — garantindo que cada elemento estivesse bem definido e visualmente estilizado. Também explicamos como personalizar o texto, cores e tamanhos para dar ao painel uma aparência atrativa e profissional. Com esse modelo estruturado, estabelecemos o núcleo de uma interface funcional, que poderá ser expandida e adaptada conforme as exigências específicas de cada operação de trading.

Na próxima parte, vamos aprimorar esse painel adicionando responsividade e interatividade, permitindo que ele reaja dinamicamente tanto às ações do usuário quanto às mudanças do mercado dentro do MetaTrader 5. Veremos como implementar eventos de clique, atualizar dados em tempo real e introduzir mecanismos de resposta visual para melhorar a experiência do usuário. Isso transformará a interface estática atual em um assistente de trading poderoso, capaz de atuar em tempo real com eficiência. Fique com a gente!

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

Arquivos anexados |
Últimos Comentários | Ir para discussão (2)
Line00
Line00 | 20 mai. 2025 em 09:17

Comecei a aprender MQL5 recentemente e enfrentei todos os tipos de dificuldades. Este artigo é fácil de entender para iniciantes. Tudo é breve e claro. Gostaria de agradecer ao autor por seu profissionalismo. Durante o estudo do artigo, além de aprender a criar o Panel, obtive mais algumas habilidades úteis para dominar a programação. Muito obrigado ao autor! Aguardo ansiosamente a Parte 2.

Com todo o respeito ao autor,

B.V. Dolgikh

Allan Munene Mutiiria
Allan Munene Mutiiria | 20 mai. 2025 em 19:11
Line00 aprender MQL5 recentemente e enfrentei todos os tipos de dificuldades. Este artigo é fácil de entender para iniciantes. Tudo é breve e claro. Gostaria de agradecer ao autor por seu profissionalismo. Durante o estudo do artigo, além de aprender a criar o Panel, obtive mais algumas habilidades úteis para dominar a programação. Muito obrigado ao autor! Aguardo ansiosamente a Parte 2.

Com todo o respeito ao autor,

B.V. Dolgikh

Claro, muito bem-vindo. Muito obrigado.

Repensando estratégias clássicas (Parte X): A IA pode operar o MACD? Repensando estratégias clássicas (Parte X): A IA pode operar o MACD?
Junte-se a nós em uma análise empírica do indicador MACD para verificar se a aplicação da inteligência artificial à estratégia que inclui esse indicador pode aumentar a precisão da previsão do par EURUSD. Avaliamos simultaneamente se é mais fácil prever o próprio indicador do que o preço, bem como se o valor do indicador permite prever os níveis futuros de preço. Forneceremos as informações necessárias para que você decida se vale a pena investir seu tempo integrando o MACD às suas estratégias de trading com o uso de inteligência artificial.
Exemplo de novo Indicador e LSTM Condicional Exemplo de novo Indicador e LSTM Condicional
Este artigo explora o desenvolvimento de um Expert Advisor (EA) para trading automatizado que combina análise técnica com previsões de deep learning.
Está chegando o novo MetaTrader 5 e MQL5 Está chegando o novo MetaTrader 5 e MQL5
Esta é apenas uma breve resenha do MetaTrader 5. Eu não posso descrever todos os novos recursos do sistema por um período tão curto de tempo - os testes começaram em 09.09.2009. Esta é uma data simbólica, e tenho certeza que será um número de sorte. Alguns dias passaram-se desde que eu obtive a versão beta do terminal MetaTrader 5 e MQL5. Eu ainda não consegui testar todos os seus recursos, mas já estou impressionado.
Ganhe Vantagem em Qualquer Mercado (Parte V): Dados Alternativos FRED EURUSD Ganhe Vantagem em Qualquer Mercado (Parte V): Dados Alternativos FRED EURUSD
Na discussão de hoje, utilizamos dados alternativos diários do Federal Reserve de St. Louis sobre o Índice Amplo do Dólar dos EUA e um conjunto de outros indicadores macroeconômicos para prever a taxa de câmbio futura do EURUSD. Infelizmente, embora os dados aparentem ter uma correlação quase perfeita, não conseguimos obter ganhos materiais em nossa acurácia de modelo, o que pode nos indicar que os investidores talvez estejam melhores usando apenas as cotações normais do mercado.