Discussion de l'article "MQL5 Cookbook : Analyse des propriétés de position dans le testeur de stratégie MetaTrader 5"

 

Un nouvel article MQL5 Cookbook : Analyse des propriétés de position dans le testeur de stratégie MetaTrader 5 a été publié :

Nous vous présenterons une version modifiée de l'Expert Advisor de l'article précédent "MQL5 Cookbook : Propriétés de la position dans le panneau d'informations personnalisé". Certains des problèmes que nous aborderons incluent l'obtention de données à partir de barres, la vérification de nouveaux événements de barre sur le symbole actuel, y compris une classe de trade de la bibliothèque standard dans un fichier, la création d'une fonction pour rechercher des signaux de trading et une fonction pour exécuter des opérations de trading , ainsi que la détermination des événements de trade dans la fonction OnTrade().

En gros, tout est prêt et nous pouvons procéder aux tests. Le Strategy Tester vous permet d'exécuter rapidement un test en mode visualisation et de rechercher les éventuelles erreurs. L'utilisation du Strategy Tester peut également être considérée comme bénéfique du fait que vous pouvez continuer à développer votre programme même le week-end lorsque les marchés sont fermés.

Configurez le testeur de stratégie, activez le mode de visualisation et cliquez sur Démarrer. L'Expert Advisor commencera à trader dans le Strategy Tester et vous verrez une image similaire à celle ci-dessous :

Fig. 2. Mode de visualisation dans le testeur de stratégie MetaTrader 5.

Fig. 2. Mode de visualisation dans le testeur de stratégie MetaTrader 5.

Auteur : Anatoli Kazharski

 

Bonsoir, aidez-moi, dans la fonction CheckNewBar la variable statique new_bar est mise à zéro dans la première ligne, et ensuite la logique de la fonction est basée sur le fait qu'elle est égale à zéro ou non. Pourriez-vous me dire où je n'ai pas compris ?!!!!!!!

bool CheckNewBar()
  {
//--- Variable pour l'heure d'ouverture du bar en cours
   static datetime new_bar=NULL;
//--- Tableau pour obtenir l'heure d'ouverture de la barre actuelle
   static datetime time_last_bar[1]={0};
//--- Obtenir l'heure d'ouverture de la barre actuelle
// Si une erreur s'est produite lors de la réception, nous la signalons.
   if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1)
     { Print(__FUNCTION__," : Erreur de copie de l'heure d'ouverture du bar : "+IntegerToString(GetLastError())+""); }
//--- S'il s'agit du premier appel de fonction
   if(new_bar==NULL)
     {
      // Régler l'heure
      new_bar=time_last_bar[0];
      Print(__FUNCTION__," : Initialisation ["+_Symbol+"][TF: "+TimeframeToString(Period())+"]["
            +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]");
      return(false); // Retourne faux et sort 
     }
//--- Si l'heure est différente
   if(new_bar!=time_last_bar[0])
     {
      new_bar=time_last_bar[0]; // Régler l'heure et quitter 
      return(true); // Se souvenir de l'heure et renvoyer true
     }
//--- Nous sommes arrivés à ce point - donc la barre n'est pas nouvelle, renvoyons false
   return(false);
  }
 
Sergey Voytsekhovsky:

Bonsoir, aidez-moi, dans la fonction CheckNewBar la variable statique new_bar est mise à zéro dans la première ligne, et ensuite la logique de la fonction est basée sur le fait qu'elle est égale à zéro ou non. Pourriez-vous me dire où je n'ai pas compris ?!!!!!!!

L'aide dit :

Lesvariables locales déclarées avec le mot-clé static conservent leur valeur pendant toute la durée d'existence de la fonction. À chaque appel suivant de la fonction, ces variables locales contiennent les valeurs qu'elles avaient lors de l'appel précédent.

En d'autres termes, lors d'un nouvel appel de la fonction CheckNewBar(), la variable new_bar conservera la valeur reçue lors de l'appel précédent de la fonction, mais à la première ligne, une nouvelle valeur NULL...... lui sera attribuée et je ne comprends pas très bien pourquoi et comment cela fonctionne. Merci de dissiper ma confusion, il est fort probable que je sois quelque part stupide, mais QUELQUE SOIT ? ????

 
Sergey Voytsekhovsky:

Bonsoir, aidez-moi, dans la fonction CheckNewBar la variable statique new_bar est mise à zéro dans la première ligne, et ensuite la logique de la fonction est basée sur le fait qu'elle est égale à zéro ou non. Pourriez-vous me dire où je n'ai pas compris ?!!!!!!!

Si j'ai bien compris l'aide, dans la lignestatic datetimenew_bar=NULL; " Si les valeurs initiales ne sont pas spécifiées, les variables de la classe de mémoire statique prennent des valeurs initiales nulles". Il n'aurait donc pas fallu l'initialiser avec null du tout et la logique serait alors sans faille. Ou pas ? ???

 
Sergey Voytsekhovsky:

Si j'ai bien compris l'aide, la lignestatic datetimenew_bar=NULL; " Si les valeurs initiales ne sont pas spécifiées, les variables statiques de la classe de mémoire prennent des valeurs initiales nulles." Il n'aurait donc pas fallu l'initialiser avec null du tout et la logique serait alors sans faille. Ou pas ?

Les variables DOIVENT toujours être initialisées. C'est une loi non écrite. Ceux qui ne la respectent pas commettent tôt ou tard des erreurs très difficiles à trouver :)


Comment fonctionne une variable statique :

//+------------------------------------------------------------------+
//|Test EA.mq5 |
//|Copyright © 2018, Vladimir Karputov
//| http ://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- nous ne travaillons qu'au moment de la naissance d'un nouveau bar
   static datetime PrevBars=0;
   Print("PrevBars ",PrevBars);
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==PrevBars)
      return;
   PrevBars=time_0;
   Print("New bar. PrevBars ",PrevBars);
  }
//+------------------------------------------------------------------+


Imprimer dans l'onglet Experts. La toute première entrée de OnTick() est l'initialisation d'une variable statique, une nouvelle barre.

2018.01.08 00:00:00   PrevBars 1970.01.01 00:00:00
2018.01.08 00:00:00   New bar. PrevBars 2018.01.08 00:00:00
2018.01.08 00:00:30   PrevBars 2018.01.08 00:00:00
2018.01.08 00:00:59   PrevBars 2018.01.08 00:00:00
2018.01.08 00:01:00   PrevBars 2018.01.08 00:00:00
2018.01.08 00:01:00   New bar. PrevBars 2018.01.08 00:01:00
2018.01.08 00:01:30   PrevBars 2018.01.08 00:01:00
2018.01.08 00:02:00   PrevBars 2018.01.08 00:01:00
Dossiers :
Test_EA.mq5  4 kb
 
Vladimir Karputov:

Les variables DOIVENT toujours être initialisées. Il s'agit d'une loi non écrite. Ceux qui ne la respectent pas commettent tôt ou tard des erreurs très difficiles à trouver :)


Comment fonctionne une variable statique :


Impression dans l'onglet Experts. La toute première entrée de OnTick() est l'initialisation d'une variable statique, une nouvelle barre.

OK, j'ai compris, merci pour cette réponse concise et très lucide.