Para criar um Expert Advisor (EA) em MQL5, você abre o MetaEditor a partir do MetaTrader 5, cria um novo Expert Advisor, escreve a lógica nas funções OnInit e OnTick, compila e testa no Strategy Tester. Abaixo está um EA completo e funcional de cruzamento de médias, com stop, alvo e controle de uma posição por vez, explicado linha a linha.
Em resumo: um EA é um programa que roda dentro do MetaTrader 5 e reage a cada nova cotação pela função
OnTick. Indicadores são criados uma vez emOnInit(comoiMA) e lidos comCopyBuffer. Ordens são enviadas com a classeCTrade. Antes da conta real, teste com ticks reais, custos e forward test, e depois em demo.
O que é MQL5 e como um Expert Advisor funciona?
MQL5 é a linguagem da MetaQuotes para o MetaTrader 5, plataforma lançada em 2010. Ela não é compatível com o MQL4 do MetaTrader 4, segundo o verbete da MetaQuotes na Wikipedia. A sintaxe lembra C++.
Um EA responde a eventos. Os três principais:
| Função | Quando é chamada | Uso típico |
|---|---|---|
OnInit() | Quando o EA é anexado ao gráfico | Criar handles de indicadores, validar parâmetros |
OnTick() | A cada nova cotação do ativo | Ler indicadores, decidir, enviar ordens |
OnDeinit() | Quando o EA é removido | Liberar indicadores, limpar objetos |
A documentação de OnTick lembra que o evento de novo tick só existe para Expert Advisors; indicadores e scripts não o recebem. Se você ainda não conhece a plataforma, veja antes o guia do MetaTrader 5.
Como criar o arquivo do EA no MetaEditor?
- Abra o MetaEditorNo MetaTrader 5, pressione F4 ou clique no ícone do editor.
- Novo arquivoEscolha "Expert Advisor (modelo)", dê um nome e avance até concluir.
- Cole o códigoSubstitua o modelo pelo código deste artigo.
- CompilePressione F7. A aba de erros deve mostrar 0 erros.
- Anexe ao gráficoNo Navegador do terminal, arraste o EA para o gráfico e habilite o algotrading.
Quem não quer programar pode usar o Assistente MQL5, que gera um EA combinando módulos de sinal, gestão de capital e trailing stop. É útil para aprender a estrutura, mas limita a lógica.
O código: EA de cruzamento de médias com CTrade
#include <Trade\Trade.mqh>
input int InpFastPeriod = 9; // Média rápida (EMA)
input int InpSlowPeriod = 21; // Média lenta (EMA)
input double InpLots = 0.10; // Lote
input int InpStopPoints = 300; // Stop loss em pontos
input int InpTakePoints = 600; // Take profit em pontos
input ulong InpMagic = 20261025; // Número mágico do EA
CTrade trade;
int hFast = INVALID_HANDLE;
int hSlow = INVALID_HANDLE;
datetime lastBar = 0;
int OnInit()
{
if(InpFastPeriod >= InpSlowPeriod)
return INIT_PARAMETERS_INCORRECT;
hFast = iMA(_Symbol, _Period, InpFastPeriod, 0, MODE_EMA, PRICE_CLOSE);
hSlow = iMA(_Symbol, _Period, InpSlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
if(hFast == INVALID_HANDLE || hSlow == INVALID_HANDLE)
return INIT_FAILED;
trade.SetExpertMagicNumber(InpMagic);
trade.SetDeviationInPoints(20);
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
IndicatorRelease(hFast);
IndicatorRelease(hSlow);
}
ulong MinhaPosicao()
{
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket > 0 &&
PositionGetString(POSITION_SYMBOL) == _Symbol &&
PositionGetInteger(POSITION_MAGIC) == (long)InpMagic)
return ticket;
}
return 0;
}
void OnTick()
{
datetime barTime = iTime(_Symbol, _Period, 0);
if(barTime == lastBar)
return; // decide só uma vez por candle
lastBar = barTime;
double fast[], slow[];
ArraySetAsSeries(fast, true);
ArraySetAsSeries(slow, true);
if(CopyBuffer(hFast, 0, 1, 2, fast) < 2 || CopyBuffer(hSlow, 0, 1, 2, slow) < 2)
return;
// índice 0 = último candle fechado; índice 1 = o anterior
bool crossUp = fast[1] <= slow[1] && fast[0] > slow[0];
bool crossDown = fast[1] >= slow[1] && fast[0] < slow[0];
ulong ticket = MinhaPosicao();
if(ticket > 0 && crossDown)
trade.PositionClose(ticket);
if(ticket == 0 && crossUp)
{
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double sl = NormalizeDouble(ask - InpStopPoints * _Point, _Digits);
double tp = NormalizeDouble(ask + InpTakePoints * _Point, _Digits);
if(!trade.Buy(InpLots, _Symbol, ask, sl, tp, "Cruzamento EMA"))
Print("Falha na compra: ", trade.ResultRetcode(), " ", trade.ResultRetcodeDescription());
}
}
O que cada parte faz
#include <Trade\Trade.mqh>traz a classe CTrade, que simplifica compra, venda e fechamento.inputcria parâmetros editáveis na janela do EA e no otimizador.iMAdevolve um handle (identificador) do indicador, não o valor. Em caso de erro, retornaINVALID_HANDLE, segundo a referência do iMA.CopyBuffer(hFast, 0, 1, 2, fast)copia dois valores a partir do candle 1 (o último fechado). A documentação do CopyBuffer explica que a contagem vai do presente para o passado: posição 0 é o candle atual, ainda em formação. Ler a partir do 1 evita sinais que aparecem e somem.- Controle por candle: comparar
iTimecomlastBarfaz o EA decidir uma vez por candle, como no backtest de fechamento. - Número mágico: identifica as posições deste EA, para não mexer em operações manuais ou de outros robôs.
SetDeviationInPoints(20)define o desvio máximo aceito entre preço pedido e executado.
O EA usa duas médias exponenciais: a mais curta reage antes ao preço, e o cruzamento entre elas gera o sinal. Crédito: Alex Kofman, domínio público, via Wikimedia Commons.
As contas de pip e lote estão em pip, lote e spread; particularidades do ouro, em como operar ouro (XAUUSD).
Como testar o EA no Strategy Tester?
Abra o testador (Ctrl+R), escolha o EA, o ativo, o período e o modo de modelagem. O MetaTrader 5 oferece estes modos, segundo a ajuda oficial:
| Modo | Precisão | Quando usar |
|---|---|---|
| Every tick based on real ticks | Mais alta (ticks reais da corretora) | Validação final |
| Every tick | Alta (ticks simulados) | Quando não há ticks reais |
| 1 minute OHLC | Média | Testes rápidos |
| Open prices only | Baixa | Triagem de EAs que decidem só na abertura do candle |
| Math calculations | Sem dados de mercado | Cálculos e pesquisas internas |
Três ajustes tornam o teste mais honesto:
- Atraso de execução: o campo de execução permite simular atraso aleatório ou fixo, inclusive com base no ping real até o servidor.
- Forward: reserve 1/2, 1/3 ou 1/4 do período para um teste que não participa da otimização. Os resultados aparecem na aba “Forward”.
- Spread e custos: use o spread real ou um valor conservador e configure comissão se a conta cobrar.
O otimizador oferece busca completa e algoritmo genético rápido (tipos de otimização). Use com moderação: otimizar demais leva ao overfitting. Os fundamentos do teste estão em backtest.
Para ver um EA sendo escrito e executado do zero em português, o vídeo abaixo cobre o fluxo completo no MetaEditor.
Melhorias para a próxima versão
Risco
- Lote calculado pelo risco em % da conta
- Limite de perda diária
- Filtro de spread máximo
Lógica
- Stop por ATR em vez de pontos fixos
- Operar vendido no cruzamento para baixo
- Filtro de tendência em tempo gráfico maior
Operação
- Filtro de horário (evitar rolagem)
- Logs detalhados em arquivo
- Tratamento de reconexão
O cálculo de lote pelo risco é a melhoria mais importante. Com conta de US$ 10.000, risco de 1% (US$ 100) e stop de 30 pips em EUR/USD, onde 1 lote padrão vale cerca de US$ 10 por pip, o lote é 100 ÷ (30 × 10) = 0,33. A fórmula e os cuidados estão em gestão de risco no trading.
Cuidados antes de usar dinheiro real
- Conta demo primeiro: compare as operações ao vivo com as do testador.
- Corretora regulada: a CVM informa que não há oferta autorizada de forex e CFD no Brasil; entenda o cenário em forex é legal no Brasil? e como escolher corretora de forex.
- Alavancagem moderada: veja alavancagem e margem.
- Nada de martingale: dobrar o lote após perdas é a forma mais rápida de zerar uma conta com um EA.
- VPS: o EA só opera com o terminal aberto e conectado.
Se você prefere prototipar antes no gráfico, o mesmo cruzamento está no tutorial de Pine Script.
Conteúdo informativo, não é recomendação de investimento.
Perguntas frequentes
O que é um Expert Advisor?
É um programa escrito em MQL5 (ou MQL4, no MetaTrader 4) que roda dentro do terminal MetaTrader, analisa as cotações e pode abrir, modificar e fechar operações automaticamente.
MQL5 é difícil?
É mais difícil que Pine Script, porque a sintaxe é parecida com C++ e você lida com handles de indicadores e envio de ordens. Com a classe CTrade da biblioteca padrão, um robô básico cabe em menos de 80 linhas.
Robô de MQL4 funciona no MetaTrader 5?
Não diretamente. O MetaTrader 5 não é compatível com o MetaTrader 4, e o código em MQL4 precisa ser reescrito ou adaptado para MQL5.
Como testar um Expert Advisor?
No Strategy Tester do MetaTrader 5, de preferência no modo de ticks reais, com spread e atraso realistas, reservando parte do período para forward test. Depois, em conta demo.
Preciso deixar o computador ligado para o robô operar?
Sim. O Expert Advisor só roda enquanto o terminal estiver aberto e conectado. Por isso muitos traders usam um servidor virtual (VPS).
Referências
Este conteúdo é informativo e não é recomendação de investimento. Encontrou um erro? Escreva para contato@boletimbitcoin.com.