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 ;
- www.mql5.com
static int BARS; //+------------------------------------------------------------------+ //| NewBar function | //+------------------------------------------------------------------+ bool IsNewBar() { if(BARS!=Bars(_Symbol,_Period)) { BARS=Bars(_Symbol,_Period); return(true); } return(false); }
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
J'utilise ceci...
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. }
J'utilise ceci...
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
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