Se você já tentou programar indicadores no MetaTrader e acabou com gráficos “fora de hora” ou dados perdidos, sabe o quanto o ENUM_TIMEFRAMES pode ser um ponto de falha silencioso. A maioria dos scripts aceita o parâmetro, mas poucos explicam como alinhar o timeframe da função com o da janela de preço, o que gera resultados inesperados e, pior, perda de tempo debugando.
Por que o ENUM_TIMEFRAMES costuma confundir
- O enum aceita valores como
PERIOD_M1,PERIOD_H1etc., mas o motor de back‑testing converte tudo para o timeframe da série histórica selecionada. - Quando o script força um timeframe diferente do da janela, o MetaTrader gera “bars” vazias ou duplica candles.
- Alguns desenvolvedores ignoram a necessidade de
SeriesInfoIntegerpara garantir que o array está sincronizado.
Configuração mínima que funciona
| Passo | Ação |
|---|---|
| 1 | Defina a variável de timeframe como ENUM_TIMEFRAMES tf = PERIOD_H4; |
| 2 | Antes de chamar CopyRates, ajuste a série: SetSeriesInfoInteger(tf, SERIES_SHIFT, 0); |
| 3 | Use CopyRates(tf, 0, 0, 100, rates); garantindo que o índice “0” corresponde ao último candle do timeframe escolhido. |
Exemplo prático – cruzamento de médias em múltiplos timeframes
Imagine um Expert Advisor que compra quando a SMA de 20 períodos no H1 cruza acima da SMA de 50 no H4. O código abaixo ilustra a sequência correta:
ENUM_TIMEFRAMES tfFast = PERIOD_H1; ENUM_TIMEFRAMES tfSlow = PERIOD_H4; double fastSMA = iMA(NULL, tfFast, 20, 0, MODE_SMA, PRICE_CLOSE, 0); double slowSMA = iMA(NULL, tfSlow, 50, 0, MODE_SMA, PRICE_CLOSE, 0); if (fastSMA > slowSMA) { // abrir ordem de compra } Note que cada iMA recebe o enum próprio; não há necessidade de converter manualmente.
Limitações e armadilhas
- Back‑testing vs. tempo real: o histórico pode conter gaps que o enum não preenche, gerando “bars” nulas.
- Limite de chamadas: usar dois timeframes simultaneamente dobra o número de requisições ao servidor, podendo exceder o limite de 1000 chamadas por segundo.
- Calendário de negociação: períodos como
PERIOD_W1não respeitam o horário de verão, o que pode deslocar o início do candle.
FAQ rápido
- Posso usar ENUM_TIMEFRAMES dentro de um
OnTimer()? Sim, mas lembre‑se de recarregar a série a cada tick para evitar “stale data”. - E se eu precisar de um timeframe customizado? Não há suporte nativo; a alternativa é agrupar candles menores via loop.
- O que fazer quando
CopyRatesretorna -1? Verifique se o timeframe está habilitado nas configurações do teste e se o símbolo tem dados suficientes.
Em resumo, consultar a documentação oficial é útil, mas a prática está em alinhar o enum ao contexto da janela e validar a série antes de operar. Ajuste esses três passos e você elimina a maior parte dos “bugs” silenciosos que atrapalham estratégias multi‑timeframe.
Configuração inicial do ENUM_TIMEFRAMES
1. Abra o MetaEditor.
2. No cabeçalho do seu script, inclua #property strict para evitar conflitos.
3. Defina a variável de intervalo:
ENUM_TIMEFRAMES tf = PERIOD_H1; // 1 hora4. Salve e compile. Erros de sintaxe desaparecem se o enum estiver corretamente referenciado.
Checklist operacional – primeiros passos
| Etapa | O que fazer | Status |
|---|---|---|
| 1 | Selecionar timeframe desejado | ☐ |
| 2 | Validar disponibilidade no gráfico | ☐ |
| 3 | Mapear funções que aceitam ENUM_TIMEFRAMES | ☐ |
| 4 | Testar em modo Strategy Tester | ☐ |
Rotina recomendada para iniciantes
- Dia 1‑2: Crie um script simples que apenas imprime
EnumToString(tf)no log. - Dia 3‑4: Integre o enum em
iTime()eCopyRates()para puxar dados históricos. - Dia 5‑7: Construa um loop que percorra todos os valores do enum (de
PERIOD_M1aPERIOD_MONTH) e registre a volatilidade de cada timeframe.
Erros comuns e como evitá‑los
- Uso de valores numéricos: substituir
60porPERIOD_M1elimina ambiguidades. - Confusão entre
ENUM_TIMEFRAMESeENUM_TIMEFRAMES_CHART: o primeiro serve a funções de histórico; o segundo, apenas ao chart atual. - Esquecer de atualizar o timeframe no tester: ajuste o parâmetro “Period” nas propriedades do teste antes de rodar.
FAQ rápido
- Posso usar o enum em indicadores personalizados? Sim, basta que a função receba
ENUM_TIMEFRAMEScomo argumento. - Existe limite de timeframes simultâneos? Não há limite técnico, mas cada chamada adicional aumenta o consumo de memória.
- Como converter um timeframe em minutos? Use
PeriodSeconds(tf)/60.
⚡ Dica prática: ao debugar, imprima
EnumToString(tf)antes de cada chamada de API. Isso garante que o valor passado corresponde ao esperado.
Para aprofundar, acesse o guia oficial da MQL5 que detalha todas as funções compatíveis com ENUM_TIMEFRAMES.
Perfil ideal e limitações práticas
Quem realmente tira proveito do ENUM_TIMEFRAMES são traders que operam múltiplos prazos e desenvolvem EAs complexos. Usuários casuais, que só mexem no gráfico de 1 hora, provavelmente nunca sentirão a diferença.
Quem deve usar?
- Desenvolvedores de robôs que precisam sincronizar sinais entre H1, D1 e M15.
- Analistas quantitativos que constroem back‑tests multi‑timeframe.
- Programadores que já dominam MQL5 e entendem a diferença entre
PERIOD_CURRENTeENUM_TIMEFRAMES.
Quem não vai aproveitar?
- Iniciantes que ainda não compreenderam a lógica de candlestick.
- Quem usa apenas indicadores estáticos, sem lógica temporal.
- Plataformas que rodam em modo demo de baixa performance, onde a sobrecarga de múltiplas chamadas de
iTimepode travar.
Limitações contextuais
O enum não resolve latência de dados históricos; ele apenas padroniza o parâmetro. Em corretoras com histórico parcial, solicitar TIMEFRAME_WEEKLY pode retornar NULL. Além disso, não há proteção automática contra “gaps” de liquidez em períodos menores que 5 minutos.
FAQ contextual
| Pergunta | Resposta curta |
|---|---|
| Posso usar o ENUM em indicadores? | Sim, mas apenas em funções que aceitam timeframe como argumento. |
| O que acontece se eu passar um timeframe inexistente? | O compilador gera erro de tipo – nada de “fallback” automático. |
| É possível iterar sobre todos os valores? | Sim, usando um laço for (int tf = PERIOD_M1; tf <= PERIOD_MONTH; tf++). |
Checklist rápido antes de decidir
- Você já usa
iClose,iHighetc. com timeframe variável? - Seu código roda em tempo real ou só em back‑test?
- Seu provedor de dados oferece histórico completo nos períodos que você quer?
- Tem consciência do custo computacional extra?
Parecer editorial equilibrado
Em termos de custo‑benefício, o ENUM_TIMEFRAMES ganha pontos apenas quando a lógica do EA realmente depende de sincronização entre múltiplos gráficos. Caso contrário, ele se torna “peso morto” que só aumenta a complexidade. A robustez do enum é indiscutível: elimina erros de digitação e facilita manutenção. Mas, sem uma estratégia que exija esse nível de granularidade, o ganho marginal é próximo de zero.
Mini cenários reais
1. Scalper de 5‑min: usa apenas PERIOD_M5. Não recomendado implementar o enum.
2. Trend‑follower de daily que verifica confirmações em H4 e M30: Ideal usar o enum para parametrizar as chamadas de iMA e iRSI.
Próximos passos
Teste a inclusão do enum em um ambiente de demonstração por, no mínimo, 500 ticks. Monitore uso de CPU e verifique se o histórico solicitado está completo. Se tudo correr bem, migre para produção.
