Comment détecter une nouvelle barre

 

Bonjour à tous,

Je suis complètement novice sur MQL5 mais j'ai fait pas mal de codage pour d'autres plateformes.

Je me demande pourquoi il est si difficile pour un EA de s'exécuter uniquement sur une nouvelle barre. J'ai jeté un coup d'œil à certains articles, y compris le gestionnaire d'événement "nouvelle barre", et cela semble très difficile.

Si cela ne fonctionne pas et que je dois utiliser le gestionnaire d'événement "new bar", est-il possible de simplement télécharger les fichiers pertinents et de les copier dans le dossier Files( ?), puis de les #inclure ? Existe-t-il un endroit où cela est documenté pour les personnes qui, comme moi, n'ont aucune idée de ce qu'elles font ?

Je travaille sur le tutoriel dans https://www.mql5.com/en/articles/100, et la première chose que j'ai remarquée est que la fonction "Bars" est utilisée pour s'assurer qu'il y a suffisamment de barres pour effectuer des calculs, mais le morceau de code suivant est apparemment conçu pour détecter une nouvelle barre et est (à ma connaissance) un morceau de code très complexe. La fonction Bars ne pourrait-elle pas être utilisée pour détecter une nouvelle barre ? Quelque chose comme if(Bars > int LastBarCount) {bool IsNewBar = true ; LastBarCount = Bars;} else {IsNewBar = false;}. Est-ce que quelque chose comme ça fonctionnerait?

Un pour la liste de souhaits. Ne serait-il pas bon qu'il y ait un événement OnNewBar que nous puissions surcharger, au lieu de OnTick ? Puisque tous les indicateurs que j'ai vus fonctionnent sur les barres, et non sur les ticks, je pense que cela rendrait la vie de tout le monde beaucoup plus facile.

Je viens de trouver une autre possibilité : "BarsCalculated". Encore une fois, je ne suis pas tout à fait sûr de ce que cela signifie d'après la description, mais cela semble être le nombre de barres que l'EA a déjà traitées. Si c'était vrai, tout ce que j'aurais à vérifier est if(Bars > BarsCalculated), si c'est vrai, j'irais faire mon traitement, sinon je reviendrais ? Est-ce que quelque chose m'échappe ?

Merci,

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.
 


Essayez ceci dans votre EA, au début de la fonction OnTick.

// Nous allons utiliser la variable statique Old_Time pour servir le temps de la barre.

// A chaque exécution de OnTick, nous allons vérifier le temps de barre actuel avec celui qui a été sauvegardé.

// Si le temps de la barre n'est pas égal au temps sauvegardé, cela indique que nous avons un nouveau tick.


static datetime Old_Time ;

datetime New_Time[1] ;

bool IsNewBar=false ;


// copie du dernier temps de la barre vers l'élément New_Time[0]

int copied=CopyTime(_Symbol,_Period,0,1,New_Time) ;

if(copied>0) // ok, les données ont été copiées avec succès

{

if(Old_Time!=New_Time[0]) // si l'ancien temps n'est pas égal au nouveau temps de barre

{

IsNewBar=true ; // si ce n'est pas un premier appel, la nouvelle barre est apparue.

if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Nous avons une nouvelle barre ici ",New_Time[0]," l'ancien temps était ",Old_Time) ;

Old_Time=New_Time[0] ; // sauvegarde de l'heure du bar

}

}

else

{

Alert("Erreur dans la copie des données historiques de temps, erreur =",GetLastError()) ;

Remettre à zéro la dernière erreur() ;

retour ;

}


//--- L'EA ne doit rechercher une nouvelle transaction que si nous avons une nouvelle barre.

if(IsNewBar==false)

{

retour ;

}

//--- Avons-nous assez de barres pour travailler ?

int Mybars=Bars(_Symbol,_Period) ;

if(Mybars<60) // si le total des barres est inférieur à 60 barres

{

Alert("Nous avons moins de 60 barres, l'EA va maintenant sortir !!") ;

retour ;

}


 

Salut oneillj,

Je pensais avoir déjà répondu, mais il semble que ma réponse 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
Documentation on MQL5: Timeseries and Indicators Access / BarsCalculated
  • www.mql5.com
Timeseries and Indicators Access / BarsCalculated - Documentation on MQL5
 
J'utilise ce...
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:
J'utilise ceci...
Le risque avec cette méthode est que si les données de prix pour votre symbole ne commencent pas au 4 janvier 1971, alors toutes les données historiques chargées pendant que l'expert est attaché au graphique seront lues comme une nouvelle barre...
 
Les commentaires qui ne concernent pas ce sujet, ont été déplacés vers "Can mql5 be used in MT4 ?".
 

La fonction iTime donne l'heure de la barre.

Lorsqu'elle change, il s'agit d'une nouvelle mesure.

 
Nathan5:

La fonction iTime donne l'heure de la barre.

Lorsqu'elle change, il s'agit d'une nouvelle mesure.

Ce sujet concerne mql5. Il n'existe pas de fonction iTime().
 

Vous pouvez aussi essayer ceci :


// 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:
J'utilise ceci...
Malheureusement, cela ne semble pas fonctionner dans MQL5.
Raison: