Se você já tentou contar ordens abertas em um EA e acabou travado com resultados inconsistentes, saiba que o ponto de ruptura costuma ser a própria chamada da função. No MQL5, OrdersTotal() parece simples, mas sua eficácia depende do contexto de execução, da filtragem de tipos de ordem e da sincronização com o fluxo de eventos de mercado. A seguir, vamos destrinchar o que acontece nos bastidores, apontar armadilhas comuns e mostrar, passo a passo, como transformar essa chamada em um contador confiável para estratégias de scalping ou de gerenciamento de risco.
Como funciona OrdersTotal()
- Retorno bruto: devolve o número total de ordens pendentes e executadas que ainda não foram fechadas, independentemente de serem de compra ou venda.
- Escopo de atualização: o valor só muda após o evento
OnTradeTransaction()ou quando o terminal processa um tick que afeta a fila de ordens. - Limitações: não diferencia entre ordens de mercado e de limite; nem distingue o estado “waiting” de “filled”.
Exemplo prático
Imagine um robô de breakout que abre até três ordens de compra simultâneas. O código abaixo ilustra a verificação segura antes de enviar uma nova ordem:
| Passo | Descrição |
|---|---|
| 1 | Obter o total bruto: int total = OrdersTotal(); |
| 2 | Iterar sobre as ordens para filtrar apenas as de compra: |
int buys = 0; for(int i=0;i
Se buys for menor que 3, o EA pode chamar OrderSend(). Caso contrário, ele aguarda a execução de OnTradeTransaction() para atualizar o contador.
Comparação com PositionsTotal()
- PositionsTotal() conta posições abertas, não ordens pendentes. Em contas netting, isso equivale a ordens líquidas, enquanto em hedge cada ordem cria uma posição distinta.
- Usar
OrdersTotal()é preferível quando o algoritmo precisa saber quantas solicitações ainda aguardam execução (por exemplo, ordens stop‑limit que ainda não foram disparadas). - Em estratégias que fecham posições imediatamente após a execução,
PositionsTotal()pode ser mais ágil, pois reflete o estado final sem a “latência” das ordens pendentes.
Armadiilhas e cenários de falha
1. Execução assíncrona: se o EA envia várias ordens dentro do mesmo tick, OrdersTotal() pode ainda registrar o valor antigo até o próximo ciclo de eventos.
2. Filtragem incompleta: ignorar OrderMagicNumber() pode levar a contar ordens de outros EAs, inflando o total.
3. Contas HEDGE vs NETTING: em hedge, duas ordens opostas contam como duas posições; em netting, são neteadas e o total pode ser menor que o número de ordens enviadas.
Como contornar
- Use
OnTradeTransaction()para atualizar variáveis globais imediatamente após cada mudança. - Armazene o
MagicNumbere filtre nas iterações. - Combine
OrdersTotal()comOrderSelect()eOrderGetInteger()para distinguir estados (waiting, filled, canceled).
Com esses ajustes, OrdersTotal() deixa de ser um simples contador e passa a ser um componente de controle de fluxo robusto, capaz de impedir overtrading e garantir que sua lógica de entrada respeite os limites operacionais definidos. Para aprofundar, veja a documentação oficial da MetaTrader que detalha os parâmetros de OrderSelect e os eventos de trade.
Primeiros passos após a compra
1. Instale o MetaEditor (versão 5 ou superior).
2. Crie um novo Expert Advisor (EA) ou abra um script existente.
3. Inclua a biblioteca padrão #include – ela já contém a definição de OrdersTotal().
Configuração inicial da função
Antes de chamar OrdersTotal() verifique se o terminal está conectado ao servidor. Um if(!IsConnected()) return; evita erros de comunicação.
Em seguida, defina o escopo desejado:
- Todos os tipos de ordem –
OrdersTotal()conta Market, Pending e Stop. - Filtrar por símbolo – use
OrderSelect(i,SELECT_BY_POS)eOrderSymbol()dentro do loop.
Exemplo prático completo
| Passo | Código |
|---|---|
| 1. Contar ordens | int total = OrdersTotal(); |
| 2. Loop de inspeção | for(int i=0;i |
Resultado: o EA elimina todas as pendentes de EURUSD em menos de 0,01 s, mantendo apenas as posições abertas.
Comparação direta: OrdersTotal() vs PositionsTotal()
- OrdersTotal() – conta cada ordem individual (inclui ordens pendentes, stop‑loss, take‑profit).
- PositionsTotal() – resume a quantidade de posições líquidas por símbolo, ignorando ordens pendentes.
Quando precisar gerenciar risco (ex.: cancelar todos os pending), OrdersTotal() é a escolha. Para monitorar exposição ao mercado, PositionsTotal() oferece a visão consolidada.
Checklist operacional para usar OrdersTotal()
- ☑ Verificar
IsConnected()antes do loop. - ☑ Definir
SELECT_BY_POSeMODE_TRADESpara percorrer todas as ordens. - ☑ Incluir tratamento de erro:
if(GetLastError()!=0) ResetLastError(); - ☑ Testar em conta demo – validar que ordens não desejadas são realmente removidas.
- ☑ Documentar filtros (símbolo, tipo) em comentários para manutenção futura.
Erros comuns e como evitá‑los
1. Loop infinito – ocorre quando OrdersTotal() é chamado dentro do próprio loop sem atualizar a variável total. Solução: calcule total antes do for ou atualize‑a após cada exclusão.
2. Seleção falha – OrderSelect() pode retornar false se a ordem já foi fechada por outro EA. Use continue para pular a iteração.
3. Mistura de modos – combinar MODE_HISTORY com OrdersTotal() gera contagem zero. Sempre use MODE_TRADES ao contar ordens ativas.
Workflow recomendado (mini‑dashboard)
1. Inicializar – conexão + variáveis.
2. Contar – int tot = OrdersTotal();
3. Filtrar – aplicar OrderSelect + condições.
4. Ação – fechar, modificar ou registrar.
5. Log – Print() com resumo de operações.
⚠️ Dica de performance: limitar o loop a
totmáximo de 200 ordens evita sobrecarga em contas muito ativas.
Para aprofundar a integração de OrdersTotal() com estratégias de gerenciamento de risco, visite a documentação oficial da MQL5.
Perfil ideal para quem quer dominar OrdersTotal() no MQL5
Se você já navega entre gráficos e automatiza estratégias, OrdersTotal() pode ser a chave que faltava. Não é para iniciantes que ainda tropeçam em OnInit() ou para quem busca apenas contar cliques.
Quem realmente tira proveito?
- Trader‑programadores que precisam monitorar ordens pendentes antes de abrir novas posições.
- Desenvolvedores de sistemas de hedge que exigem controle granular entre ordens de compra e venda.
- Analistas que criam relatórios de performance baseada no número de ordens executadas por dia.
Quem deve evitar?
- Quem trabalha exclusivamente com
PositionsTotal()e nunca lida com ordens pendentes. - Usuários que confiam apenas em sinais externos e não pretendem customizar a lógica de abertura/fechamento.
- Iniciantes que ainda não dominam a distinção entre “ordem” e “posição” no contexto do MQL5.
Limitações práticas de OrdersTotal()
OrdersTotal() conta **todas** as ordens da conta, inclusive as já fechadas que ainda permanecem no histórico enquanto o parâmetro SELECT_BY_TICKET não as filtra. Em contas com milhares de transações, a chamada pode degradar o desempenho em OnTick(). Também não diferencia tipos (market, pending, stop‑limit) – cabe ao programador acrescentar filtros.
FAQ contextual
| Pergunta | Resposta |
|---|---|
Posso usar OrdersTotal() dentro de OnTimer()? | Sim, mas limite a frequência para evitar sobrecarga de CPU. |
| Qual a diferença crítica frente a PositionsTotal()? | OrdersTotal() inclui pendentes e já executadas; PositionsTotal() só conta posições abertas. |
| Existe risco de contar ordens “ghost”? | Somente se o histórico não for limpo; use HistorySelect() para descarregar o lixo. |
Checklist rápido antes de adotar
- Mapeou todas as categorias de ordem que seu EA manipula?
- Testou o impacto em back‑test com volumes acima de 10.000 ordens?
- Implementou filtro por
OrderGetInteger(ORDER_TYPE)? - Tem rotina de limpeza de histórico para evitar “ghost orders”?
Mini cenários reais
Um scalper de 5 segundos usa OrdersTotal() para limitar a abertura de novas pending orders a no máximo 3 simultâneas. Resultado: redução de slippage em 18% nos testes de 30 dias.
Um gestor de portfólio que calcula o “turnover” diário usa OrdersTotal()-OrdersTotalPrevDay para gerar alertas. O alerta disparou 12 vezes em um mês, evitando sobreposição de posições.
Parecer editorial equilibrado
OrdersTotal() não é um “script mágico”. Ele entrega contagem bruta, exige filtragem e julgamento. Para traders que precisam de controle fino sobre ordens pendentes e histórico, o ganho de informação supera o custo de CPU. Para quem só abre e fecha posições rapidamente, PositionsTotal() costuma ser suficiente e mais leve.
Em termos de compatibilidade, o recurso funciona em todas as versões de MetaTrader 5 a partir da build 2450, mas equipamentos com processadores abaixo de 2 GHz podem apresentar latência perceptível em estratégias de alta frequência.
Próximos passos
Teste OrdersTotal() em um ambiente demo com um volume de ordens que reflita seu cenário real. Se o consumo de CPU subir acima de 25 % nas métricas de Profiler, considere migrar filtros para HistorySelect() ou reduzir a frequência de chamada.


