Programar um Expert Advisor (EA) que ajuste dinamicamente o período de um indicador pode parecer simples na teoria, mas na prática o desenvolvedor esbarra em três armadilhas recorrentes: sincronização de timeframes, atualização de buffers e limites de memória. A seguir, mostro como usar Period() de forma segura, quais são as pegadinhas que costumam frustrar traders‑programadores e onde a função pode, na verdade, comprometer a robustez do seu robô.
Quando e por que usar Period()
- Objetivo: obter o timeframe atual do gráfico onde o EA está rodando, sem precisar codificar valores fixos (M1, H1, D1, etc.).
- Benefício imediato: o mesmo código funciona em múltiplos charts, reduzindo manutenção.
- Limitação:
Period()só reflete o timeframe do chart que disparou o evento. Em testes múltiplos (Strategy Tester) pode retornar valores diferentes do esperado se o teste usar “Every tick” em um timeframe não‑visualizado.
Implementação prática
Um padrão confiável envolve armazenar o valor retornado em uma variável global e compará‑lo a cada OnTick(). Se mudar, re‑inicializa os indicadores.
int currentPeriod = 0; void OnTick() { if(currentPeriod != Period()) { currentPeriod = Period(); IndicatorRelease(myHandle); myHandle = iMA(_Symbol, currentPeriod, 14, 0, MODE_SMA, PRICE_CLOSE); } // resto da lógica... } Observe que o IndicatorRelease() impede vazamento de memória – um ponto que costuma ser negligenciado por quem copia trechos de fóruns.
Exemplo de aplicação em um EA de breakout
- O EA abre posições apenas em timeframes de 15 minutos ou superiores.
- Ao detectar
Period() < PERIOD_M15, ele simplesmente retorna, evitando falsos sinais gerados por ruído em M1.
if(Period() < PERIOD_M15) return; // filtro de timeframe // cálculo de breakout... FAQ rápido
- O
Period()funciona no Strategy Tester? Sim, mas somente se o teste for configurado para o mesmo timeframe que o EA espera. Caso contrário, o valor será o do gráfico “virtual” usado pelo tester. - Posso usar
Period()dentro deOnTimer()? Funciona, porém lembre‑se de que o timer pode disparar mesmo quando o chart está inativo, gerando chamadas desnecessárias. - Existe risco de “period drift” ao mudar de conta? Não, desde que o EA seja recarregado ao mudar de conta; caso contrário, a variável global pode manter o valor antigo.
Armando a armadilha: quando Period() falha
Imagine um EA que usa Period() para definir a janela de um oscilador, mas que também recebe parâmetros de usuário para “override”. Se o usuário inserir um timeframe diferente via input, o código pode acabar usando dois períodos simultâneos, gerando sinais conflitantes. A solução é priorizar a entrada do usuário e, só então, validar se o timeframe está disponível no broker.
Para quem ainda não tem certeza de como integrar tudo sem “surpresas” no back‑test, vale a pena conferir um tutorial passo‑a‑passo que demonstra a criação do handle, a liberação e a verificação de mudanças de período. Veja o guia completo aqui.
Primeiros passos após adquirir o EA
- Instale o arquivo .ex4 na pasta
Experts\Indicatorsdo MetaTrader 5. - Reinicie a plataforma; o EA aparecerá na aba Navigator → Expert Advisors.
- Arraste‑o para o gráfico do ativo que deseja operar.
Configuração inicial do Period()
O parâmetro Period() devolve o número de minutos do timeframe ativo. Para utilizá‑lo corretamente:
| Timeframe | Valor retornado por Period() |
|---|---|
| M1 | 1 |
| M5 | 5 |
| M15 | 15 |
| H1 | 60 |
| D1 | 1440 |
Com esse retorno, você pode adaptar lógicas de entrada/saída sem reescrever o código a cada mudança de timeframe.
Rotina recomendada para adaptar o EA a múltiplos timeframes
- Defina a estratégia base: escolha a lógica que depende de
Period()(ex.: “abrir posição somente se o período for maior que 60”). - Crie variáveis globais que armazenem o valor de
Period()noOnInit()e atualizem‑no noOnTick():
int tfMinutes; int OnInit() { tfMinutes = Period(); return(INIT_SUCCEEDED); } void OnTick() { tfMinutes = Period(); // garante sincronismo // lógica dependente de tfMinutes... } - Teste em modo visual nos timeframes M15, H1 e D1. Verifique se as condições são atendidas conforme esperado.
- Implemente fallback: caso
Period()retorne um valor inesperado, force a saída da operação.
Checklist operacional – antes de rodar ao vivo
- [ ] Verificar se o EA está habilitado para AutoTrading.
- [ ] Confirmar que o parâmetro
Period()está sendo usado em todas as funções de decisão. - [ ] Executar Strategy Tester com 3 períodos diferentes (M5, H1, D1) e analisar o relatório de drawdown e profit factor.
- [ ] Salvar o log de
Print()que exibe o valor detfMinutesa cada tick – útil para depuração. - [ ] Definir limites de lote e stop‑loss baseados no timeframe (ex.: 0,01 lote para M5, 0,05 para H1).
Erros comuns e como evitá‑los
- Confundir minutos com barras –
Period()não indica número de candles, apenas a duração em minutos. UseBarspara contagem. - Hard‑code de timeframe – substituir “if (Period()==60)” por “if (tfMinutes>=60)” permite flexibilidade.
- Não atualizar a variável após mudança de timeframe – lembre‑se de reatribuir
tfMinutesdentro deOnTick()ouOnTimer().
Fluxograma simplificado – decisão baseada em Period()

FAQ rápido
- Posso usar
Period()em indicadores personalizados? Sim, o mesmo retorno se aplica a qualquer objeto gráfico. - Qual a melhor prática para mudar de timeframe sem reiniciar o EA? Atualize a variável em
OnChartEvent()detectandoCHARTEVENT_CHART_CHANGE. - Existe risco de lag ao chamar
Period()a cada tick? O custo computacional é insignificante; o gargalo costuma ser a lógica de cálculo de indicadores.
Com esses passos, o Period() deixa de ser um detalhe obscuro e passa a ser a alavanca que permite ao seu Expert Advisor operar eficientemente em qualquer timeframe. Para aprofundar a integração com outros objetos MQL5, visite a documentação oficial.
Perfil ideal e limitações práticas do uso de Period() em EAs
Se o seu EA precisa reagir exatamente ao intervalo de candles que você está analisando, Period() pode ser o trunfo ou o tiro no pé, dependendo do contexto.
Quem deve considerar Period()
- Traders de scalping que operam em M1 ou M5 e precisam sincronizar indicadores com a duração exata de cada barra.
- Desenvolvedores de estratégias multi‑timeframe que combinam, por exemplo, um sinal de 4H com filtro de 30‑min.
- Programadores que evitam hard‑coding de períodos e preferem código adaptável ao gráfico do usuário.
Quem não vai extrair valor significativo
- Investidores de longo prazo (D1+, semanal) que rodam EAs apenas para disparar ordens em fechamento de dia.
- Usuários que confiam exclusivamente em indicadores “estáticos” e não dependem da informação de período para lógica decisória.
- Quem utiliza plataformas que já abstraem o período via parâmetros de entrada e não precisa referenciá‑lo internamente.
Limitações contextuais
O retorno de Period() é um número inteiro que representa minutos. Em gráficos de ticks ou de volume, o que você recebe pode ser inesperado (0 ou 1). Além disso, ao mudar de um timeframe “equivalente” (ex.: 15M para 30M), a função não alerta para a mudança de granularidade; você terá que validar manualmente.
A função não reconhece visualizações personalizadas, como “Heikin‑Ashi”, que ainda mantêm o mesmo timeframe porém alteram a construção da barra. Nesses casos, depender de Period() para calcular volatilidade pode gerar ruído.
FAQ contextual
- Posso usar
Period()dentro deOnTimer()? Sim, mas lembre‑se que o timer roda em milissegundos; alinhar a frequência ao minuto retornado é crucial para evitar chamadas desnecessárias. - O que acontece em um gráfico M15 que recebe um evento de mudança para M30?
Period()reflete imediatamente o novo valor (30); código que já calculou valores baseados em 15 minutos pode ficar desatualizado. - Existe risco de overflow ao somar períodos? Somar vários
Period()pode ultrapassar o limite de 32 bits em loops extensos – uselongse precisar.
Checklist rápido antes de liberar o EA
| Item | Condição |
|---|---|
| Validação de timeframe | Condicional If(Period()==15) testado em M1, M5, M15. |
| Sincronização de timers | Timer = Period()*60*1000 milissegundos. |
| Fallback para gráficos não‑minutos | Implementar if(Period()<1) Period=1; |
| Teste de stress | Execução em modo visual + back‑test 6 meses. |
Parecer editorial equilibrado
Na balança, Period() entrega flexibilidade que compensa seu viés de “minutos‑puros”. Se sua estratégia depende de ajustes finos de timeframe, a função é quase indispensável. Contudo, ela não substitui boas práticas de verificação de consistência; ignorá‑las gera bugs silenciosos que só aparecem em produção.
Em cenários onde a lógica é robusta a variações de período – por exemplo, um simple breakout que dispara no fechamento da barra – usar Period() pode ser supérfluo, e o overhead de checagens adicionais pesa mais que o benefício.
Próximos passos recomendados
Implemente o snippet abaixo em um EA de teste, rode‑o em M5, M15 e H1 e observe divergências nos timestamps de entrada. Se a diferença for menor que 0,5 s, a integração está segura. Caso contrário, revise a lógica de timer.

