Como detectar um novo bar - página 2

 
Ian Harris:

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

Concordo plenamente que precisamos de algo tão simples quanto possível.

Infelizmente, este código não parece funcionar para mim na MQL5.

 
RoboSpider:
Infelizmente, isto não parece funcionar na MQL5.

Os bares seriam uma má maneira de detectar um novo bar de qualquer maneira.

A única maneira confiável de verificar a existência de um novo bar é usando o tempo. Não volume, não preços, não barras.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
 
honest_knave:

Os bares seriam uma má maneira de detectar um novo bar de qualquer maneira.

A única maneira confiável de verificar a existência de um novo bar é usando o tempo. Não volume, não preços, não barras.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
Você é meu herói!
 
honest_knave Os bares seriam uma má maneira de detectar um novo bar de qualquer maneira. A única maneira confiável de verificar a existência de um novo bar é usando o tempo. Não volume, não preços, não barras.
  1. As barras não são confiáveis (uma atualização/religação pode mudar o número de barras no gráfico,)o volume não é confiável (falta de ticks,) o preço não é confiável (preços duplicados e The=== operand - fórum MQL4.) Use sempre o tempo. Vela nova - MQL4forum
 
honest_knave:

Os bares seriam uma má maneira de detectar um novo bar de qualquer maneira.

A única maneira confiável de verificar a existência de um novo bar é usando o tempo. Não volume, não preços, não barras.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }

Apenas para informação, tenho a seguinte nota em minhas referências :

//-- Às vezes a série InfoInteger com SERIES_LASTBAR_DATE retorna um erro,

Isso foi há muito tempo e eu não estou usando/testando essa função há anos, então talvez não seja mais o caso. Mas se você quiser usá-la para detectar uma nova barra, provavelmente é melhor verificá-la ;-)

 
Alain Verleyen:

Apenas para informação, tenho a seguinte nota em minhas referências :

//-- Às vezes a série InfoInteger com SERIES_LASTBAR_DATE retorna um erro,

Isso foi há muito tempo e eu não estou usando/testando essa função há anos, então talvez não seja mais o caso. Mas se você quiser usá-la para detectar uma nova barra, provavelmente é melhor verificá-la ;-)

Isso é muito críptico, Alain! Que tipo de erros?

Nesse caso, para as correias, verifique SeriesInfoInteger >0 e/ou ResetLastError antes da chamada e depois verifique _LastError após a chamada.

Ou obtenha a fonte de tempo para algum outro lugar, por exemplo, tempo[] se em OnCalculate, ou CopyTime etc etc.

 

Por que não simplesmente usar algo como isto :

   static datetime prevTime=0;
          datetime lastTime[1];
          if (CopyTime(_Symbol,_Period,0,1,lastTime)==1 && prevTime!=lastTime[0])
          {
               prevTime=lastTime[0];
              
               // ...
          }
Ele deve funcionar em todos os casos (mesmo quando há um erro com o CopyTime() ele evita uma armadilha)
 
honest_knave:

Isso é muito críptico, Alain! Que tipo de erros?

Nesse caso, para as correias, verifique SeriesInfoInteger >0 e/ou ResetLastError antes da chamada e, em seguida, verifique _LastError após a chamada.

Ou obtenha a fonte de tempo para algum outro lugar, por exemplo, tempo[] se em OnCalculate, ou CopyTime etc etc.

Só estou dizendo que quando a usei há anos atrás, a SeriesInfoInteger() não era realmente confiável. Até você para ver o que você faz com estas informações :-D
 
Alain Verleyen:
Estou apenas dizendo que quando o usei há anos atrás, o SeriesInfoInteger() não era realmente confiável. Até você para ver o que você faz com estas informações :-D

Não muito TBH - não preciso detectar um novo bar no MT5 Mas obrigado por compartilhar - vou ter isso em mente para o futuro.

Eu estava apenas tentando simplificar algo que as pessoas pareciam estar tornando excessivamente complicado.

No entanto, o princípio permanece: usar o tempo. Caveat: escolha seu método de obter tempo em seu próprio risco, tendo em conta as notas históricas incompletas de Alain (a propósito, como está o XP Service Pack 1?)

 
honest_knave:

Não muito TBH - não preciso detectar um novo bar no MT5, mas obrigado por compartilhar - vou ter isso em mente para o futuro.

Eu estava apenas tentando simplificar algo que as pessoas pareciam estar tornando excessivamente complicado.

No entanto, o princípio permanece: usar o tempo. Caveat: escolha seu método para obter tempo em seu próprio risco, tendo em conta as notas históricas incompletas de Alain (a propósito, como está o XP Service Pack 1?)

Razão: