Como detectar um novo bar

 

Olá a todos,

Sou um novato completo da MQL5, mas já fiz um pouco de codificação para outras plataformas.

Estou me perguntando por que é tão difícil para uma EA executar apenas em uma nova barra. Dei uma olhada em alguns dos artigos, incluindo o manipulador de eventos da "nova barra", e parece muito difícil.

Se isso não funcionar e eu tiver que usar o manipulador de eventos do "novo bar", é possível simplesmente não carregar os arquivos relevantes e copiá-los para a pasta Files(?), e depois #inclui-los? Há algum lugar onde isso seja documentado para pessoas como eu que basicamente não têm idéia do que estão fazendo?

Estou trabalhando através do tutorial em https://www.mql5.com/en/articles/100, e a primeira coisa que notei foi que a função "Barras" é usada para garantir que haja barras suficientes para realizar cálculos, mas o próximo código é aparentemente projetado para detectar uma nova barra e é (para minha compreensão de qualquer forma) uma peça de código muito complexa. A função "Bars" não poderia ser usada para detectar uma nova barra? Algo como if(Bars > int LastBarCount) {bool IsNewBar = true; LastBarCount = Bars;} else {IsNewBar = false;}. Algo como isso funcionaria?

Uma para a lista de desejos. Não seria bom se houvesse um evento OnNewBar que pudéssemos anular, em vez de OnTick? Como todos os indicadores que eu já vi funcionam em bares, não em carrapatos, eu acho que isso tornaria a vida de todos muito mais fácil.

Acabou de encontrar outra possibilidade: "BarsCalculados". Mais uma vez, não tenho certeza absoluta do que isso significa a partir da descrição, mas parece ser o número de barras que a EA já processou. Se isso fosse verdade, tudo que eu precisaria verificar é se (Bars > BarsCalculated), se for verdade, então vá e faça meu processamento, caso contrário volte? Estou perdendo alguma coisa?

Obrigado,

Ian

Step-By-Step Guide to writing an Expert Advisor in MQL5 for Beginners
  • 2010.06.09
  • Samuel
  • www.mql5.com
The Expert Advisors programming in MQL5 is simple, and you can learn it easy. In this step by step guide, you will see the basic steps required in writing a simple Expert Advisor based on a developed trading strategy. The structure of an Expert Advisor, the use of built-in technical indicators and trading functions, the details of the Debug mode and use of the Strategy Tester are presented.
 


Experimente isto em sua EA, no início da função OnTick.

// Usaremos a variável estática Old_Time para servir o tempo da barra.

// A cada execução do OnTick, verificaremos o tempo atual da barra com o tempo gravado.

// Se o tempo da barra não for igual ao tempo salvo, isso indica que temos um novo tick.


data/hora estática Old_Time;

data/hora Nova_Tempo[1];

bool IsNewBar=false;


// copiando o último tempo da barra para o elemento Novo_Tempo[0]; bool IsNewBar=false

int copied=CopyTime(_Símbolo,_Periodo,0,1,New_Time);

if(copied>0) // ok, os dados foram copiados com sucesso

{

if(Old_Time!=New_Time[0]) // se o tempo antigo não for igual ao tempo do novo bar

{

IsNewBar=true; // se não é uma primeira chamada, a nova barra apareceu

if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Temos aqui um novo bar ",New_Time[0]," o tempo antigo era ",Old_Time);

Tempo_Velho=Novo_Tempo[0]; // economizando tempo de barra

}

}

senão

{

Alerta("Erro na cópia de dados históricos, erro =",GetLastError()));

ResetLastError();

retornar;

}


//--- A EA só deve verificar a existência de novo comércio se tivermos um novo bar

if(IsNewBar==falso)

{

retornar;

}

//--- Temos barras suficientes para trabalhar com

int Mybars=Bars(_Símbolo,_Periodo);

if(Mybars<60) // se o total de barras for inferior a 60 barras

{

Alerta ("Temos menos de 60 barras, EA sairá agora!");

retornar;

}


 

Olá oneillj,

Pensei que já tinha respondido, mas parece ter desaparecido no éter da internet.

O fragmento de código que você forneceu é praticamente aquele de que eu estava reclamando em primeiro lugar. Por que é tão complexo? Achei que tinha que haver uma maneira mais fácil. Eu inventei esta, que parece funcionar. Por favor, me corrija se eu estiver errado. (Eu também tentei usar BarsCalculated, mas sempre foi igual a Bars, então o teste sempre foi avaliado como falso).

estático no LastBarCount = 0;
se (Bars(_Símbolo, _Periodo) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
mais
retornar;

;-) ;-) Ian
Documentation on MQL5: Timeseries and Indicators Access / BarsCalculated
  • www.mql5.com
Timeseries and Indicators Access / BarsCalculated - Documentation on MQL5
 
Eu uso isto...
static int BARS;
//+------------------------------------------------------------------+
//| NewBar function                                                  |
//+------------------------------------------------------------------+
bool IsNewBar()
   {
      if(BARS!=Bars(_Symbol,_Period))
        {
            BARS=Bars(_Symbol,_Period);
            return(true);
        }
      return(false);
   }
 
"New Bar" Event Handler
  • 2010.10.11
  • Konstantin Gruzdev
  • www.mql5.com
MQL5 programming language is capable of solving problems on a brand new level. Even those tasks, that already have such solutions, thanks to object oriented programming can rise to a higher level. In this article we take a specially simple example of checking new bar on a chart, that was transformed into rather powerful and versatile tool. What tool? Find out in this article.
 
ssn:
Eu uso isto...
O risco com este método é se os dados de preço de seu símbolo não começarem a partir de 4 de janeiro de 1971, então qualquer dado histórico carregado enquanto o especialista estiver anexado ao gráfico será lido como uma nova barra...
 
Comentários que não se referem a este tópico, foram movidos para "Pode o mql5 ser usado em MT4 ?
 

A função iTime dá o tempo da barra.

Quando muda, é uma nova barra.

 
Nathan5:

A função iTime dá o tempo da barra.

Quando muda, é uma nova barra.

Este tópico é sobre o mql5. Não existe a função iTime().
 

Você também pode tentar isto:


// Rates structure array for last two bars 
   MqlRates mrate[2];                 
   CopyRates(Symbol(), Period(), 0, 2, mrate);

// NEW BAR CHECK.
//---------------
   static double   dBar_Open;     
   static double   dBar_High;
   static double   dBar_Low;
   static double   dBar_Close;
   static long     lBar_Volume;
   static datetime nBar_Time;

// Boolean for new BAR confirmation. 
   bool bStart_NewBar = false;

// Check if the price data has changed tov the previous bar.   
   if(mrate[0].open != dBar_Open || mrate[0].high != dBar_High || mrate[0].low != dBar_Low || mrate[0].close != dBar_Close || mrate[0].tick_volume != lBar_Volume || mrate[0].time != nBar_Time)
         {
         bStart_NewBar = true; // A new BAR has appeared!        

// Update the new BAR data.     
         dBar_Open   = mrate[0].open;      
         dBar_High   = mrate[0].high;
         dBar_Low    = mrate[0].low;
         dBar_Close  = mrate[0].close;                 
         lBar_Volume = mrate[0].tick_volume;
         nBar_Time   = mrate[0].time;
         }

// Check if a new bar has formed.   
   if(bStart_NewBar == true)
         {
         
// Your code.          
         
         }
 
Stephen Njuki:
Eu uso isto...
Infelizmente, isto não parece funcionar na MQL5.