Cómo detectar un nuevo bar - página 2

 
Ian Harris:

Hola oneillj,

Pensé que había respondido ya, pero parece haber desaparecido en el éter de Internet.

El fragmento de código que ha proporcionado es más o menos el que me quejaba en primer lugar. ¿Por qué es tan complejo? Pensé que tenía que haber una manera más fácil. Se me ocurrió esta, que parece funcionar. Por favor, corregidme si me equivoco. (También intenté usar BarsCalculated, pero siempre era igual a Bars, por lo que la prueba siempre se evaluaba como falsa).

static int LastBarCount = 0;
if (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
si no
retorna;

;-) Ian

Estoy completamente de acuerdo en que necesitamos algo tan simple como sea posible.

Lamentablemente este código no parece funcionar para mí en MQL5.

 
RoboSpider:
Lamentablemente esto no parece funcionar en MQL5.

De todos modos, las barras serían una mala manera de detectar una nueva barra.

La única forma fiable de comprobar una nueva barra es utilizando el tiempo. Ni el volumen, ni los precios, ni las 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:

De todos modos, las barras serían una mala manera de detectar una nueva barra.

La única forma fiable de comprobar una nueva barra es utilizando el tiempo. Ni el volumen, ni los precios, ni las 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;
  }
¡Eres mi héroe!
 
honest_knave Bares sería una mala manera de detectar una nueva barra de todos modos. La única forma fiable de comprobar una nueva barra es utilizando el tiempo. Ni el volumen, ni los precios, ni las barras.
  1. Las barras no son fiables (un refresco/recuperación puede cambiar el número de barras en el gráfico,) el volumen no es fiable (se pierden los ticks,) el precio no es fiable (precios duplicados y El operando ==. - Foro MQL4.) Utilice siempre el tiempo. Nueva vela- Foro MQL4
 
honest_knave:

De todos modos, las barras serían una mala manera de detectar una nueva barra.

La única forma fiable de comprobar una nueva barra es utilizando el tiempo. Ni el volumen, ni los precios, ni las 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;
  }

Sólo para información, tengo la siguiente nota en mis referencias :

//-- A veces SeriesInfoInteger con SERIES_LASTBAR_DATE devuelve un error,

Eso es hace mucho tiempo y no estoy usando/probando esta función por años, así que tal vez no es más el caso. Pero si quieres usarla para detectar una nueva barra, probablemente sea mejor comprobarlo ;-)

 
Alain Verleyen:

Sólo a título informativo, tengo la siguiente nota en mis referencias :

//-- A veces SeriesInfoInteger con SERIES_LASTBAR_DATE devuelve un error,

Eso es hace mucho tiempo y no estoy usando/probando esta función desde hace años, así que tal vez no es más el caso. Pero si quieres usarla para detectar una nueva barra, probablemente sea mejor comprobarlo ;-)

¡Eso es muy críptico Alain! ¿Qué tipo de errores?

En cuyo caso, para los corchetes o bien comprueba SeriesInfoInteger >0 y/o ResetLastError antes de la llamada y luego comprueba _LastError después de la llamada.

O bien obtenga la fuente de tiempo de algún otro lugar, por ejemplo, time[] si en OnCalculate, o CopyTime etc.

 

Por qué no usar simplemente algo como esto :

   static datetime prevTime=0;
          datetime lastTime[1];
          if (CopyTime(_Symbol,_Period,0,1,lastTime)==1 && prevTime!=lastTime[0])
          {
               prevTime=lastTime[0];
              
               // ...
          }
Debería funcionar en todos los casos (incluso cuando hay un error con CopyTime() evita una trampa)
 
honest_knave:

¡Eso es muy críptico Alain! ¿Qué tipo de errores?

En cuyo caso, para las correas o comprueba SeriesInfoInteger >0 y/o ResetLastError antes de la llamada y luego comprueba _LastError después de la llamada.

O bien obtenga la fuente de tiempo de algún otro lugar, por ejemplo, time[] si en OnCalculate, o CopyTime etc.

Sólo digo que cuando lo usaba hace años SeriesInfoInteger() no era realmente fiable. A ver qué haces con esta información :-D
 
Alain Verleyen:
Sólo digo que cuando yo lo usaba hace años SeriesInfoInteger() no era realmente fiable. A ver qué haces con esta información :-D

No mucho TBH - No necesito detectar una nueva barra en MT5 Pero gracias por compartir - Lo tendré en cuenta para el futuro.

Sólo estaba tratando de simplificar algo que la gente parecía estar haciendo excesivamente complicado.

Sin embargo, el principio sigue siendo: utilizar el tiempo. Advertencia: elija su método de obtención del tiempo por su cuenta y riesgo teniendo en cuenta las incompletas notas históricas de Alain (por cierto, ¿cómo va el XP Service Pack 1?)

 
honest_knave:

No mucho TBH - No necesito detectar una nueva barra en MT5 Pero gracias por compartir - Lo tendré en cuenta para el futuro.

Sólo trataba de simplificar algo que la gente parecía complicar en exceso.

Sin embargo, el principio sigue siendo: utilizar el tiempo. Advertencia: elija su método para obtener el tiempo a su propio riesgo teniendo en cuenta las notas históricas incompletas de Alain (por cierto, ¿cómo se ve el XP Service Pack 1?)