Biblioteca gráfica GUI para MetaTrader: guia de instalação e utilização
✔️ Biblioteca Gráfica GUI MT4©: https://www.mql5.com/en/market/product/206760
✔️ Biblioteca Gráfica GUI MT5©: https://www.mql5.com/en/market/product/206761
✔️ Documentação completa, galeria de elementos e ferramenta Imagem para Código5: https://www.betasoft.dev/gui-graphic-library
Uma tabela de posições, um bilhete de ordem e um gráfico ao vivo.
A GUI Graphic Library oferece aos seus Expert Advisors e indicadores uma interface completa: janelas, abas, menus, tabelas, gráficos, seletores, diálogos e widgets de negociação. Tudo é desenhado em uma única tela, o mesmo código funciona no MetaTrader 4 e no MetaTrader 5, e a API completa possui 15 funções.
Este guia orienta você desde o download até o seu primeiro painel funcional e, em seguida, aborda as tarefas que você realizará com mais frequência. Cada exemplo de código utiliza apenas o arquivo de inclusão público, permitindo que você o copie e cole em seu próprio programa.
Uma pequena parte dos 78 elementos: botões, campos de entrada, controles deslizantes e abas.
1. Antes de começar
- MetaTrader 4 ou MetaTrader 5 no Windows. As fontes e os ícones seguem a escala de exibição do Windows (100, 125, 150 e 200%).
- MetaEditor, para compilar as demonstrações e seus próprios programas.
- Nada a permitir nas opções do terminal: a biblioteca não usa nenhuma DLL, não faz requisições à web e não usa variáveis globais do terminal.
- As versões MT4 e MT5 são produtos separados. Instale a versão compatível com o seu terminal.
2. Instalação
- No terminal, selecione Arquivo e, em seguida, Abrir pasta de dados.
- Abra a pasta MQL5 (MetaTrader 5) ou a pasta MQL4 (MetaTrader 4).
- Copie cada arquivo para a pasta indicada na tabela acima: Libraries, Include, Experts e Indicators.
- Abra cada demonstração no MetaEditor e pressione F7. O resultado deve mostrar 0 erros e 0 avisos.
- De volta ao terminal, atualize o Navegador (clique com o botão direito e selecione Atualizar) para que os novos programas apareçam.
As pastas devem ter esta aparência:
MQL5/
Include/GUI_Graphic_Library.mqh
Libraries/GUI_Graphic_Library.ex5
Experts/GUI_Graphic_Library_FullDemo.mq5
GUI_Graphic_Library_ElementTests.mq5
Indicators/GUI_Graphic_Library_IndicatorWindow.mq5
GUI_Graphic_Library_IndicatorChart.mq5
MQL4/ the same files with .mq4 and .ex4
Não renomeie o arquivo da biblioteca. O arquivo de inclusão o carrega com esse nome.
Verificações após a instalação
| Verificar | Onde |
|---|---|
| O arquivo .ex5 (ou .ex4) está em Bibliotecas. | Pasta de dados |
| O arquivo .mqh está em Include. | Pasta de dados |
| A demonstração compilou sem erros. | MetaEditor |
| A demonstração mostra uma janela no gráfico. | Gráfico |
| A aba Especialistas não possui linhas "não suportado". | Terminal, Caixa de Ferramentas |
O que contém o arquivo GUI_Graphic_Library.mqh?
O arquivo de inclusão é propositalmente pequeno. Acima do bloco de importação, ele declara os enums (tipos de objeto, propriedades, eventos, temas e ícones). O bloco de importação abaixo carrega a biblioteca compilada e lista suas 15 funções. O MetaTrader 5 carrega o arquivo .ex5 e o MetaTrader 4 carrega o arquivo .ex4, escolhido pelo compilador. Você inclui o arquivo, nunca o edita.
#ifdef __MQL5__ #import "\\Market\\GUI_Graphic_Library.ex5" #else #import "\\Market\\GUI_Graphic_Library.ex4" #endif string Gui_Version(); bool Gui_Create( const long chart= 0 , const string name= "GUI_Graphic_Library" , const int subwin= 0 ); void Gui_Destroy(); void Gui_ChartEvent( const int id, const long lparam, const double dparam, const string sparam); void Gui_Timer(); void Gui_Update( const bool force= false ); bool Gui_NextEvent(ENUM_GUI_EVENT &event, int &sender, long &lparam, double &dparam, string &sparam); int Gui_Add( const ENUM_GUI_OBJECT type, const int parent, const string name, const string text, const int x, const int y, const int w, const int h); int Gui_Set( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE , const double c= EMPTY_VALUE , const double d= EMPTY_VALUE ); string Gui_Get( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE ); double Gui_GetNum( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE ); int Gui_SetArray( const int id, const ENUM_GUI_PROP prop, const double &values[], const double a= EMPTY_VALUE ); int Gui_AddImage( const string name, const uint &argb[], const int w, const int h); int Gui_Find( const string name); void Gui_BringToFront(); #import
As 15 funções na ordem em que aparecem:
| Função | O que faz | Onde você chama isso |
|---|---|---|
| Versão da GUI | Retorna a versão da biblioteca em formato de texto. | Em qualquer lugar |
| Gui_Criar | Inicia a interface gráfica em um gráfico. Passe 0 para o gráfico atual, um nome para o seu programa e um número de subjanela para os indicadores. Retorna verdadeiro se a operação for bem-sucedida. | OnInit |
| Gui_Destruir | Remove a interface gráfica e tudo o que ela representava. | OnDeinit |
| Gui_ChartEvent | Envia o evento do gráfico (mouse, teclas, cliques) para a biblioteca. | Evento OnChart |
| Temporizador Gui | Executa os temporizadores da biblioteca: animações, notificações (toasts), contadores. | Temporizador |
| Atualização da GUI | Repinta o que mudou. Passar a perna para repintar tudo. | Fim de cada manipulador |
| Gui_NextEvent | Executa o próximo evento da fila (clique, alteração, resultado de diálogo, solicitação de negociação). Retorna falso quando a fila estiver vazia. | Loop de eventos |
| Gui_Adicionar | Cria um elemento e retorna seu ID. Você fornece o tipo, o elemento pai, um nome, o texto e as coordenadas x, y, largura e altura. | OnInit |
| Conjunto de GUI | Altera uma propriedade ou executa uma ação em um elemento. Retorna -1 e registra uma linha se o elemento não suportar essa ação. | Em qualquer lugar |
| Gui_Get | Lê uma propriedade como texto. | Em qualquer lugar |
| Gui_GetNum | Lê uma propriedade como um número. | Em qualquer lugar |
| Gui_SetArray | Envia uma lista de números para um elemento, por exemplo, uma série inteira de um gráfico. | Em qualquer lugar |
| Gui_AdicionarImagem | Registra uma imagem a partir de uma matriz de pixels ARGB, permitindo que os elementos a exibam. A ferramenta "Imagem para Código" no site cria essa matriz a partir de um PNG. | OnInit |
| Gui_Find | Encontra o ID de um elemento pelo seu nome. | Em qualquer lugar |
| Gui_TrazerParaFrente | Move a interface gráfica para cima dos objetos do gráfico que você desenhou posteriormente. | Depois de criar os objetos do gráfico |
Essa é toda a interface. Todo o resto neste guia é uma combinação dessas 15 chamadas.
3. Execute a demonstração completa.
- Abra um gráfico. Uma janela grande, por exemplo, de 1280 por 720 pixels ou mais, mostra mais informações.
- Arraste GUI_Graphic_Library_FullDemo do Navegador para o gráfico.
- Utilize as abas de seção na parte superior: Início, Casos de uso, Botões, Entradas, Seletores, Dados, Gráficos, Layout, Feedback, Negociação e Configurações.
A demonstração nunca envia ordens a menos que você defina a entrada InpLiveTrading como verdadeira. Deixe-a desativada em uma conta real. Se você fechar a janela principal, o Expert Advisor será removido automaticamente.
Use GUI_Graphic_Library_ElementTests quando quiser examinar um elemento por vez: clique em um grupo na janela de seleção.
Um painel de controle construído exclusivamente com elementos da biblioteca.
4. Seu primeiro painel
Este é um Expert Advisor completo: uma janela com um campo para tamanho do lote, um botão de Compra e uma barra de status. Ele não realiza negociações; apenas exibe uma mensagem.
#include <GUI_Graphic_Library.mqh> int wMain, spLots, btnBuy, lblInfo; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit () { if (!Gui_Create( 0 , "MyPanel" )) return INIT_FAILED ; // 0 = this chart Gui_Set( 0 , GUI_PROP_THEME, "" , GUI_THEME_DARK); wMain = Gui_Add(GUI_OBJ_WINDOW, 0 , "wMain" , "My panel" , 20 , 40 , 300 , 170 ); Gui_Set(wMain, GUI_PROP_THEME_BUTTON, "" , true ); // sun / moon button Gui_Set(wMain, GUI_PROP_MAIN_WINDOW, "" , true ); // close asks to remove the program spLots = Gui_Add(GUI_OBJ_SPIN, wMain, "spLots" , "" , 10 , 10 , 280 , 30 ); Gui_Set(spLots, GUI_PROP_RANGE, "" , 0.01 , 50 , 0.01 , 2 ); // min, max, step, digits Gui_Set(spLots, GUI_PROP_VALUE, "" , 0.10 ); Gui_Set(spLots, GUI_PROP_SUFFIX, "lots" ); btnBuy = Gui_Add(GUI_OBJ_BUTTON, wMain, "btnBuy" , "BUY" , 10 , 50 , 280 , 40 ); Gui_Set(btnBuy, GUI_PROP_STYLE, "" , GUI_BUTTON_SUCCESS); Gui_Set(btnBuy, GUI_PROP_ICON, "" , GUI_ICON_ARROW_UP); lblInfo = Gui_Add(GUI_OBJ_LABEL, wMain, "lblInfo" , "Ready" , 10 , 100 , 280 , 20 ); Gui_Set(lblInfo, GUI_PROP_DIM, "" , true ); Gui_Set( 0 , GUI_PROP_REDRAW); return INIT_SUCCEEDED ; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ProcessEvents() { ENUM_GUI_EVENT ev; int sender; long l; double d; string s; while (Gui_NextEvent(ev, sender, l, d, s)) if (ev == GUI_EVENT_CLICK && sender == btnBuy) { double lots = Gui_GetNum(spLots, GUI_PROP_VALUE); Gui_Set(lblInfo, GUI_PROP_TEXT, "Buy " + DoubleToString (lots, 2 ) + " lots" ); Gui_Set( 0 , GUI_PROP_TOAST, "Buy|" + DoubleToString (lots, 2 ) + " lots" , GUI_NOTICE_SUCCESS, 3000 ); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit ( const int r) { Gui_Destroy(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer () { Gui_Timer(); ProcessEvents(); Gui_Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent ( const int id, const long &l, const double &d, const string &s) { Gui_ChartEvent(id, l, d, s); ProcessEvents(); Gui_Update(); }
O padrão nunca muda:
- O método OnInit cria a interface gráfica do usuário (GUI) e os elementos.
- OnChartEvent e OnTimer enviam eventos para a biblioteca, leem a fila e chamam Gui_Update.
- OnDeinit destrói a interface gráfica do usuário (GUI).
5. Como a biblioteca pensa
- IDs. Gui_Add retorna um ID inteiro. Guarde os IDs que precisar ou encontre um posteriormente pelo nome com Gui_Find("nome"). O ID 0 é a própria GUI: tema, notificações, diálogos, contadores.
- Elementos pais. Cada elemento é adicionado a um elemento pai, uma janela ou um contêiner. Janelas, menus e etiquetas de preço usam o elemento pai 0. Para uma aba, o elemento pai é o elemento da aba e o ID retornado é a página à qual você adiciona os elementos filhos.
- Propriedades. Gui_Set(id, propriedade, texto, a, b, c, d) altera uma propriedade ou executa uma ação. O texto é inserido no argumento texto; números, cores e enumerações são inseridos nos argumentos a até d. Gui_Get lê o texto e Gui_GetNum lê os números.
- Eventos. A biblioteca enfileira as ações do usuário. Leia a fila com Gui_NextEvent.
- As coordenadas estão em pixels na escala de 100%. A biblioteca as multiplica pela escala de exibição do Windows para você.
Se você passar uma propriedade que um elemento não suporta, nada será quebrado: a chamada retorna -1 e uma linha é escrita no log de especialistas.
6. As tarefas que você realizará com mais frequência
Leia o que o usuário digitou ou selecionou.
string name=Gui_Get(edName,GUI_PROP_TEXT); double lots=Gui_GetNum(spLots,GUI_PROP_VALUE); int tab =( int )Gui_GetNum(tabs,GUI_PROP_SELECTED);
Abas
int t=Gui_Add(GUI_OBJ_TABS,win, "tabs" , "" , 10 , 10 , 600 , 300 ); int pOrders =Gui_Add(GUI_OBJ_TAB,t, "" , "Orders" , 0 , 0 , 0 , 0 ); // returns the page int pHistory=Gui_Add(GUI_OBJ_TAB,t, "" , "History" , 0 , 0 , 0 , 0 ); Gui_Add(GUI_OBJ_BUTTON,pOrders, "b1" , "Close all" , 10 , 10 , 120 , 30 );
Tabelas
int tb=Gui_Add(GUI_OBJ_TABLE,page, "tbl" , "" , 10 , 10 , 600 , 300 ); Gui_Set(tb,GUI_PROP_ADD_COLUMN, "Symbol" , 120 ,GUI_ALIGN_LEFT); Gui_Set(tb,GUI_PROP_ADD_COLUMN, "Strength" , 130 ,GUI_ALIGN_LEFT,GUI_COL_PROGRESS); Gui_Set(tb,GUI_PROP_ADD_BUTTON_COLUMN, "Action" , 100 ,GUI_BUTTON_PRIMARY); Gui_Set(tb,GUI_PROP_ADD_ROW, "EURUSD|64|Trade" ); Gui_Set(tb,GUI_PROP_SORT, "" , 0 , true );
Um clique em uma célula de botão envia o evento GUI_EVENT_CELL_BUTTON com a linha em lparam e a coluna em dparam.
Gráficos
int ch=Gui_Add(GUI_OBJ_LINECHART,page, "chart" , "Price" , 10 , 10 , 500 , 260 ); int ln=Gui_Set(ch,GUI_PROP_ADD_SERIES, "Close" , clrDodgerBlue ); // returns the series index double closes[]; CopyClose ( _Symbol , PERIOD_H1 , 0 , 100 ,closes); Gui_SetArray(ch,GUI_PROP_SERIES,closes,ln); // a whole series at once int cd=Gui_Add(GUI_OBJ_CANDLECHART,page, "cd" , _Symbol , 10 , 280 , 500 , 260 ); Gui_Set(cd,GUI_PROP_LOAD_BARS, _Symbol , 80 ); Gui_Set(cd,GUI_PROP_ADD_MA, "" , 20 , clrDodgerBlue ); Gui_Set(cd,GUI_PROP_ADD_BANDS, "" , 20 , 2.0 );
Diálogos e brindes
enum { CMD_CLOSE_ALL= 500 }; Gui_Set( 0 ,GUI_PROP_CONFIRM, "Close all|Close every position?|Close|Cancel" ,CMD_CLOSE_ALL); // later, in the event loop: if (ev==GUI_EVENT_DIALOG && Gui_GetNum(sender,GUI_PROP_CMD)==CMD_CLOSE_ALL && l== 0 ) CloseAll(); // l = button index, -1 = cancelled Gui_Set( 0 ,GUI_PROP_TOAST, "Order|Filled" ,GUI_NOTICE_SUCCESS, 3000 );
Temas e cores
Gui_Set( 0 ,GUI_PROP_THEME, "" ,GUI_THEME_MIDNIGHT); // DARK, LIGHT, MIDNIGHT, HIGHCONTRAST, SOFT Gui_Set( 0 ,GUI_PROP_ACCENT, "" , clrOrange ); Gui_Set( 0 ,GUI_PROP_RADIUS, "" , 10 );
Lembre-se das janelas e dos valores.
Gui_Set( 0 ,GUI_PROP_AUTO_LAYOUT, "" , true ); // load now, save when the GUI is destroyed Gui_Set( 0 ,GUI_PROP_LOAD_VALUES); // in OnInit Gui_Set( 0 ,GUI_PROP_SAVE_VALUES); // in OnDeinit
Ambos utilizam pequenos arquivos de texto. Nenhuma variável global de terminal é usada.
Faça alguma coisa a cada segundo
Gui_Set( 0 ,GUI_PROP_COUNTER, "refresh" , 1000 , true ); // name, ms, repeat // in OnTimer: if (Gui_GetNum( 0 ,GUI_PROP_COUNTER_DONE, "refresh" )!= 0 ) RefreshNumbers();
7. Um painel de negociação com sua própria função de pedidos
O formulário de ordens, o painel de posições e a calculadora de risco leem a conta e o símbolo, e então fornecem os eventos. Eles nunca enviam ordens. Você decide o que acontece quando o usuário clica em Comprar ou Vender.
#include <GUI_Graphic_Library.mqh> #ifdef __MQL5__ #include <Trade\Trade.mqh> CTrade g_trade; #endif input bool InpLiveTrading = false ; // send real orders int g_ticket = 0 ; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit () { if (!Gui_Create( 0 , "GUI_TradePanel" )) return INIT_FAILED ; int w = Gui_Add(GUI_OBJ_WINDOW, 0 , "w" , "Trade" , 20 , 40 , 360 , 260 ); Gui_Set(w, GUI_PROP_MAIN_WINDOW, "" , true ); g_ticket = Gui_Add(GUI_OBJ_ORDERTICKET, w, "ticket" , _Symbol , 10 , 10 , 340 , 212 ); Gui_Set(g_ticket, GUI_PROP_LOTS, "" , 0.10 ); Gui_Set(g_ticket, GUI_PROP_STOP_POINTS, "" , 300 ); Gui_Set(g_ticket, GUI_PROP_TP_POINTS, "" , 600 ); Gui_Set(g_ticket, GUI_PROP_SHOW_LINES, "" , true ); // SL and TP lines on the chart Gui_Set( 0 , GUI_PROP_CLEAR_EVENTS); return INIT_SUCCEEDED ; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void MyTrade( const bool buy, const double lots, const double sl, const double tp) { if (!InpLiveTrading) { Print ( "Trading is off. Would " , buy ? "buy " : "sell " , lots, " lots" ); return ; } #ifdef __MQL5__ if (buy) g_trade.Buy(lots, _Symbol , 0.0 , sl, tp); else g_trade.Sell(lots, _Symbol , 0.0 , sl, tp); #else if (buy) OrderSend ( _Symbol , OP_BUY, lots, Ask, 3 , sl, tp, "GUI" , 0 , 0 , clrGreen ); else OrderSend ( _Symbol , OP_SELL, lots, Bid, 3 , sl, tp, "GUI" , 0 , 0 , clrRed ); #endif } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ProcessEvents() { ENUM_GUI_EVENT ev; int sender; long l; double d; string s; while (Gui_NextEvent(ev, sender, l, d, s)) if (ev == GUI_EVENT_TRADE) // l: 0 buy, 1 sell d: lots s: "sl|tp" prices { string p[]; StringSplit (s, '|' , p); double sl = ( ArraySize (p) > 0 ) ? StringToDouble (p[ 0 ]) : 0.0 ; double tp = ( ArraySize (p) > 1 ) ? StringToDouble (p[ 1 ]) : 0.0 ; MyTrade(l == 0 , d, sl, tp); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit ( const int r) { Gui_Destroy(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer () { Gui_Timer(); ProcessEvents(); Gui_Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent ( const int id, const long &l, const double &d, const string &s) { Gui_ChartEvent(id, l, d, s); ProcessEvents(); Gui_Update(); }
Faça o teste primeiro em uma conta demo. Antes de enviar ordens reais, verifique também o tamanho do lote em relação aos valores mínimo, máximo e incremento definidos para o símbolo, e a distância do stop em relação ao nível de stop da corretora.
As posições funcionam da mesma maneira: adicione GUI_OBJ_POSITIONS e, em seguida, reaja a GUI_EVENT_POSITION (lparam é o parâmetro, dparam é 1 para Fechar e 2 para Modificar).
8. Utilizando-o em um indicador
Um indicador pode desenhar a GUI em sua própria subjanela. Passe o número dessa janela para Gui_Create:
#property indicator_separate_window int OnInit () { int sub= ChartWindowFind (); Gui_Create( 0 , "GUI_MyIndicator" ,sub); // add windows and controls as usual return INIT_SUCCEEDED ; }
Para desenhar no gráfico de preços a partir de um indicador, use a subjanela 0. As duas demonstrações de indicadores são exemplos completos. Existe uma interface gráfica para cada programa e gráfico, portanto, dê a cada programa seu próprio nome de interface gráfica.
9. MetaTrader 4 e MetaTrader 5
| Tópico | MetaTrader 4 | MetaTrader 5 |
|---|---|---|
| Arquivo da biblioteca | .ex4 | .ex5 |
| Menu de contexto | Pressione e segure o botão esquerdo ou Ctrl + clique. | Clique com o botão direito do mouse |
| roda do mouse | Não foi enviado pelo terminal. Use as barras de rolagem. | Funciona |
| Profundidade do mercado | Adicione os níveis você mesmo | Lê o livro do mercado |
| Calendário econômico | Adicione as linhas você mesmo | Carrega do terminal |
| Digitando | Mapa de legendas dos EUA integrado | Qualquer layout de teclado funciona |
10. Se algo não funcionar
| Problema | O que fazer |
|---|---|
| Nada aparece no gráfico. | Verifique se Gui_Create retornou verdadeiro e leia as últimas linhas da guia Especialistas. |
| O compilador não consegue abrir o arquivo GUI_Graphic_Library.mqh. | O arquivo de inclusão não está na pasta Include da mesma pasta de dados que o seu programa. |
| O programa não consegue carregar a biblioteca em tempo de execução. | O arquivo .ex5 ou .ex4 está faltando nas Bibliotecas, ou seu nome foi alterado. |
| Um valor alterado no código não é exibido. | Chame Gui_Update() no final do seu manipulador. |
| A aba Especialistas indica que uma propriedade não é suportada. | Essa propriedade não existe para esse elemento. Consulte a referência da API. |
| Dois programas disputam a mesma parada. | Atribua um nome diferente a cada um deles em Gui_Create. |
| As linhas do gráfico cobrem a interface gráfica do usuário. | Chame Gui_BringToFront() depois de criar os objetos do gráfico. |
| O texto é muito pequeno ou muito grande. | Defina Gui_Set(0,GUI_PROP_SCALE,"",1.5), ou reinicie o terminal após alterar a escala do Windows. |
| Você quer ver o que a biblioteca está fazendo. | Ative Gui_Set(0,GUI_PROP_DEBUG,"",true) para a sobreposição de depuração. |
11. Dicas
- Chame Gui_Update() ao final de cada manipulador. Isso redesenha apenas o que foi alterado.
- Páginas com abas ocultas e janelas recolhidas não causam repintura, portanto, atualizá-las por meio de um temporizador é uma solução barata.
- Use GUI_PROP_MAX_FPS para limitar a taxa de quadros se você executar muitos gráficos.
- Use GUI_PROP_CLEAR_EVENTS no final de OnInit para descartar os eventos enfileirados durante a construção do painel.
- Utilize a ferramenta "Imagem para Código" no site para converter um logotipo ou ícone PNG em uma matriz para Gui_AddImage.
- Os novos valores de enumeração são adicionados apenas no final, portanto, os programas compilados com um arquivo de inclusão mais antigo continuam funcionando após uma atualização. Substitua o arquivo da biblioteca e o arquivo de inclusão simultaneamente.
12. Para onde ir a seguir
- Galeria de elementos, instalação, guia, referência da API, conversão de imagem em código e ajuda: https://www.betasoft.dev/gui-graphic-library
- Versão MetaTrader 5: https://www.mql5.com/en/market/product/206761
- Versão MetaTrader 4: https://www.mql5.com/en/market/product/206760
Sua opinião é bem-vinda. Para perguntas ou sugestões de melhoria, escreva nos comentários do produto ou envie-me uma mensagem em MQL5.com.





