Discussion de l'article "L'utilisation des bibliothèques MQL5 Standard de Cours de Trade dans la rédaction d'un Expert Advisor" - page 3

 

Il y a aussi des lignes dans la classe COrderInfo

return(FormatType(str,Type()));
...
FormatType(type,Type())
...
if(m_type==Type() && m_state==State() &&

Mais la fonction Type() est absente de la classe.

 

La section 1.4 de l'article présente les caractéristiques de la classe COrderInfo qui, à en juger par la description, est conçue pour travailler avec des commandes actives en attente. Il est suggéré de procéder comme suit: "Pour utiliser cette classe afin d'obtenir les propriétés des ordres en attente, nous demandons d'abord le nombre total d'ordres et nous les sélectionnons par ticket d'ordre"

//Sélectionner tous les ordres historiques pour la période spécifiée
if (HistorySelect(0,TimeCurrent()))   // toutes les commandes
   {    
     // obtenir le nombre total de commandes
     int o_total = OrdersTotal();
   }
Mais si la fonction HistorySelect() est conçue pour interroger"l'historique des transactions et des ordres", c'est-à-dire pour interroger les ordres historiques, pourquoi utiliser cette fonction pour interroger le nombre total d'ordres actifs en attente ?
 
Yedelkin:

Dans la classe COrderInfo ...

Mais la fonction Type() est absente de la classe.

Même situation avec les classes CDealInfo et CPositionInfo
 

Quelqu'un peut-il m'expliquer ? Voici un morceau de code de la classe CDealInfo :

//+------------------------------------------------------------------+
//|DealInfo.mqh |
//+------------------------------------------------------------------+
#include <Object.mqh>
#include "SymbolInfo.mqh"
//+------------------------------------------------------------------+
//| Classe CDealInfo.|
//| Rendez-vous : classe permettant d'accéder aux informations relatives à l'accord historique.
//| Dérive de la classe CObject.|
//+------------------------------------------------------------------+
class CDealInfo : public CObject
  {
   ...
public:
   ...
   //--- méthodes d'accès rapide aux propriétés de position de la chaîne de caractères
   string            Symbol()           const;
   ...
  };
...
//+------------------------------------------------------------------+
//| Obtenir la valeur de la propriété "DEAL_SYMBOL." ||
//| INPUT : non.|
//| OUTPUT : la valeur de la propriété "DEAL_SYMBOL". ||
//|| REMARQUE : non.|
//+------------------------------------------------------------------+
string CDealInfo::Symbol() const
  {
   return(HistoryDealGetString(m_ticket,DEAL_SYMBOL));                           //Retour stupide
  }
...
//+------------------------------------------------------------------+
//| Convertit les paramètres de l'accord en texte. ||
//| INPUT :str - chaîne de réception,|
//| deal - pointeur sur l'instance de la classe. ||
//| OUTPUT : chaîne formatée.|
//|| REMARQUE : non.|
//+------------------------------------------------------------------+
string CDealInfo::FormatDeal(string& str) const
  {
   string type,volume,price,date;
   CSymbolInfo symbol;                                                    
//--- mettre en place
   symbol.Name(Symbol());
   int digits=symbol.Digits();
//--- former la description de l'opération
   switch(Type())
     {
      ...
     }
//--- renvoie le résultat
   return(str);
  }
...
//+------------------------------------------------------------------+

La fonction CDealInfo::FormatDeal(string& str) contient cette ligne :

   symbol.Name(Symbol());
La fonction Symbol() est quant à elle définie à la fois dans la classe CDealInfo elle-même et parmi les fonctions standard du terminal client. Quelle fonction est transmise comme argument à la fonction symbol.Name() ? Selon quelle règle ?
 
Yedelkin:

Quelqu'un peut-il m'expliquer ? Voici un morceau de code de la classe CDealInfo :

La fonction CDealInfo::FormatDeal(string& str) contient cette ligne :

La fonction Symbol() est quant à elle définie à la fois dans la classe CDealInfo elle-même et parmi les fonctions standard du terminal client. Quelle fonction est transmise comme argument à la fonction symbol.Name() ? Selon quelle règle ?

La même règle que pour la portée des variables s'applique ici. Si une variable est déclarée sous un seul nom aux niveaux global et local, alors à l'intérieur de la portée locale le nom pointera vers la variable locale et à l'extérieur vers la variable globale.

Il s'avère que si une fonction standard est surchargée à l'intérieur d'une classe, le corps de la surcharge sera appelé dans la classe elle-même et le corps de la fonction standard sera appelé au niveau global. Le corps de la fonction surchargée peut être appelé au niveau global par l'intermédiaire du pointeur de classe.

 
Urain:

La même règle s'applique ici qu'avec la portée des variables. Si une variable est déclarée sous le même nom aux niveaux local et global, alors à l'intérieur de la portée locale le nom pointera vers la variable locale, et à l'extérieur vers la variable globale.

Il s'avère que si une fonction standard est surchargée à l'intérieur d'une classe, le corps de la surcharge sera appelé dans la classe elle-même et le corps de la fonction standard sera appelé au niveau global. Le corps de la fonction surchargée peut être appelé au niveau global par le biais du pointeur de classe.

Merci beaucoup ! C'est clair et compréhensible !
 
Merci Samuel d'avoir écrit un article aussi approfondi. Il est apprécié.
 
Agréable et facile à comprendre
[Supprimé]  
Très bon article ! Je l'utilise comme référence.
 
Le chapitre 1.4 utilise l'historique des commandes pour décrire COrderInfo, est-ce exact ?