MetaTrader 4 Build 900: Modèles de classes dans MQL4 et Utilisation Optimisée de la Mémoire

Release Notes : MetaTrader 4

22 octobre 2015

Terminal

  1. Correction du changement de mot de passe pour un compte inactif (non connecté).




  2. Utilisation et libération optimisées de la mémoire lors de l'utilisation de grandes quantités de données historiques.
  3. Correction et optimisation du travail avec un grand nombre de catégories de nouvelles.

Signaux

  1. Correction du désabonnement aux signaux via le menu contextuel de la fenêtre du Navigateur.



MQL4

  1. Ajout de modèles de classes vous permettant de créer des classes paramétrées comme en C++. Cela permet une plus grande abstraction et la capacité d'utiliser le même code pour travailler avec des objets de différentes classes de manière uniforme. Exemple d'utilisation :
    //+------------------------------------------------------------------+
    //|                                                    TemplTest.mq5 |
    //|                        Copyright 2015, MetaQuotes Software Corp.  |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2015, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| Declaration d'un modele de classe                                |
    //+------------------------------------------------------------------+
    template<typename T>
    class TArray
      {
    protected:
       T                 m_data[];
    
    public:
    
       bool              Append(T item)
         {
          int new_size=ArraySize(m_data)+1;
          int reserve =(new_size/2+15)&~15;
          //---
          if(ArrayResize(m_data,new_size,reserve)!=new_size)
             return(false);
          //---
          m_data[new_size-1]=item;
          return(true);
         }
       T                 operator[](int index)
         {
          static T invalid_index;
          //---
          if(index<0 || index>=ArraySize(m_data))
             return(invalid_index);
          //---
          return(m_data[index]);
         }   
      };
    //+------------------------------------------------------------------+
    //| Modèle de classe d'un tableau de pointeurs. Dans le destructeur, il supprime |
    //| les pointeurs vers lesquels ils étaient stockés dans le tableau. |
    //|                                                                  |
    //| Noter l'heritage du modele de classe TArray                      |
    //+------------------------------------------------------------------+
    template<typename T>
    class TArrayPtr : public TArray<T *>
      {
    public:
       void             ~TArrayPtr()
         {
          for(int n=0,count=ArraySize(m_data);n<count;n++)
             if(CheckPointer(m_data[n])==POINTER_DYNAMIC)
                delete m_data[n];
         }
      };
    //+------------------------------------------------------------------------+
    //| Declaration de la classe.  Les pointeurs des objets seront stockés dans le tableau |
    //+------------------------------------------------------------------------+
    class CFoo
      {
       int               m_x;
    public:
                         CFoo(int x):m_x(x) { }
       int               X(void) const { return(m_x); }
      };
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    TArray<int>     ExtIntArray;   // instancie le modele TArray (specialise le modele TArray avec le type int)
    TArray<double>  ExtDblArray;   // instancie le modele TArray (specialise le modele TArray avec le type double)
    TArrayPtr<CFoo> ExtPtrArray;   // instancie le modele TArrayPtr (specialise le modelete TArrayPtr avec le type CFoo)
    //+------------------------------------------------------------------+
    //| Fonction de demarrage du programme du script                     |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- remplit les tableaux avec les donnees
       for(int i=0;i<10;i++)
         {
          int integer=i+10;
          ExtIntArray.Append(integer);
          
          double dbl=i+20.0;
          ExtDblArray.Append(dbl);
          
          CFoo *ptr=new CFoo(i+30);
          ExtPtrArray.Append(ptr);
         }
    //--- affiche le contenu du tableau
       string str="Int:";
       for(i=0;i<10;i++)
          str+=" "+(string)ExtIntArray[i];      
       Print(str);   
       str="Dbl:";
       for(i=0;i<10;i++)
          str+=" "+DoubleToString(ExtDblArray[i],1);
       Print(str);   
       str="Ptr:";
       for(i=0;i<10;i++)
          str+=" "+(string)ExtPtrArray[i].X();      
       Print(str);
    //--- Lest objets CFoo crees avec new ne doivent pas etre supprimes car ils sont supprimes dans le destructeur de l'objet TArrayPtr<CFoo>  
      } 
    Résultat d'exécution :
    TemplTest EURUSD,M1: Ptr: 30 31 32 33 34 35 36 37 38 39
    TemplTest EURUSD,M1: Dbl: 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0
    TemplTest EURUSD,M1: Int: 10 11 12 13 14 15 16 17 18 19
  2. Correction de la réallocation mémoire dans la fonction ArrayCopy qui pouvait générer des crashs des programmes MQL4 occasionnellement.

Testeur

  1. Correction d'une erreur qui annulait occasionnellement les variables déclarées au niveau global avec le test d'un indicateur.
  2. Correction du test lorsque la connexion à un serveur de trading est perdue.

MetaEditor

  1. Correction de la définition d'un nom de fonction dans MetaAssist en cas de cast de type.
  2. Correction de l'ouverture de gros fichiers.
  3. Ajout du raccourci clavier F pour appeler la fonction de recherche depuis l'onglet Code Base, mais aussi différentes astuces dans la barre de statut pour les commandes utilisant un code : ajout/suppression de l'indentation, navigation, changement de la casse, etc.


Correction des erreurs rapportées dans les journaux des crash.