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
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
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 ...
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.
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.
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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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?