Discussão do artigo "Handler de evento "Nova barra"" - página 2

[Excluído]  

Prival:

Raramente, mas há situações em que as cotações de um instrumento ficam congeladas por um longo tempo (vi uma situação assim no iene). E se o Expert Advisor travar nesse par, você estará em apuros se não tiver traduzido todo o código para OnTime().

Se você trabalha com OOP ou usa determinados algoritmos, não precisará traduzir o código. Mas concordo que é mais conveniente obter ticks em tempo real para todos os pares na visão geral (e não inventar algo próprio)....

Lizar:

Esse evento pode ser recebido usando TimeCuurent(), mas o que fazer com ele e como sincronizá-lo é uma questão.

O que o TimeCuurent() tem a ver com isso?
 
Interesting:
O que o TimeCuurent() tem a ver com isso?

A ajuda diz:

No manipulador OnTick(), essa função retornará a hora do tique processado de entrada. Em outros casos (por exemplo, chamada nos manipuladores OnInit(), OnDeinit(), OnTimer() e assim por diante), essa é a hora de chegada da última cotação de qualquer símbolo disponível na janela "Market Watch", a mesma hora que é mostrada no título dessa janela.

[Excluído]  
Lizar:

A sinopse diz o seguinte:

No manipulador OnTick(), essa função retornará a hora de chegada do tick que está sendo processado. Em outros casos (por exemplo, chamada nos manipuladores OnInit(), OnDeinit(), OnTimer() e assim por diante), essa é a hora de chegada da última cotação de qualquer símbolo disponível na janela "Market Watch", a mesma hora que é mostrada no cabeçalho dessa janela.

Sim, está claro. Somente se colocarmos no OnTime, poderemos atualizar a hora no máximo uma vez por minuto e, se colocarmos no OnTick() atual, corremos o risco de perder ticks em alguns pares (em múltiplos).

E o que fazer no bloco de processamento é claro (para múltiplos) - obtemos um novo valor, comparamos com o existente e concluímos se houve um novo tique ou não.

Mas me diga, por que fazer isso no Expert Advisor?

 
Lizar:

A sinopse diz o seguinte:

error. Aqui está o que a ajuda diz https://www.mql5.com/pt/docs/basis/function/events

Oevento NewTick é gerado somente para os Expert Advisors quando um novo tique é recebido no símbolo, a cujo gráfico o Expert Advisor está anexado.

Mais uma vez. Estamos falando de um Consultor Especializado que está ligado a algum símbolo. Ele é acionado pelo evento

void OnTick() {}

Se você estiver dentro dessa função e não houver ticks nesse par por mais de uma hora, não será possível fazer nada dentro de uma hora. Até agora, a única saída é fazer isso em um cronômetro, que começa independentemente da chegada de ticks no instrumento.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Interesting:

Mas se o colocarmos no OnTime, poderemos atualizar a hora no máximo uma vez por minuto e, se o colocarmos no OnTick() atual, corremos o risco de perder ticks em alguns dos pares (em múltiplos).

Esse é o ponto, podemos obter o evento, mas não podemos usá-lo.
 
Prival:

Erro. Aqui está o que a ajuda diz https://www.mql5.com/pt/docs/basis/function/events.

Mais uma vez. Estamos falando de um Expert Advisor que fica suspenso em algum símbolo. Ele é iniciado pelo evento

void OnTick() {}

Se você estiver dentro dessa função e não houver ticks nesse par por mais de uma hora, não será possível fazer nada dentro de uma hora. Até agora, a única saída é fazer isso no cronômetro, que é iniciado independentemente da chegada de ticks no instrumento.

Sim, se agirmos dentro da estrutura deste https://www.mql5.com/pt/docs/basis/function/events, concordo que a melhor opção, como vemos agora, é o OnTime. Mas isso só nos salvará da dependência da chegada de ticks. E não nos salvará do single-threadedness: enquanto estivermos processando um sinal para um instrumento, corremos o risco de perder ou atrasar o processamento de outros instrumentos. Isso é especialmente verdadeiro quando "o tempo de processamento das ordens de negociação é de 2 a 7 segundos" + requotes.

Lembrei-me do TimeCuurent() porque o Interesting começou a falar sobre ticks em tempo real para todos os pares na análise do mercado.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
[Excluído]  
Bom artigo, obrigado.
 
Obrigado
 

Artigo muito interessante. Obrigado por compartilhar tudo isso.

Entretanto, algumas observações:

Falando sobre essa função, você diz :

If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.

  • Você está certo. Mas chamar várias vezes uma função como isnewbar() durante um tique é uma prática ruim. Chame-a apenas uma vez e mantenha o resultado em uma variável.
  • O problema é que a solução que você fornece, usando uma classe sem variável estática, não resolve o que você enfatizou. E a situação agora é ainda pior. Você precisa declarar a instância de sua classe como uma variável global (objeto) e também precisa inicializá-la em OnInit(). Aquele que usará sua classe deve conhecer a operação:
  1. Sempre use uma variável global
  2. Sempre inicialize , mesmo que o símbolo eo período sejam os padrão (para gráfico de tempo).
  • Por fim, "se quisermos usar essa função, por exemplo, novamente em outro lugar no mesmo loop de cálculo". Ainda assim, ela SEMPRE RETORNA FALSO.

Você substituiu uma variável local estática por uma variável global, que é a mesma coisa, e não resolveu seu problema.


No entanto, seu artigo tem o mérito de estimular o raciocínio e oferecer ideias interessantes.

[Excluído]  

Bom artigo, obrigado por compartilhar! Tudo isso foi muito útil!

De qualquer forma, usei sua função isNewBar e ela exibe a seguinte mensagem ao compilar:"possível perda de dados devido à conversão de tipos".

Então, alterei os tipos de variável de datetime para long dessa forma:

//+------------------------------------------------------------------+
//| Retorna verdadeiro se uma nova barra tiver aparecido para um par símbolo/período
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- memorizar o tempo de abertura da última barra na variável estática
   static long last_time=0;
//--- hora atual
   long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);

//--- se for a primeira chamada da função
   if(last_time==0)
     {
      //--- definir a hora e sair
      last_time=lastbar_time;
      return(false);
     }

//--- se a hora for diferente
   if(last_time!=lastbar_time)
     {
      //--- memoriza a hora e retorna true
      last_time=lastbar_time;
      return(true);
     }
//--- se passamos para essa linha, então a barra não é nova; return false
   return(false);
  }

Agora ela compila sem nenhum aviso e parece funcionar bem. Muito obrigado!


Documentation on MQL5: Language Basics / Data Types / Typecasting
  • www.mql5.com
Language Basics / Data Types / Typecasting - Documentation on MQL5