Comment détecter une nouvelle barre - page 2

 
Ian Harris:

Salut oneillj,

Je pensais avoir déjà répondu, mais il semble qu'il ait disparu dans l'éther d'Internet.

Le fragment de code que vous avez fourni est à peu près celui dont je me plaignais en premier lieu. Pourquoi une telle complexité ? Je me suis dit qu'il devait y avoir un moyen plus simple. J'ai trouvé celle-ci, qui semble fonctionner. Veuillez me corriger si je me trompe. (J'ai aussi essayé d'utiliser BarsCalculated, mais il était toujours égal à Bars, donc le test était toujours évalué à false).

static int LastBarCount = 0 ;
if (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period) ;
sinon
retour ;

;-) Ian

Je suis tout à fait d'accord pour dire que nous avons besoin de quelque chose d'aussi simple que possible.

Malheureusement, ce code ne semble pas fonctionner pour moi dans MQL5.

 
RoboSpider:
Malheureusement, cela ne semble pas fonctionner dans MQL5.

Les barres seraient de toute façon un mauvais moyen de détecter une nouvelle barre.

La seule façon fiable de vérifier une nouvelle barre est d'utiliser le temps. Pas le volume, pas les prix, pas les barres.

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:

Les barres seraient de toute façon un mauvais moyen de détecter une nouvelle barre.

La seule façon fiable de vérifier une nouvelle barre est d'utiliser le temps. Pas le volume, pas les prix, pas les barres.

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;
  }
Tu es mon héros !
 
honest_knave Bars serait de toute façon un mauvais moyen de détecter une nouvelle barre. La seule façon fiable de vérifier la présence d'une nouvelle barre est d'utiliser le temps. Pas le volume, pas les prix, pas les barres.
  1. Bars n'est pas fiable (un rafraîchissement/une reconnexion peut changer le nombre de barres sur le graphique,) volume n'est pas fiable (ticks manqués,) Price n'est pas fiable (prix dupliqués et L'opérande ==. - MQL4 forum.) Utilisez toujours le temps. Nouvelle bougie - MQL4 forum
 
honest_knave:

Les barres seraient de toute façon un mauvais moyen de détecter une nouvelle barre.

La seule façon fiable de vérifier une nouvelle barre est d'utiliser le temps. Pas le volume, pas les prix, pas les barres.

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;
  }

Juste pour information, j'ai la note suivante dans mes références :

//-- Parfois, SeriesInfoInteger avec SERIES_LASTBAR_DATE renvoie une erreur,

C'était il y a longtemps et je n'ai pas utilisé/testé cette fonction depuis des années, donc peut-être que ce n'est plus le cas. Mais si vous voulez l'utiliser pour détecter une nouvelle barre, c'est probablement mieux de le vérifier ;-)

 
Alain Verleyen:

Juste pour information, j'ai la note suivante dans mes références :

//-- Parfois, SeriesInfoInteger avec SERIES_LASTBAR_DATE renvoie une erreur,

C'était il y a longtemps et je n'ai pas utilisé/testé cette fonction depuis des années, donc peut-être que ce n'est plus le cas. Mais si vous voulez l'utiliser pour détecter une nouvelle barre, c'est probablement mieux de le vérifier ;-)

C'est très énigmatique Alain ! Quel type d'erreurs ?

Dans ce cas, pour les ceintures et les accolades, il faut vérifier SeriesInfoInteger >0 et/ou ResetLastError avant l'appel puis vérifier _LastError après l'appel.

Ou bien récupérez la source de temps à un autre endroit, par exemple time[] si dans OnCalculate, ou CopyTime etc etc.

 

Pourquoi ne pas simplement utiliser quelque chose comme ceci :

   static datetime prevTime=0;
          datetime lastTime[1];
          if (CopyTime(_Symbol,_Period,0,1,lastTime)==1 && prevTime!=lastTime[0])
          {
               prevTime=lastTime[0];
              
               // ...
          }
Cela devrait fonctionner dans tous les cas (même lorsqu'il y a une erreur avec CopyTime(), cela évite un piège).
 
honest_knave:

C'est très énigmatique Alain ! Quel type d'erreurs ?

Dans ce cas, pour les ceintures et les accolades, vérifiez SeriesInfoInteger >0 et/ou ResetLastError avant l'appel puis vérifiez _LastError après l'appel.

Ou bien récupérez la source de temps à un autre endroit, par exemple time[] si dans OnCalculate, ou CopyTime etc etc.

Je dis simplement que lorsque je l'ai utilisé il y a des années, SeriesInfoInteger() n'était pas vraiment fiable. A vous de voir ce que vous faites de cette information :-D
 
Alain Verleyen:
Je dis simplement que lorsque je l'ai utilisé il y a des années, SeriesInfoInteger() n'était pas vraiment fiable. A vous de voir ce que vous faites de cette information :-D

Pas grand-chose, je n'ai pas besoin de détecter une nouvelle barre dans MT5. Mais merci d'avoir partagé ces informations, je les garderai à l'esprit pour l'avenir.

J'essayais simplement de simplifier quelque chose que les gens semblaient rendre excessivement compliqué.

Néanmoins, le principe demeure : utilisez le temps. Attention : choisissez votre méthode d'obtention du temps à vos risques et périls en tenant compte des notes historiques incomplètes d'Alain (au fait, comment se porte le Service Pack 1 de XP ?).

 
honest_knave:

Pas grand-chose, je n'ai pas besoin de détecter une nouvelle barre dans MT5. Mais merci d'avoir partagé cette information, je la garderai à l'esprit pour l'avenir.

J'essayais simplement de simplifier quelque chose que les gens semblaient rendre excessivement compliqué.

Néanmoins, le principe demeure : utilisez le temps. Attention : choisissez votre méthode d'obtention du temps à vos risques et périls en tenant compte des notes historiques incomplètes d'Alain (au fait, comment se porte le Service Pack 1 de XP ?).