
Criando um painel MQL5 interativo usando a classe Controls (Parte 1): Configurando o painel
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:
- Descrição dos elementos
- Montagem do painel gráfico em MQL5
- 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.
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.
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.
Na janela do Assistente que será exibida, selecione EA (modelo) e clique em Avançar.
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.
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.
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.
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:
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:
Ao executar o programa, vemos o seguinte.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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:
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.
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.
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.
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:
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





- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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
Com todo o respeito ao autor,
B.V. Dolgikh
Claro, muito bem-vindo. Muito obrigado.