Bibliothèque: IsNewBar

 

IsNewBar:

CIsNewBar pour déterminer quand un changement de barre se produit.

Author: Nikolay Kositsin

 
Je ne suis pas un pro, mais je pense que ce code est erroné. La variable Recount est toujours vraie. Par conséquent, chaque tick sera traité comme une nouvelle barre. Pourquoi cette variable existe-t-elle ? Pourquoi appeler CopyClose? Les codes affichés font-ils l'objet d'une vérification pour s'assurer qu'ils fonctionnent correctement ? Si je me trompe, veuillez corriger et expliquer.
 
lordlev:
Je ne suis pas un pro, mais je pense que ce code est erroné. La variable Recount est toujours vraie. Par conséquent, chaque tick sera traité comme une nouvelle barre. Pourquoi cette variable existe-t-elle ? Pourquoi appeler CopyClose? Les codes affichés font-ils l'objet d'une vérification pour s'assurer qu'ils fonctionnent correctement ? Si je me trompe, veuillez corriger et expliquer.
J'ai tout revérifié et j'ai trouvé une erreur. Dans le fichier joint, il n'y a pas d'affectation de Recount à false, mais dans le code d'exemple, tout est correct.
 
lordlev:
J'ai tout revérifié et j'ai trouvé une erreur. Dans le fichier joint, il n'y a pas d'affectation de Recount à false, mais dans le code d'exemple, tout est correct.
Eh bien, cela peut être corrigé !
 

Je me trompe peut-être, mais je pense que c'est la bonne façon de procéder.

if(TNew>m_TOld)

Sinon, ce sera inexact lors de la pagination (édition de l'historique).

Pourriez-vous m'expliquer de quoi il s'agit et pourquoi cette vérification est insérée ?

if(...  && TNew)

Je ne comprends pas. Quand cette condition est-elle vraie, quand est-elle fausse ? Je vous remercie de votre compréhension.

 
Prival:

Pouvez-vous m'expliquer de quoi il s'agit et pourquoi ce contrôle est inséré ?

Je ne comprends pas. Quand cette condition est-elle vraie et quand est-elle fausse ? Je vous remercie.

D'après moi, cette condition vérifie que TNew n'est pas égal à m_TOld et qu'il n'est pas non plus égal à zéro ( i.e. D'1970.01.01.01 00:00:00:00')....

La deuxième condition, également imho, vérifie que la fonction

datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));

a retourné quelque chose de différent de zéro...

J'ai exécuté le script avec cette fonction - il m'a retourné exactement 0. Peut-être à cause du week-end.

 
Prival:

Pouvez-vous m'expliquer de quoi il s'agit et pourquoi ce contrôle est inséré ?

Je ne comprends pas. Quand cette condition est-elle vraie et quand est-elle fausse ? Je vous remercie.

La vérification du zéro est nécessaire pour éviter d'obtenir le début d'une nouvelle barre (quel que soit le temps écoulé depuis son ouverture) au début et à la première vérification de la condition.
 
Prival:

Je me trompe peut-être, mais je pense que c'est la bonne façon de procéder.

Sinon, il y aura des imprécisions dans le travail lors de la pagination (édition de l'historique).

Pourriez-vous expliquer de quoi il s'agit et pourquoi cette vérification est insérée ?

Je ne comprends pas. Quand cette condition est-elle vraie, quand est-elle fausse ? Je vous remercie.

Je pense qu'il serait plus logique de le faire par précaution.

if(TNew>m_TOld && TNew)

Bien que TNew soit toujours à zéro lorsque l'historique est échangé, un zéro peut être introduit dans la variable TNew à tout moment. Un zéro peut être introduit dans la variable TNew à tout moment, vous devez donc vérifier qu'il n'y a pas de zéro en permanence.

 
Automated-Trading:

IsNewBar:

Auteur : Nikolay Kositsin

Il y a un petit bug dans votre classe(comme dans la plupart des fonctions dont j'ai vu le code). La première fois que vous appelez la méthode IsNewBar, elle renvoie toujours true, indépendamment de l'existence d'une nouvelle barre réelle .

Mais une telle fonction contient une variable statique, et nous ne pouvons donc pas utiliser plusieurs appels de cette fonction.

On peut également utiliser un tableau à deux dimensions pour conserver l'heure d'ouverture de la dernière barre.

 
J'ai fait une version alternative de CIsNewBar, sans aucune variable statique. J'ai juste utilisé le Tick.time_msc pour faire une fonction idempotente :


class CIsNewBar{
private:
   long checkedMs;
   datetime lastBarOpenedAt;
   bool lastValue;
   CTickUtils tickUtils;
public:
   CIsNewBar(){}
   ~CIsNewBar(){}

   bool isNewBar(){
      MqlTick tick;
      SymbolInfoTick(_Symbol, tick);
      long tickMs = tick.time_msc;

      
      if(checkedMs >= tickMs){ //a déjà traité cette fonction à ce moment-là ?
         return lastValue;     //donc, renvoyer la valeur mise en mémoire tampon
      }

      datetime time[1];
      CopyTime(_Symbol, _Period, 0, 1, time);


      if(lastBarOpenedAt != time[0]){
         lastBarOpenedAt = time[0];
         lastValue = true;
      } else {
         lastValue = false;
      }

      checkedMs = tickMs;
      return lastValue;
   }
 

Je pense qu'il s'agit d'une classe légère et rapide qui résout les problèmes mentionnés ci-dessus.

Cette version :

  • ne donnera pas de fausse alerte la première fois que la fonction.isNewBar() est appelée.
  • élimine la ré-instanciation constante de nouvelles variables à chaque fois que la fonction est appelée sans utiliser de variables statiques, ce qui accélère l'exécution.
  • ne renvoie la valeur "true" qu'une seule fois par barre.
  • a une empreinte mémoire légère.
class CIsNewBar{
        private:
                datetime lastBarOpenedAt;
                datetime time[1];
        public:
                CIsNewBar(){CopyTime(_Symbol, _Period, 0, 1, time);lastBarOpenedAt = time[0];}
                ~CIsNewBar(){}
                bool isNewBar(){
                        CopyTime(_Symbol, _Period, 0, 1, time);
                        if(lastBarOpenedAt < time[0]){
                                lastBarOpenedAt = time[0];
                                return(true);
                                }
                        else { return(false);}
                        }
        };

Pour implémenter la classe :

CIsNewBar someName;

void OnTick(){
        if(someName.isNewBar()){
                /// Appeler le nouveau gestionnaire d'événements de la barre ou
                /// Faire le travail pour la nouvelle barre. 
                }
        }
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5