Se você já tentou adaptar um Expert Advisor ao seu estilo de negociação e se deparou com a falta de botões ou opções rápidas, sabe o quanto um menu bem posicionado pode salvar horas de código. Em MQL5, criar menus personalizados não é só questão estética; é a ponte entre a lógica de trade e a usabilidade prática, permitindo mudar parâmetros ao vivo sem recompilar o script.
Quando o usuário sente a dificuldade
Novatos costumam usar MessageBox() ou Alert() para interagir, mas esses diálogos são invasivos e não persistem. O objetivo real é ter um menu de contexto que abra com o clique direito no gráfico, mostre opções como “Ativar Stop‑Loss”, “Alterar Lote” ou “Carregar Estratégia”. No mundo real, traders que operam múltiplos pares precisam mudar rapidamente a exposição; um menu estático não atende.
Passo a passo prático
- 1. Defina o identificador. Use
int menu_id = 0;– ele será passado emChartCreateMenu()e serve para atualizar ou remover o menu. - 2. Crie o menu. No
OnInit()chame:
ChartCreateMenu(0, menu_id, "MeuMenu", 0, 0); - 3. Insira itens. Cada chamada a
ChartAddMenuItem()recebe o ID, o texto e um parâmetro opcional:
ChartAddMenuItem(0, menu_id, "Ativar Stop‑Loss", 1); - 4. Capture o clique. No
OnChartEvent()verifiqueevent_id == CHARTEVENT_MENU_CLICKe compareevent_menu_item_idcom os valores definidos. - 5. Atualize dinamicamente. Se o usuário fechar o stop‑loss, remova o item com
ChartDeleteMenuItem()e insira “Reabrir Stop‑Loss”.
Exemplo concreto
Imagine um EA que gerencia posições de EUR/USD e GBP/USD simultaneamente. Um menu com “Fechar EUR/USD” e “Fechar GBP/USD” permite encerrar apenas a posição desejada, sem precisar parar o EA inteiro. O código abaixo ilustra a lógica de fechamento:
| Código | Descrição |
|---|---|
| if(event_menu_item_id==101) PositionClose(“EURUSD”); | Fecha EUR/USD |
| if(event_menu_item_id==102) PositionClose(“GBPUSD”); | Fecha GBP/USD |
Limitações e armadilhas
Menus não são renderizados em plataformas mobile; quem depende de dispositivos Android ou iOS verá apenas a barra padrão. Além disso, o número máximo de itens por menu é 20 – ultrapassar gera falha silenciosa. Um ponto contra‑intuitivo: inserir um submenu (via ChartCreateMenu() aninhado) consome mais recursos de CPU do que múltiplos menus simples, porque o terminal refaz a árvore a cada evento.
FAQ rápido
- Posso usar variáveis globais para controlar o estado? Sim, mas prefira
staticdentro do handler para evitar conflitos entre múltiplas instâncias. - O menu persiste após reiniciar o terminal? Não. Salve o estado em
GlobalVariableSet()e reconstrua noOnInit(). - É possível estilizar fontes? Não. MQL5 usa o estilo padrão do MetaTrader 5; a única customização é o texto.
Com o menu em mãos, a única barreira restante é a disciplina de manter o código enxuto. Teste cada item em um gráfico vazio antes de colocar em produção e, se precisar de um guia visual rápido, dê uma olhada na documentação oficial que detalha todos os parâmetros disponíveis.
Primeiros passos após a compra
Instale o MetaEditor e abra o arquivo .mq5 entregue. Verifique se o compilador não apresenta erros; caso apareça “error 2028”, ajuste a codificação para UTF‑8.
- Crie uma pasta
Includeno diretório do seu projeto. - Copie o arquivo
Menu.mqhpara essa pasta – ele contém as funções de criação de menus. - Inclua no cabeçalho do seu script:
#include.
Configuração inicial do menu
Defina o handle do menu e registre os itens principais. O código abaixo ilustra a estrutura mínima:
| Passo | Comando |
|---|---|
| 1 | int menu_handle = CreateMenu("Meu Expert"); |
| 2 | AddMenuItem(menu_handle, "Configurações", MENU_CONFIG); |
| 3 | AddMenuItem(menu_handle, "Sobre", MENU_ABOUT); |
Use MENU_CONFIG e MENU_ABOUT como identificadores únicos – eles serão recebidos na função OnChartEvent().
Rotina recomendada de desenvolvimento
Adote um ciclo de três fases: esboço → teste → refino. Cada fase tem checkpoints claros:
⚡ Dica: Se o menu não aparece, confirme que a chamada
ChartRedraw()foi feita apósMenuShow().
- Esboço: escreva todos os itens de menu em um array; isso facilita a expansão futura.
- Teste: compile e execute em uma conta demo; valide a resposta ao clicar nos itens.
- Refino: ajuste cores e fontes usando
MenuSetStyle()para melhorar a legibilidade.
Checklist operacional – evitar erros comuns
- ✔️ Verificar se o
#property strictestá habilitado. - ✔️ Garantir que
OnInit()contémMenuCreate()antes deEventSetMillisecondTimer(). - ✔️ Não usar nomes de funções já reservados pelo MQL5 (ex.:
OnDeinitdentro de um módulo de menu). - ✔️ Testar a lógica de
OnChartEvent()comCHARTEVENT_MENU_CLICKespecífico. - ✔️ Remover menus temporários ao fechar o Expert (chamar
MenuDestroy()).
Ferramentas complementares para acelerar resultados
Integre o MetaTrader 5 Strategy Tester para validar a navegação do menu em diferentes períodos. Combine com o plugin CodeBase para importar snippets de menus já testados por outros desenvolvedores.
Fluxograma simples de execução do menu
Visualize o fluxo de eventos:
| Evento | Ação | Resultado |
|---|---|---|
| OnInit() | Cria menu | Menu visível |
| OnChartEvent(CHARTEVENT_MENU_CLICK) | Identifica ID | Chama função associada |
| Função de configuração | Abre janela de parâmetros | Usuário ajusta valores |
| OnDeinit() | Destroi menu | Limpeza de recursos |
Hábitos para manter a produtividade
Reserve 15 minutos ao final de cada sessão para revisar o código do menu. Anote alterações em um changelog simples; isso evita regressões ao reutilizar o módulo em novos projetos.
Perfil ideal e limitações práticas
Se você já escreve indicadores ou robôs em MQL5 e sente que a experiência do usuário está aquém do esperado, este guia de menus personalizados pode ser a peça que falta no seu arsenal.
Quem realmente vai se beneficiar?
- Programadores intermediários que dominam a linguagem, mas ainda não exploraram a API de interface gráfica.
- Consultores que vendem EAs como produtos “prontos para uso” e precisam de controle fino sobre parâmetros sem abrir o código.
- Equipes de trading que desenvolvem ferramentas internas e precisam de menus dinâmicos para adaptar estratégias em tempo real.
Quem provavelmente perderá tempo?
- Iniciantes absolutos em MQL5, que ainda lutam para compilar “Hello World”.
- Quem busca somente scripts de curto prazo e não tem intenção de manter ou atualizar o código.
- Desenvolvedores que dependem exclusivamente de plataformas de terceiros (por ex., MetaTrader 4) onde a sintaxe difere.
Limitações contextuais
Mesmo que o módulo de menus seja robusto, ele não resolve:
- Latência de rede – menus não influenciam o tempo de execução do algoritmo.
- Restrição de recursos da conta – não há economia de memória ao usar menus.
- Compilação cruzada – o código não funciona em MetaTrader 4 sem adaptações substanciais.
FAQ contextual
- Preciso de licença extra? Não. O recurso usa apenas as bibliotecas nativas do MetaEditor.
- Posso integrar com DLLs? Sim, porém a comunicação será limitada a chamadas síncronas.
- Os menus são responsivos? Eles se comportam como objetos estáticos dentro da janela do terminal; redimensionamento automática não está incluído.
- Existe suporte oficial? O fórum da comunidade MQL5 cobre dúvidas, mas não há garantia de resposta rápida.
Checklist rápido antes de embarcar
| Item | Condição |
|---|---|
| Domínio de classes C++‑like | ✔️ |
| MetaEditor 5.00+ | ✔️ |
| Projeto com UI personalizada em mente | ✔️ |
| Disposição para depurar eventos GUI | ⚠️ |
Mini cenários de uso
Um trader de commodities quer mudar rapidamente o contrato futuro analisado. Um menu suspenso, alimentado por um array de símbolos, elimina a necessidade de recompilar o EA a cada troca. Em outra situação, um consultor cria um painel de opções avançadas para ajuste de stop‑loss dinâmico – tudo usando a mesma estrutura de menus apresentada neste material.
Observações finais e decisão editorial
O conteúdo “Como criar menus personalizados em MQL5” entrega exatamente o que promete: um conjunto de blocos de código prontos para copiar‑colar, aliado a explicações de eventos de clique e atualização de parâmetros. Não há rodeios, nem promessas de transformar um novato em guru da UI em 24 h. Se você encaixa no perfil acima, espere ganhar agilidade na customização de EAs e reduzir a fricção ao entregar produtos ao cliente.
Por outro lado, quem procura um “plug‑and‑play” sem tocar em código vai esbarrar nas limitações descritas. A decisão editorial, portanto, recomenda a aquisição apenas para desenvolvedores que já têm um pipeline de estratégia e desejam melhorar a camada de interação.
