Olá, traders! Hoje vamos falar sobre um código simples que detecta uma nova barra ou candle no MetaTrader 5 assim que ele é recebido.
O princípio por trás desse código é bem simples. Primeiro, ele armazena o tempo da barra/candle anterior. Em seguida, adicionamos 60 segundos (equivalente a 1 minuto, mas você pode ajustar o tempo conforme sua necessidade) ao tempo da barra anterior, resultando no valor de fechamento da barra/candle atual.
Agora, quando:
Tempo Atual = valor de fechamento da barra/candle atual, significa que uma nova barra foi recebida ou a barra atual foi fechada.
Neste código, utilizamos uma variável booleana chamada NewBarRecived que serve como um sinalizador para evitar chamadas múltiplas deste bloco de código. Assim, ele é executado apenas uma vez por barra/candle. As funções Comment(); e playsound("ok.wav"); são usadas para checar a precisão do código; você pode removê-las se preferir.
O sinalizador é redefinido para falso quando o tempo atual ultrapassa o tempo de fechamento da barra atual, permitindo assim checar a chegada da próxima barra (veja os comentários no código).
//+------------------------------------------------------------------+//| Novo Bar Detect.mq5 |//| por H A T Lakmal |//| https://t.me/Lakmal846 |//+------------------------------------------------------------------+bool NewBarRecived = false; // Sinalizador para controle.//+------------------------------------------------------------------+//| Função de inicialização do Expert |//+------------------------------------------------------------------+intOnInit() { //--- criar timer EventSetTimer(60); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+//| Função de desinicialização do Expert |//+------------------------------------------------------------------+voidOnDeinit(constint reason) { //--- destruir timer EventKillTimer(); } //+------------------------------------------------------------------+//| Função de tick do Expert |//+------------------------------------------------------------------+voidOnTick() { datetime TimePreviousBar = iTime(_Symbol,PERIOD_M1,1); datetime TimeCurrentClose = TimePreviousBar + 60; // Tempo de fechamento da barra atual. datetime Time_Current = TimeCurrent(); if(Time_Current == TimeCurrentClose && NewBarRecived == false) { PlaySound("ok.wav"); // Para verificar a execução. NewBarRecived = true; // Atualiza o sinalizador para evitar chamadas múltiplas. // Seu código aqui ----- (Faça algo) } else if(Time_Current > TimeCurrentClose) { NewBarRecived = false; // Reinicia o sinalizador para a próxima barra. // Seu código aqui ----- (Faça algo) } Comment("\n" + "\n" + "Tempo da Barra Atual -: " + TimeToString(TimePreviousBar,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + "\n" + "Tempo de Fechamento Atual -: " +TimeToString(TimeCurrentClose,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + "\n" + "Tempo Atual -: " + TimeToString(Time_Current,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + "\n" +"\n" + "Uma Nova Barra Recebida -: " + NewBarRecived); // Para checar os cálculos } //+------------------------------------------------------------------+//| Função do timer |//+------------------------------------------------------------------+voidOnTimer() { //--- } //+------------------------------------------------------------------+//| Função de trade |//+------------------------------------------------------------------+voidOnTrade() { //--- } //+------------------------------------------------------------------+//| Função ChartEvent |//+------------------------------------------------------------------+voidOnChartEvent(constint id, constlong &lparam, constdouble &dparam, conststring &sparam) { //--- } //+------------------------------------------------------------------+

Comentário 0