Bibliotecas: IsNewBar

 

IsNewBar:

A classe СIsNewBar é necessária para que os Expert Advisors trabalhem de forma eficiente, fazendo os cálculos no momento em que uma nova barra aparece.

Geralmente a função IsNewBar() é usada para essa finalidade, em vez de sua classe. Mas tal função contém uma variável estática e, portanto, não podemos usar várias chamadas desta função. Para ser capaz de reutilizar tais função repetidamente no código do Expert Advisor, seria muito mais fácil torná-la um membro de classe. Neste casso, é possível realizá-lo mediante o uso de IsNewBar.mqh.

Autor: Nikolay Kositsin

 
Não sou um profissional, mas acho que esse código está errado. A variável Recount é sempre verdadeira. Portanto, cada tick será tratado como uma nova barra. Por que essa variável está lá? Por que chamar CopyClose? Os códigos postados são verificados quanto à operação correta? Se eu estiver errado, por favor, corrija e explique.
 
lordlev:
Não sou um profissional, mas acho que esse código está errado. A variável Recount é sempre verdadeira. Portanto, cada tick será tratado como uma nova barra. Por que essa variável está lá? Por que chamar CopyClose? Os códigos postados são verificados quanto à operação correta? Se eu estiver errado, por favor, corrija e explique.
Verifiquei tudo novamente e encontrei um erro. No próprio arquivo anexado não há atribuição de Recount para false, mas no código de exemplo tudo está correto.
 
lordlev:
Verifiquei tudo novamente e encontrei um erro. No próprio arquivo anexado, não há atribuição de Recount para false, mas no código de exemplo tudo está correto.
Bem, isso pode ser corrigido!
 

Talvez eu esteja errado, mas acho que essa é a maneira correta de fazer isso.

if(TNew>m_TOld)

Caso contrário, ele será impreciso durante a paginação (edição do histórico).

Você poderia explicar o que é isso e por que essa verificação é inserida?

if(...  && TNew)

Não estou entendendo. Quando essa condição é verdadeira e quando é falsa? Muito obrigado

 
Prival:

Você pode explicar o que é isso e por que essa verificação é inserida?

Não estou entendendo. Quando essa condição é verdadeira e quando é falsa? Obrigado

Na minha opinião, ela verifica se TNew não é igual a m_TOld e, ao mesmo tempo, não é igual a zero (ou seja, D'1970.01.01.01 00:00:00:00')....

A segunda condição, também na minha opinião, verifica se a função

datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));

retornou algo diferente de zero...

Agora executei o script com essa função - ele me retornou exatamente 0. Talvez por causa do fim de semana.

 
Prival:

Você pode explicar o que é isso e por que essa verificação é inserida?

Não estou entendendo. Quando essa condição é verdadeira e quando é falsa? Obrigado.

A verificação de zero é necessária para evitar o início de uma nova barra (não importa quanto tempo tenha se passado desde sua abertura) no início e na primeira verificação da condição.
 
Prival:

Talvez eu esteja errado, mas acho que essa é a maneira correta de fazer isso.

Caso contrário, haverá imprecisão do trabalho durante a paginação (edição do histórico).

Você poderia explicar o que é e por que essa verificação foi inserida?

Não estou entendendo. Quando essa condição é verdadeira e quando é falsa? Obrigado.

Acho que seria mais lógico fazer isso como uma precaução.

if(TNew>m_TOld && TNew)

Embora TNew ainda seja zero quando o histórico for trocado. Um zero pode entrar na variável TNew a qualquer momento, portanto, você deve verificar se há zero o tempo todo.

 
Automated-Trading:

IsNewBar:

Autor: Nikolay Kositsin

Há um pequeno erro em sua classe(como na maioria das funções que vi no código). A primeira vez que você chama o método IsNewBar, ele sempre retorna true, independentemente da existência de uma nova barra real .

Mas essa função contém uma variável estática e, portanto, não podemos usar várias chamadas dessa função.

Também é possível usar uma matriz bidimensional para manter o tempo de abertura da última barra.

 
Criei uma versão alternativa do CIsNewBar, sem nenhuma variável estática. Usei apenas o Tick.time_msc para fazer uma função idempotente :


class CIsNewBar{
private:
   long checkedMs;
   datetime lastBarOpenedAt;
   bool lastValue;
   CTickUtils tickUtils;
public:
   CIsNewBar(){}
   ~CIsNewBar(){}

   bool isNewBar(){
      MqlTick tick;
      SymbolInfoTick(_Symbol, tick);
      long tickMs = tick.time_msc;

      
      if(checkedMs >= tickMs){ //já processou essa função nesse tique?
         return lastValue;     //então, retorne o valor armazenado em buffer
      }

      datetime time[1];
      CopyTime(_Symbol, _Period, 0, 1, time);


      if(lastBarOpenedAt != time[0]){
         lastBarOpenedAt = time[0];
         lastValue = true;
      } else {
         lastValue = false;
      }

      checkedMs = tickMs;
      return lastValue;
   }
 

Acho que essa é uma classe leve e rápida que corrige os problemas mencionados acima.

Esta versão:

  • não emitirá um alerta falso na primeira vez em que a função.isNewBar() for chamada.
  • elimina a reinstanciação constante de novas variáveis cada vez que a função é chamada sem usar variáveis estáticas, o que acelera a execução.
  • retorna verdadeiro apenas uma vez por barra.
  • ocupa pouco espaço na memória.
class CIsNewBar{
        private:
                datetime lastBarOpenedAt;
                datetime time[1];
        public:
                CIsNewBar(){CopyTime(_Symbol, _Period, 0, 1, time);lastBarOpenedAt = time[0];}
                ~CIsNewBar(){}
                bool isNewBar(){
                        CopyTime(_Symbol, _Period, 0, 1, time);
                        if(lastBarOpenedAt < time[0]){
                                lastBarOpenedAt = time[0];
                                return(true);
                                }
                        else { return(false);}
                        }
        };

Para implementar a classe:

CIsNewBar someName;

void OnTick(){
        if(someName.isNewBar()){
                /// Chamar o manipulador de eventos da nova barra ou
                /// Fazer o trabalho para a nova barra. 
                }
        }
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5