Na prática, quem programa indicadores ou robôs no MetaTrader 5 esbarra logo na escolha do intervalo de tempo. A maior dor costuma ser “qual timeframe usar para capturar a volatilidade sem perder a clareza?” – e a resposta está no enum ENUM_TIMEFRAMES. Este artigo mostra passo a passo como mapear cada constante ao seu gráfico real, quando cada escolha faz sentido e quais armadilhas evitar.
Mapa rápido de ENUM_TIMEFRAMES
| Constante | Período | Uso típico |
|---|---|---|
| PERIOD_M1 | 1 minuto | Scalping, detecção de micro‑picos |
| PERIOD_M5 | 5 minutos | Entrada rápida em notícias |
| PERIOD_M15 | 15 minutos | Validação de padrões intradiários |
| PERIOD_H1 | 1 hora | Trend following de curto prazo |
| PERIOD_H4 | 4 horas | Confluência entre swing e intraday |
| PERIOD_D1 | 1 dia | Estratégias de posição |
| PERIOD_W1 | 1 semana | Análise macro‑setorial |
| PERIOD_MN1 | 1 mês | Backtest de longo prazo |
Quando cada timeframe realmente ajuda
- Alta frequência: M1 e M5 são ótimos para algoritmos que operam na mesma vela. Mas a latência de dados pode desfazer ganhos; teste com
Sleep()para evitar over‑trading. - Confirmação de tendência: Combine H1 e H4. Se a direção no H4 for ascendente, use H1 apenas para pontos de entrada. Ignorar o H4 pode gerar “falsos positivos” em mercados laterais.
- Visão macro: D1, W1 e MN1 revelam ciclos de juros ou sazonalidade. Muitos traders descartam esses períodos por “não são lucrativos no curto”. Porém, alinhar a alavancagem ao ciclo macro pode melhorar o drawdown.
Exemplo prático de código
O trecho abaixo ilustra como iterar sobre ENUM_TIMEFRAMES para buscar o preço de fechamento de cada vela e armazená‑lo em um array.
void OnStart() { ENUM_TIMEFRAMES tf[] = {PERIOD_M1,PERIOD_M5,PERIOD_H1,PERIOD_D1}; double closePrices[ArraySize(tf)]; for(int i=0;iBoas práticas e armadilhas ocultas- Não misture timeframes que tenham overlap de períodos (ex.: M15 dentro de M5) ao calcular médias móveis; o viés de “double counting” inflará sinais.
- Use
CopyRates ao precisar de mais de um candle simultaneamente; evita chamadas individuais que drenam a cota de requisições. - Cache de resultados: armazene o último
iClose de cada timeframe em uma variável estática. Reduz a latência em estratégias de alta frequência. - Teste sempre em dados reais (não apenas tick simulados). Alguns brokers fornecem spreads diferentes por timeframe, o que altera o ponto de break‑even.
Próximo passo
Depois de mapear o enum ao seu plano de trade, experimente um tutorial avançado que combina múltiplos timeframes em um único filtro de volatilidade. A integração correta pode transformar um script que “funciona” em um motor de geração de valor consistente.
Passo a passo para começar a usar ENUM_TIMEFRAMES no seu EA
1. Configuração inicial no MetaEditor
- Abra o MetaEditor e crie um novo Expert Advisor.
- No cabeçalho, inclua a enumeração completa (copie‑a da tabela abaixo).
- Salve o arquivo com extensão
.mq5 e compile.
2. Tabela completa de períodos suportados
Constante Descrição Valor (minutos) PERIOD_M11 minuto 1 PERIOD_M55 minutos 5 PERIOD_M1515 minutos 15 PERIOD_M3030 minutos 30 PERIOD_H11 hora 60 PERIOD_H44 horas 240 PERIOD_D11 dia 1440 PERIOD_W11 semana 10080 PERIOD_MN11 mês 43200
3. Quando escolher cada timeframe
- Scalping (M1‑M15): alta frequência, necessidade de resposta em milissegundos.
- Day trading (M30‑H4): equilíbrio entre ruído e oportunidade.
- Swing trading (D1‑W1): foco em tendências de médio a longo prazo.
- Investimento de longo prazo (MN1): análise macro, menos chamadas ao servidor.
4. Exemplo prático de código
//+------------------------------------------------------------------+ //| Exemplo simples usando ENUM_TIMEFRAMES | //+------------------------------------------------------------------+ void OnTick() { // Obtém o preço de fechamento do último candle de 1 hora double closeH1 = iClose(_Symbol, PERIOD_H1, 0); // Média móvel de 20 períodos no timeframe de 4 horas double maH4 = iMA(_Symbol, PERIOD_H4, 20, 0, MODE_SMA, PRICE_CLOSE, 0); // Condição de compra if(closeH1 > maH4) { // Verifica se não há posições abertas if(PositionSelect(_Symbol)==false) OrderSend(_Symbol,OP_BUY,0.1,Ask,2,0,0,"Entry H1>MA H4",0,0,clrGreen); } }
5. Checklist operacional para evitar erros comuns
- ✅ Verifique se o símbolo está disponível no timeframe escolhido.
- ✅ Use
CopyRates ou iClose sempre com 0 como shift para o candle atual. - ✅ Confirme que o EA está rodando no modo Visual Mode durante testes.
- ✅ Defina
SetChartPeriod() apenas quando precisar mudar o gráfico do usuário. - ✅ Nunca misture constantes de timeframe com valores numéricos arbitrários.
6. Rotina semanal de otimização
Dia Atividade Objetivo Segunda Revisar logs de execução Detectar slippages Quarta Ajustar parâmetros de MA Melhorar taxa de acerto Sexta Backtest nos timeframes PERIOD_H1 e PERIOD_D1 Validar consistência
⚠️ Dica rápida: ao mudar o timeframe dentro do código, sempre recalcule índices de arrays. Um ArrayResize mal posicionado pode gerar out‑of‑range errors.
Com esses blocos, você já tem a base para integrar ENUM_TIMEFRAMES de forma segura e escalável. Para aprofundar, consulte a documentação oficial da MQL5 e experimente variações nos períodos de acordo com seu estilo de trading.
Perfil ideal e limitações do uso de ENUM_TIMEFRAMES
Quem desenvolve robôs ou indicadores no MQL5 e precisa mapear períodos de forma clara e segura deve considerar ENUM_TIMEFRAMES como ponto de partida obrigatório. Não é ferramenta para “código de teste rápido” de traders casuais, mas sim para projetos que exigem consistência na manipulação de intervalos de tempo.
Quem realmente se beneficia?
- Programadores de Expert Advisors (EAs) que operam múltiplos timeframes simultâneos.
- Analistas quantitativos que constroem back‑tests automatizados e precisam garantir que cada barra esteja associada ao mesmo enum.
- Desenvolvedores que mantêm bibliotecas reutilizáveis e desejam evitar hard‑coding de valores numéricos.
Quem provavelmente não terá bom aproveitamento?
- Usuários que só criam scripts pontuais de 1‑2 linhas, onde o enum adiciona complexidade sem retorno.
- Traders que dependem exclusivamente de interface gráfica e nunca mexem no código.
- Quem utiliza apenas um único timeframe fixo (ex.: M15) e não planeja expandir a lógica.
Limitações práticas
O enum cobre apenas os períodos nativos da plataforma. Não há representação direta para intervalos personalizados (ex.: 2h, 45min). Quando precisar de algo fora da lista, terá que recorrer a PeriodSeconds() ou criar constantes manuais, o que quebra a vantagem de tipagem forte.
Além disso, ENUM_TIMEFRAMES não garante que o histórico esteja disponível para todos os períodos especificados. Em contas com dados limitados, a chamada CopyRates() pode falhar silenciosamente, exigindo tratamento de erro explícito.
FAQ rápido (contextual)
Pergunta Resposta Posso usar o enum em scripts de back‑testing? Sim, ele evita confusões de conversão de string para inteiro. E se o timeframe não existir na conta? O retorno será 0; trate o caso antes de usar os dados. É possível iterar sobre todos os valores? Sim, basta fazer for(ENUM_TIMEFRAMES tf=PERIOD_M1; tf<=PERIOD_WEEK; tf++).
Checklist final de compatibilidade
- Projeto exige múltiplos timeframes? ✔
- Ambiente tem acesso ao histórico completo? ✔
- Você está confortável com enumerações em C++‑like? ✔
- Precisa de intervalos fora da lista padrão? ✘
Parecer editorial equilibrado
Em síntese, ENUM_TIMEFRAMES oferece tipagem segura, autocompletar robusto e redução de bugs típicos de valores “mágicos”. Contudo, sua utilidade despenca quando o escopo do projeto é restrito a um único timeframe ou quando se busca granularidades não suportadas nativamente. A decisão deve pesar a necessidade de manutenção a longo prazo contra a sobrecarga de aprender a enumeração.
Para quem se encaixa no perfil descrito, a adoção agora garante menos “surpresas” durante o back‑test e maior clareza ao revisar código de terceiros. Caso contrário, mantenha a abordagem minimalista e reserve o enum para futuros upgrades.
