contador de rompimento de máxima e minima

 
Estou tentado criar um código que conte quantas vezes, durante uma operação, o preço rompe a máxima ou a mínima, no desenvolver da operação. O contador poderia alterar 2x durante o mesmo candle. Por exemplo, iniciou um candle e a máxima anterior foi rompida então um contador rompeu_max=0, adicionaria o valor 1, mudando para rompeu_max=1, caso no mesmo candle a mínima seja rompida, outro contador rompeu_min=0, poderia alterar seu valor para rompeu_min=1. Não me interessa se ele continuou rompendo a máxima ou a mínima, apenas se ele superou uma única vez a máxima e a mínima anterior. 
 if(IsNewBar()) max_contada = false;
   if(IsNewBar()) min_contada = false;
   if(contar_max_min == 1){
      if(!max_contada && rates[0].close > rates[1].high){
         rompeu_max++;
         max_contada = true;
      }
      
      if(!min_contada && rates[0].close > rates[1].low){
         rompeu_min++;
         min_contada = true;
      }
   }

a variável contar_max_min é atrelada ao início de uma operação. o estado inicial dela é 0 e quando inicia uma operação esse estado é alterado para 1.
porem com esse código que fiz ele conta 1 e 1 para os dois contadores e depois não conta mais.
o que eu fiz de errado?

[Excluído]  

Foi lhe dado uma resposta no forum em Inglês ...

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

contador alto baixo

Fernando Carreiro , 2024.12.01 16:45

Não está funcionando, porque a função IsNewBar() que todos insistem em usar, só pode ser chamada uma vez para obter o estado correto. Ela usa uma variável estática para manter o controle das coisas, então falhará em chamadas subsequentes.

Em vez disso, estude o exemplo a seguir para que você possa entender uma maneira melhor de fazê-lo...

Forum on trading, automated trading systems and testing trading strategies

high low counter

Fernando Carreiro, 2024.12.01 16:45

It is not working, because the IsNewBar() function that everyone insists on using, can only be called once to get the correct state. It uses a static variable to keep track of things, so it will fail on subsequent calls.

Instead study the following example, so that you can understand a better way to do it ...

Code Base

Detecting the start of a new bar or candle

Fernando Carreiro, 2022.04.24 00:38

Detecting the start of a new bar or candle, in the OnTick() event handler of an expert advisor.
 
Fernando Carreiro #:

Foi lhe dado uma resposta no forum em Inglês ...

Olá Fernando, obrigado por me responder nos dois idiomas, porém a sua sugestão não funcionou.
Não sou um expert em programação, mas introduzi o que vc sugeriu no meu código, não obtive erros, mas a contagem fica zerada nos dois contadores. Se tiver alguma outra sugestão para eu testar.

 
Talvez eu não tenha explicado corretamente o que estou buscando. Talvez não seja necessário um contador direto de rompimento de máxima ou mínima, um bool que mudasse de estado uma vez por barra dizendo se a maxima anterior foi rompida e outro bool dedicado a minima. Se esse bool for alterado um contador faz a soma. Não sei se isso faz sentido.
 
static datetime dtBarCurrent = 0;
   datetime dtBarPrevious = dtBarCurrent;
   dtBarCurrent = iTime(_Symbol, _Period, 0);

   // Verificar se uma nova barra foi formada
   bool bNewBarEvent = (dtBarCurrent != dtBarPrevious);

   if (bNewBarEvent) // Se nova barra detectada
   {
       // Resetar variáveis de estado no início de um novo candle
       rompeuMaxima = false;
       rompeuMinima = false;

       // Depuração
       Print("Nova barra detectada. Estado resetado.");
   }

   // Obter informações do candle anterior
   double highAnterior = iHigh(_Symbol, _Period, 1); // Máxima do candle anterior
   double lowAnterior = iLow(_Symbol, _Period, 1);   // Mínima do candle anterior
   double precoAtual = rates[0].close;                          // Preço atual do mercado

   // Verificar rompimento da máxima
   if (!rompeuMaxima && precoAtual > highAnterior && contar_max_min == 1)
   {
       rompeuMaxima = true; // Atualizar estado para true
       contadorMaxima++;    // Incrementar contador
       //Print("Rompimento da máxima detectado. Contador: ", contadorMaxima);
   }

   // Verificar rompimento da mínima
   if (!rompeuMinima && precoAtual < lowAnterior && contar_max_min == 1)
   {
       rompeuMinima = true; // Atualizar estado para true
       contadorMinima++;    // Incrementar contador
       //Print("Rompimento da mínima detectado. Contador: ", contadorMinima);
   }

Consegui fazer assim. Deu certo.