Se você já tentou criar janelas personalizadas em MQL5, sabe que o editor padrão costuma ser insuficiente para quem precisa de interatividade avançada. O CDialog surge como a ponte entre o código de trading e a interface gráfica, permitindo inserir botões, campos de texto e até gráficos dentro de um Expert Advisor. Porém, a curva de aprendizado não é trivial: é preciso entender a hierarquia de objetos, o ciclo de vida da janela e como sincronizar eventos de mercado com cliques do usuário.
Estrutura básica de um CDialog
Um CDialog é, essencialmente, um container que hospeda CDialogItem – botões, labels, edit boxes etc. A criação segue três passos:
- Instanciar o objeto no código do EA.
- Definir as propriedades (título, tamanho, posição).
- Adicionar itens via
DialogAdd()e vincular callbacks.
Implementando a interface
Veja um exemplo mínimo que abre uma janela com um botão “Start”.
class MyDialog : public CDialog { public: MyDialog() { SetTitle("Controle de Estratégia"); SetSize(200,100); AddButton("Start",0,10,10,80,30,OnStart); } static void OnStart(const CDialogItem *item) { Print("Botão acionado – iniciando lógica."); } }; MyDialog dlg;Observe que o callback OnStart deve ser static e receber apenas o ponteiro do item que disparou o evento. Essa limitação impede o uso direto de variáveis de instância, exigindo estratégias como ponteiros globais ou std::bind para acessar o estado do EA.
Desafios práticos
1. Sincronização de dados: ao atualizar um label com o preço atual, você precisa chamar Refresh() a cada tick. Sem isso, a janela exibe valores obsoletos.
2. Gerenciamento de memória: objetos CDialog não são automaticamente destruídos ao fechar a janela. O programador deve chamar Delete() ou usar ObjectDelete() para evitar vazamento.
Quando o CDialog falha
Em plataformas que rodam em modo “sandbox” (por exemplo, MetaTrader 5 em contas de demonstração com restrição de DLL), eventos de mouse podem ser perdidos, fazendo com que botões pareçam “congelados”. Nesses casos, a solução prática é reduzir a complexidade da UI – troque múltiplos botões por um ComboBox simples.
FAQ rápido
- Posso usar CDialog em scripts? Sim, mas scripts são executados uma única vez; a janela desaparecerá ao final da execução.
- É possível redimensionar a janela em tempo real? Apenas via
SetSize()e chamada aRefresh(). O usuário não tem controle direto. - Como capturar o fechamento da janela? Sobrescreva
OnClose()no seu dialog.
Para aprofundar, consulte a documentação oficial da MetaTrader aqui. Dominar o CDialog exige paciência, mas transforma um EA monótono em uma ferramenta interativa que pode ser ajustada em tempo real, economizando horas de recompilação.
1. Configuração inicial do CDialog
- Abra o MetaEditor e crie um novo arquivo
.mq5. - Inclua a biblioteca padrão:
| Código |
|---|
#include |
- Compile. Se houver erro “cannot open file Dialog.mqh”, verifique o caminho
Include\Dialogdentro da pastaMQL5\Include.
2. Módulos prioritários – Widgets essenciais
- CButton: aciona a lógica de negociação.
- CEdit: recebe parâmetros como lotes ou stop‑loss.
- CLabel: exibe status em tempo real.
Exemplo de criação rápida:
| Código |
|---|
// Dentro de OnInit() CButton *btnStart= new CButton(); btnStart.Create(this,0,10,10,80,30); btnStart.Text("Iniciar"); btnStart.OnClick(OnStartClick); |
3. Rotina recomendada – Checklist operacional
✔️ Verificar versão do MetaTrader 5 (mínimo 5.00).
✔️ AtualizarDialog.mqhpara a última release.
✔️ Testar a UI em modo “Strategy Tester” antes de rodar ao vivo.
4. Erros comuns e como evitá‑los
- Widget não aparece: a chamada
Show()deve ser feita apósOnInit(). Caso contrário, o objeto ainda está invisível. - Evento não dispara: assegure que o ponteiro do callback não foi sobrescrito por outra instância.
- Conflito de threads: UI roda na thread principal; evite chamadas de rede ou cálculos pesados dentro de
OnClick. UseEventKillTimer()eEventSetTimer()para delegar.
5. Aceleração de resultados – Mini‑dashboard de progresso
| Indicador | Meta | Status |
|---|---|---|
| Tempo de resposta UI | <100 ms | ✅ |
| Erros de compilação | 0 | ❌ |
| Operações disparadas | ≥10/dia | ⏳ |
6. Workflow semanal para quem está começando
- Segunda: montar a estrutura básica (classe, OnInit, Show).
- Quarta: integrar dois widgets (ex.: botão + edit) e validar callbacks.
- Sexta: testar no Strategy Tester, registrar tempo de resposta e corrigir bugs.
Ao final da semana, você deverá ter um dialog funcional que aceita entrada de lote e executa uma ordem de compra ao pressionar “Iniciar”.
7. Ferramentas complementares
- Documentação oficial da API CDialog (MetaTrader 5)
- Editor de layout visual – opcional, mas útil para alinhar objetos sem código.
Com esses blocos, a implementação do CDialog deixa de ser teoria e passa a ser prática. Siga o checklist, respeite o cronograma e ajuste os callbacks conforme a estratégia. O resultado: uma interface leve, responsiva e pronta para operar no mercado real.
Perfil Ideal e Limitações Práticas
Quem desenvolve indicadores ou EAs em MQL5 e precisa de diálogos personalizados—como caixas de mensagem, formulários de parâmetros ou painéis de controle—é o público‑alvo deste guia. Se você já domina o MessageBox() e quer migrar para CDialog para ganhar flexibilidade visual, ele vai direto ao ponto.
Por outro lado, quem só cria scripts simples, sem interface gráfica, não encontrará aqui retorno de investimento. CDialog exige conhecimento de objetos gráficos, eventos de mouse e gerenciamento de memória; a curva de aprendizado pode pesar mais que o benefício em projetos pontuais.
Limitações Contextuais
- Não funciona em plataformas móveis; o runtime de MetaTrader 5 para Android/iOS ignora objetos
CDialog. - Desempenho pode cair em back‑testing intensivo, já que cada repaint de diálogo consome ciclos CPU.
- Integração com bibliotecas externas (DLLs) pode gerar conflitos de thread se não houver sincronização adequada.
FAQ Contextual
| Pergunta | Resposta |
|---|---|
Posso usar CDialog em um Expert Advisor automatizado? | Sim, mas apenas para interações humanas; o EA deve pausar a lógica enquanto o dialog espera. |
| O que faço se o dialog não aparece em modo teste? | Desative o modo visual do testador ou use ChartRedraw() após criar o objeto. |
| É possível salvar valores inseridos pelo usuário? | Use FileWriteString() ou GlobalVariableSet() para persistência entre sessões. |
Checklist de Compatibilidade
- MetaTrader 5 build 2360 ou superior.
- Computador com GPU dedicada (não essencial, mas melhora redraw).
- Projeto que requer entrada de dados em tempo real.
- Disponibilidade para depurar eventos
OnDialogEvent().
Parecer Editorial
Em termos de praticidade, CDialog entrega o que promete: diálogos ricos sem depender de DLLs externas. Entretanto, sua adoção deve ser medida. Se seu fluxo de trabalho envolve constantes ajustes de parâmetros por parte do trader, a ferramenta é quase indispensável. Para programadores que buscam apenas automatizar entradas fixas, a sobrecarga de código e o risco de bugs visuais superam o ganho.
Mini cenário: um trader de forex que opera duas vezes por dia abre um EA com CDialog para escolher pares e lotes. Ele reduz tempo de setup em 30 % e evita erros de digitação. Já um desenvolvedor de robôs de arbitragem de alta frequência, que roda 24/7, ignora o recurso, pois qualquer interação UI seria um gargalo.
Próximos passos recomendados: teste o dialog em ambiente demo, monitore consumo de CPU e registre event logs. Se o desempenho ficar aceitável, migre partes do seu EA que ainda usam MessageBox(). Caso contrário, mantenha a solução mínima.

