Se você já tentou montar um Expert Advisor e bateu na parede ao precisar de uma interface amigável, não está sozinho. No MQL5, criar caixas de diálogo parece mais um luxo do que uma necessidade, mas na prática elas salvam horas de depuração e evitam erros de input que custam dinheiro real.
Quando usar um diálogo?
Imagine um robô que compra ações só se o usuário confirmar o risco máximo. Sem um popup para validar esse parâmetro, o script pode executar blindamente. Diálogos dão ao trader o controle imediato, reduzindo a margem de erro humano.
Estrutura básica de um dialog
- DialogCreate – cria a janela.
- DialogAddControl – insere botões, campos de texto ou listas.
- DialogShow – exibe e bloqueia a execução até o usuário fechar.
Um exemplo mínimo:
| Código |
|---|
int OnInit() { long dlg=DialogCreate(0,0,200,150,"Config"); DialogAddControl(dlg,0,10,10,180,30,"Risco %:",OBJ_LABEL); DialogAddControl(dlg,1,10,50,180,30,"",OBJ_EDIT); DialogAddControl(dlg,2,50,100,100,30,"OK",OBJ_BUTTON); return(INIT_SUCCEEDED); } |
Limitações práticas
Os diálogos nativos não suportam temas personalizados. Se precisar de um visual corporativo, terá que recorrer a bibliotecas externas ou ao MetaTrader UI Toolkit, que traz CSS‑like styling, mas aumenta a complexidade e o tempo de compilação.
Falhas comuns e como evitá‑las
- Bloqueio excessivo:
DialogShowpausa o EA. UseDialogShowAsyncquando o algoritmo precisa continuar rodando. - Validação de input: Campos de texto aceitam qualquer string. Sempre converta com
StringToDoublee testeIsNaNantes de usar o valor. - Gerenciamento de recursos: Esquecer
DialogDeletedeixa objetos “fantasmas” na memória, degradando a performance.
FAQ relâmpago
- Preciso de
#property strictpara usar diálogos? Não, mas ajuda a evitar erros de tipagem. - Posso abrir vários diálogos simultâneos? Sim, porém cada um tem seu próprio ID; controle-os cuidadosamente.
- Existe suporte a arrastar a janela? Não nativamente; a única alternativa é criar um controle customizado que capture eventos de mouse.
O ponto contra‑intuitivo aqui é que, apesar de parecer “mais código”, um diálogo bem projetado reduz drasticamente a necessidade de logs extensos. Ao validar tudo na UI, você elimina a maioria dos falsos positivos que normalmente inundam o arquivo de histórico.
Primeiros passos após a instalação
Abra o MetaEditor, crie um novo Expert Advisor (.mq5) e inclua o cabeçalho padrão. Em seguida, adicione a diretiva #include – este arquivo contém as classes base para diálogos.
Se o arquivo não existir, baixe-o do repositório oficial da MQL5 Community e salve na pasta Include. A compilação deve ocorrer sem erros antes de avançar.
Configuração inicial do objeto dialog
Instancie a classe CDialog dentro da função OnInit():
| Código |
|---|
CDialog dlg; int OnInit() { dlg.Create("Configurações",0,0,300,200); dlg.AddLabel("Preço de entrada:",10,20); dlg.AddEdit("price",10,45,80); dlg.AddButton("OK",200,150,80,30); return(INIT_SUCCEEDED); } |
O método Create define título, posição (x,y) e dimensões. Cada controle recebe um ID interno usado para leitura posterior.
Módulos prioritários – captura e validação
- Leitura dos campos: no
OnChartEvent(), capture o clique no botão “OK” e recupere o valor digitado.void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { if(id==CHARTEVENT_OBJECT_CLICK && sparam=="OK") { double entry=StrToDouble(dlg.GetText("price")); if(entry<=0) Alert("Preço inválido"); else Print("Entrada: ",entry); } } - Validação de limites: use
MathRoundouNormalizeDoublepara adequar ao número de casas decimais do símbolo. - Persistência: salve o valor em um arquivo
.inicomFileWriteStringpara reutilizar em execuções futuras.
Checklist operacional – rotina recomendada
- ✅ Verificar versão do MetaTrader 5 (mínimo 5.0 Build 2620).
- ✅ Incluir
Dialogs.mqhna pastaInclude.- ✅ Compilar sem warnings – ajuste
#property strictse necessário.- ✅ Testar o diálogo em modo “Strategy Tester” antes de usar em conta real.
- ✅ Documentar IDs de controles para evitar colisões.
Erros comuns e como evitá‑los
1. Controle não aparece – a causa mais frequente é coordenada fora da área visível do gráfico. Use valores menores que a largura/altura do chart ou habilite ChartSetInteger(0,CHART_SHOW_OBJECTS,true).
2. Valor lido como string vazia – ocorre quando o OnChartEvent não está registrado. Certifique‑se de chamar EventSetMillisecondTimer(100) ou ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true) para ativar a captura.
3. Crash ao fechar o EA – libere recursos com dlg.Destroy(); dentro de OnDeinit(). Isso evita vazamento de objetos UI.
Fluxograma simplificado – do clique ao trade
| Etapa | Ação |
|---|---|
| 1. Início | Carrega EA → cria diálogo. |
| 2. Usuário | Preenche preço e confirma. |
| 3. Evento | OnChartEvent captura “OK”. |
| 4. Validação | Checa limites, converte string. |
| 5. Execução | Envia ordem de compra/venda. |
| 6. Final | Salva configuração e destrói UI. |
Produtividade prática – acelerar resultados
Integre o diálogo a um Panel de monitoramento. Enquanto o EA roda, atualize dinamicamente o campo “Preço de entrada” com dlg.SetText("price",DoubleToString(MarketInfo(Symbol(),MODE_BID),Digits)). Assim, o trader vê o preço corrente sem precisar abrir outra janela.
Combine com CSignal para gerar alertas visuais quando o preço atingir o valor definido. O fluxo completo reduz o tempo entre decisão e execução de menos de 2 segundos, ideal para estratégias de breakout.
Perfil ideal e limitações de “Como criar caixas de diálogo em MQL5”
Se você já codifica Expert Advisors e ainda depende de MessageBox() para interação, este guia chega como um diagnóstico preciso: ele serve quem precisa de UI simples, mas morre ao enfrentar layouts complexos ou integração com bibliotecas externas.
Quem vai extrair valor real
- Desenvolvedores intermediários que dominam a sintaxe MQL5, mas ainda não exploraram o
CCustomDialog. - Traders que desejam validar parâmetros antes de executar ordens – por exemplo, mudar SL/TP em tempo real.
- Freelancers que entregam scripts customizados a clientes que exigem um “campo de texto” ou “botão OK/Cancel”.
Quem deve pular agora
- Iniciantes absolutos que ainda lutam com o ambiente MetaEditor; a curva de aprendizado da API de diálogos pode ser maior que a do próprio MQL5.
- Quem busca UI de padrão “desktop” (drag‑and‑drop, temas avançados) – o módulo é restrictivo ao visual padrão da plataforma.
- Projetos que exigem desempenho em tempo real ultra‑baixo; cada caixa impõe overhead de thread UI.
Limitações práticas
- Somente funciona em clientes MetaTrader 5 desktop; MetaTrader 5 mobile e WebTrader ignoram diálogos.
- Eventos de botão são síncronos – o EA bloqueia até que o usuário responda.
- Sem suporte oficial a fontes personalizadas ou animações; tudo fica no “look‑and‑feel” padrão da plataforma.
FAQ contextual
| Pergunta | Resposta |
|---|---|
| Posso usar em teste de estratégia? | Não. O Strategy Tester não processa diálogos, levando a falhas de execução. |
| Como faço para recolher múltiplos valores? | Utilize dialog.AddEditBox() para cada campo e extraia com dialog.GetString(). |
| Existe callback assíncrono? | Não. A única forma é monitorar dialog.IsClosed() no ciclo OnTimer(). |
Checklist de compatibilidade
- MetaEditor ≥ 5.00
- Cliente desktop instalado
- Projeto não depende de testes automáticos simultâneos
- Usuário final confortável em lidar com pop‑ups
Mini cenários reais
Cenário A: Um trader de scalping usa um dialog para confirmar a ordem antes de abrir. O bloqueio de 2 s não afeta a estratégia, e o controle de risco aumenta.
Cenário B: Um algoritmo de arbitragem 24/7 tenta exibir um aviso de falha de conexão. O bloqueio interrompe a lógica, gerando perdas – aqui o dialog é um inimigo.
Parecer editorial equilibrado
O material entrega o essencial para quem quer “pôr a cara” nas estratégias, mas não tenta transformar o MQL5 em framework UI completo. É uma ferramenta de nicho, bem documentada, porém limitada ao ecossistema da MT5 desktop. Se seu workflow aceita pausas humanas, a compra é justificável; caso contrário, o custo de oportunidade pode superar o benefício.
Próximos passos: teste a amostra no seu ambiente de desenvolvimento, valide a resposta do usuário em OnTimer(), e só então decida integrar ao produto final.


