Gráfico de candles na plataforma MetaTrader 5
Trading

MQL5: como criar um Expert Advisor no MetaTrader 5 passo a passo

Aprenda MQL5 criando um Expert Advisor no MetaTrader 5: OnInit, OnTick, CTrade, médias móveis, stop e alvo, mais como testar no Strategy Tester.

Imagem: Enivid, licença CC BY-SA 4.0, via Wikimedia Commons

Por Redação Boletim Bitcoin

. Leitura de 6 min.

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 em OnInit (como iMA) e lidos com CopyBuffer. Ordens são enviadas com a classe CTrade. 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çãoQuando é chamadaUso típico
OnInit()Quando o EA é anexado ao gráficoCriar handles de indicadores, validar parâmetros
OnTick()A cada nova cotação do ativoLer indicadores, decidir, enviar ordens
OnDeinit()Quando o EA é removidoLiberar 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?

  1. Abra o MetaEditorNo MetaTrader 5, pressione F4 ou clique no ícone do editor.
  2. Novo arquivoEscolha "Expert Advisor (modelo)", dê um nome e avance até concluir.
  3. Cole o códigoSubstitua o modelo pelo código deste artigo.
  4. CompilePressione F7. A aba de erros deve mostrar 0 erros.
  5. 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.
  • input cria parâmetros editáveis na janela do EA e no otimizador.
  • iMA devolve um handle (identificador) do indicador, não o valor. Em caso de erro, retorna INVALID_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 iTime com lastBar faz 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.

Gráfico de preço com uma média móvel simples e uma média móvel exponencial sobrepostas 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.

Atenção: stop e alvo em pontos dependem do ativo. 300 pontos em EUR/USD de 5 casas são 30 pips; em ouro (XAUUSD) podem ser apenas US$ 3. Ajuste ao instrumento e confira lote mínimo, passo de lote e níveis de stop exigidos pela corretora.

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:

ModoPrecisãoQuando usar
Every tick based on real ticksMais alta (ticks reais da corretora)Validação final
Every tickAlta (ticks simulados)Quando não há ticks reais
1 minute OHLCMédiaTestes rápidos
Open prices onlyBaixaTriagem de EAs que decidem só na abertura do candle
Math calculationsSem dados de mercadoCálculos e pesquisas internas

Três ajustes tornam o teste mais honesto:

  1. 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.
  2. 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”.
  3. 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

  1. MQL5 Reference: OnTick
  2. MQL5 Reference: iMA
  3. MQL5 Reference: CopyBuffer
  4. MQL5 Reference: CTrade
  5. MetaTrader 5: teste de estratégias
  6. MetaTrader 5: tipos de otimização
  7. MetaTrader 5: Assistente MQL5
  8. Wikipedia: MetaQuotes Software
  • MQL5
  • Expert Advisor
  • MetaTrader 5
  • robô trader
  • CTrade
  • Strategy Tester
  • forex

Este conteúdo é informativo e não é recomendação de investimento. Encontrou um erro? Escreva para contato@boletimbitcoin.com.

Leia também