Discussão do artigo "Criando uma Interface Gráfica de Usuário Interativa no MQL5 (Parte 1): Criando o Painel"

 

Novo artigo Criando uma Interface Gráfica de Usuário Interativa no MQL5 (Parte 1): Criando o Painel foi publicado:

Este artigo explora os passos fundamentais para criar e implementar um painel de Interface Gráfica de Usuário (GUI) utilizando a Linguagem MetaQuotes 5 (MQL5). Painéis utilitários personalizados melhoram a interação do usuário no trading, simplificando tarefas comuns e visualizando informações essenciais de trading. Ao criar painéis personalizados, os traders podem otimizar seu fluxo de trabalho e economizar tempo durante as operações de trading.

Vamos criar um painel GUI que inclua as ferramentas utilitárias mais comuns que qualquer trader possa precisar, e, assim, queremos delinear e cobrir tudo nesta série. Portanto, o número de elementos a serem abordados é extenso, mas os organizaremos para facilitar a compreensão. Usaremos 4 elementos para o nosso desenvolvimento GUI e, por meio disso, iremos criá-lo. O painel contará com a criação de botões de trading, retângulos nítidos, atualizações ao vivo, uso de emojis, diferentes estilos de fonte, rótulos, partes móveis do painel e efeitos de destaque (hover). Para ilustrar tudo isso, usamos um exemplo abaixo.

EXAMPLE GUI

Autor: Allan Munene Mutiiria

 
Ótimos tutoriais... Bom trabalho
 
Isaac Amo #:
Ótimos tutoriais... Bom trabalho

@Isaac Amo Agradeço o feedback e o reconhecimento. Estou lisonjeado. Muito obrigado.

 

Uau, muito legal da sua parte compartilhar esse artigo. Sorte de encontrar

 
Malcolm Campbell #:

Uau, muito legal da sua parte compartilhar esse artigo. Sorte de encontrar

Obrigado , @Malcolm Campbell, pela gentil avaliação e pelo feedback.

 
Alguns bytes. Na capa há uma bela interface colorida, e aqui está uma janela do Windows XP)
O artigo é útil, obrigado.
 
Petr Zharuk #:
Alguns bytes. Na capa há uma bela interface colorida, e aqui está uma janela do Windows XP)
O artigo é útil, obrigado.
Olá. Obrigado por seus comentários gentis. Fico muito grato por isso. Obrigado também e seja bem-vindo.
 

É possível fazer com que este painel se mova livremente? É possível fazer com que este painel se mova livremente?

 
Até o momento, li o artigo na diagonal em meu telefone....
Lerei mais detalhadamente em meu computador e também criarei uma interface de negociação com base em seu artigo. Até o momento, só criei botões de compra e venda que funcionam. Tenho uma ideia de como funciona. Lerei mais e criarei uma interface gráfica em meu computador também! Há muito tempo eu queria usar um utilitário muito útil para otimizar as ordens de negociação.
 

Como iniciante em MQL5, gostei muito do artigo. Obrigado pelo artigo. Mas achei que a função de desinicialização pode ser significativamente reduzida se ObjectDelete for executado em um loop por todos os nomes criados e salvos de objetos gráficos. Para fazer isso, você precisa adicionar uma matriz de cadeias de caracteres, um contador de objetos gráficos e operadores para passar nomes para a matriz nas funções de criação e inicialização de parâmetros de objetos gráficos. Eu fiz isso dessa forma:

#define  ADDOBJ ArrayResize(objectsArray, objectCount+1);\
   objectsArray[objectCount] = objName;\
   objectCount++;

string objectsArray[];
int objectCount = 0;
//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
// Excluir objetos gráficos criados
   for(int i = 0; i < objectCount; i++)
     {
      if(ObjectFind(0, objectsArray[i]) >= 0)
        {
         ObjectDelete(0, objectsArray[i]);
         // Imprimir("Objeto excluído: ", objectsArray[i]);
        }
     }
  }

Também adicionei:

input int base_x = 300;  // Recuo à esquerda
input int base_y = 100;  // Recuo superior
input bool Include_DropDown = false; // Mostrar menu suspenso
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   CreatPanel();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|    Function to create Panel                                      |
//+------------------------------------------------------------------+
void CreatPanel()
  {
   createRecLabel("MAIN_REC",10,30,250,400,clrWhite,1,clrBlack);
   createRecLabel("MAIN_SUB_REC",15,35,240,390,C'245,245,245',1,clrNONE);
   createRecLabel("MAIN_LINE_UP",15,35,240,1,C'245,245,245',1,clrNONE,BORDER_RAISED);
...

   if(Include_DropDown)
     {
      createDropDown();
     }
   ChartRedraw(0);
  }
E na função create eu a refinei assim:

 

E mudei um pouco as funções de criação de objetos gráficos:

//+------------------------------------------------------------------+
//| Função para criar rótulo de texto|
//+------------------------------------------------------------------+
bool createLabel(string objName, int xD, int yD,
                 string txt, color clrTxt = clrBlack, int fontSize = 12,
                 string font = "Arial Rounded MT Bold")
  {
   ResetLastError();

   if(!ObjectCreate(0, objName, OBJ_LABEL, 0, 0, 0))
     {
      Print(__FUNCTION__, ": failed to create the label! Error code = ", _LastError);
      return (false);
     }

   ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, base_x + xD); // Adicionar base_x +
   ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, base_y + yD); // Adicionar base_y +
   ObjectSetInteger(0, objName, OBJPROP_CORNER, CORNER_LEFT_UPPER); 
   ObjectSetString(0, objName, OBJPROP_TEXT, txt);
   ObjectSetInteger(0, objName, OBJPROP_COLOR, clrTxt);
   ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, fontSize);
   ObjectSetString(0, objName, OBJPROP_FONT, font);
   ObjectSetInteger(0, objName, OBJPROP_BACK, false);
   ObjectSetInteger(0, objName, OBJPROP_STATE, false);
   ObjectSetInteger(0, objName, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0, objName, OBJPROP_SELECTED, false);

   ADDOBJ 

   return (true);
  }