MetaTrader 5 Build 1485 : Mode de test et graphiques supplémentaires dans la Bibliothèque Standard

L'ordre des entrées dans les journaux du terminal et de MetaEditor a changé

24 novembre 2016

Terminal

  1. L'ordre des entrées dans les journaux du terminal et de MetaEditor a changé. Avant la mise à jour, les dernières entrées du journal étaient présentées en premier. Maintenant, les plus anciennes entrées sont au début du journal. Un orde de tri inversé et plus conventionnel rend la lecture du journal plus facile.




    De plus, il est maintenant possible de cacher les colonnes 'Time' et 'Source' en utilisant le menu contextuel du journal.

  2. En mode hedging, le ticket d'une position fermée est maintenant affiché pour les ordres et les transactions dans l'historique de trading. Cela aide à trouver les opérations d'ouverture et de fermeture correspondantes.




  3. Correction d'une erreur qui provoquait la copie des SL/TP d'une position existante vers une nouvelle position sur le même instrument. L'erreur pouvait se produire lors de l'utilisation des fonctions de Trading En Un Clic (par exemple, depuis le graphique ou depuis la fenêtre du Market Watch) en mode hedging.
  4. Correction de l'affichage des objets flèches sur les écrans ultra-haute définition (4K).

MQL5

  1. Une nouvelle fonction ArrayPrint a été ajoutée qui écrit des structures et des types simples dans le journal.
    void  ArrayPrint(
       const void&   array[],             // Tableau à imprimer
       uint          digits=_Digits,      // Nombre de décimales
       const string  separator=NULL,      // Le séparateur entre les valeurs des champs de la structure
       ulong         start=0,             // L'indice du premier élément à imprimer
       ulong         count=WHOLE_ARRAY,   // Le nombre d'éléments à imprimer
       ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN    
       );
    
    ArrayPrint n'imprime pas tous les champs d'une structure dans les journaux – les champs du tableau et les champs pointeurs vers les objets sont passés. Si vous désirez imprimer tous les champs de la structure, vous devrez utiliser une fonction personnalisée pour imprimer en masse avec le format désiré.
    //--- Affiche les valeurs des 10 dernières barres
       MqlRates rates[];
       if(CopyRates(_Symbol,_Period,1,10,rates))
         {
          ArrayPrint(rates);
          Print("Révision\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
          for(int i=0;i<10;i++)
            {
             PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
             TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
             rates[i].open,rates[i].high,rates[i].low,rates[i].close,
             rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
            }
         }
       else
          PrintFormat("CopyRates a échoué, code d'erreur=%d",GetLastError());
    //--- Un exemple de journal
    /*
                        [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295         18110       10   17300175000
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747         17829        9   15632176000
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744         13458       10    9593492000
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194         15362        9   12352245000
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172         16833        9   12961333000
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052         15933        8   10720384000
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528         11888        9    8084811000
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915          7284       10    5087113000
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904          8710        9    6769629000
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263          8956        7    7192138000
       Vérification
       [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 
    */
    

  2. Correction d'une erreur dans la concaténation de chaînes de caractères du type S1=S2+S1
  3. Le comportement de la fonction ArrayResize a changé. Si -1 est passé dans le paramètre reserve_size, la fonction libère la mémoire non utilisée (réservée) si la fonction n'augmente pas la taille du tableau. Définir la nouvelle taille du tableau à 0 avec reserve_size=-1 est équivalent à un appel à ArrayFree. Le nouveau comportement permet d'optimiser l'utilisation de la mémoire dans les programmes MQL5.
    void OnStart()
      {
       int arr[];
    //--- Quantité de mémoire utilisée initialement 
       Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- Quantité de mémoire utilisée pour le tableau de taille 1 avec une réserve
       ArrayResize(arr,1,1024*1024);
       Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- Après l'augmentation du tableau, la quantité de mémoire utilisée ne changera pas grâce à la réserve
       ArrayResize(arr,1024*512,1024*1024);
       Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- Après la réduction du tableau, la taille de la mémoire ne changera pas non plus
       ArrayResize(arr,1);
       Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- La mémoire non utilisée ne sera pas libérée après la suppression de la réserve
       ArrayResize(arr,1,-1);
       Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      }
    

  4. Des fonctions de dessin de graphiques ont été ajoutées dans la Bibliothèque Standard. Pour utiliser la nouvelle fonctionnalité, incluez MQL5\Include\Graphics\Graphic.mqh à votre projet.

    Dessin d'un graphique sur la base de 3 séries de données en utilisant GraphPlot :
    #include <Graphics/Graphic.mqh>
    
    double Func1(double x) { return MathPow(x,2); }
    double Func2(double x) { return MathPow(x,3); }
    double Func3(double x) { return MathPow(x,4); }
    
    void OnStart()
      {
       GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      }
    
    
    Le résultat :


    Dessin d'un graphique sur la base d'un tableau de données en utilisant GraphPlot :
    #include <Math/Stat/Binomial.mqh>
    #include <Graphics/Graphic.mqh>
    
    void OnStart(void)
      {
       double    vars[101];
       double    results[101];
       const int N=2000;
    //---  
       MathSequence(0,N,20,vars);
       MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
       ArrayPrint(results,4);
       GraphPlot(results);
    //---
      }
    
    Le résultat :



  5. Fonctions mises à jour pour le travail avec les statistiques mathématiques dans la Bibliothèque Standard. Nous avons vérifié minutieusement la qualité et la fiabilité de toutes les fonctions à la fois dans la version MQL5 et dans le code source du langage R. Pour activer le contrôle de fiabilité et des performances, des tests unitaires sont distribués avec la librairie statique. Ils sont disponibles dans le répertoire \MQL5\Scripts\UnitTests\Stat.

    • TestStat.mq5 — est le script du test principal pour vérifier les résultats de calcul
    • TestPrecision.mq5 — test de précision des calculs
    • TestBenchmark.mq5 — le test inclut les mesures de performances des calculs

Tester

  1. La mise à jour propose des paramètres avancés pour configuer les délais d'exécution pendant le test. Vous pouvez maintenant tester vos Expert Advisors sous de nombreuses conditions de trading, incluant le cas idéal sans délai ou avec n'importe quel délai.



    Seul le mode délai aléatoire était disponible dans les versions précédentes.

  2. Correction de la génération du volume des ticks sur les barres dans le mode 'OHLC basés sur M1' ('M1 based OHLC').
  3. Correction de la spécification de l'heure d'ouverture des ordres et positions en millisecondes lors du trading en mode hedging.
  4. Correction de l'erreur "ancien tick ("old tick"), qui pouvait apparaître en mode multi-devises ou multi-périodes dans le mode 'ticks réels'.
  5. Améliorations de la vitesse d'exécution de CopyTicks lorsque les ticks demandés sont lus depuis une base de données sur le disque dur.

MetaEditor

  1. Le menu contextuel Fichier dans le Navigator et dans la boîte à outils propose maintenant des commandes permettant de travailler avec dépôt MQL5 de code source versionné.




  2. Correction d'une erreur qui pouvait occasionnellement casser l'intégrité de la base de données locale MQL5 lors de l'utilisation de plus de 1024 fichiers dans le dépôt.
  3. Correction de l'affichage de l'arbre des fichiers dans le Dépôt MQL5.
  4. Correction de l'affichage d'un fichier après le remplacement de texte en masse.

Mise à jour de la documentation.