Mises à jour : MetaTrader 5

L'historique des mises à jour des plateformes de bureau, mobile et web

24 mars 2023
MetaTrader 5 build 3660 : Améliorations et corrections

Terminal

  1. Correction d'une erreur occasionnelle dans la création du journal de la plateforme.
  2. Mise à jour des traductions de l'interface utilisateur.

MQL5

  • Correction de la vérification des variables globales. Lors de la déclaration de variables nommées de la même façon dans des espaces de noms différents, le compilateur émettait un faux avertissement indiquant que la variable était déjà déclarée.

Terminal Web

  1. Ajout de la traduction de l'interface utilisateur en portugais. Le terminal web est désormais disponible en 12 langues.
  2. Correction de la boîte de dialogue permettant d'ajouter un indicateur d'Ecart-Type (Standard Deviation).
  3. Corrections et améliorations mineures.
17 mars 2023
MetaTrader 5 build 3640 : Terminal Web en 11 langues

Terminal Web

  1. Ajout des traductions de l'interface utilisateur dans 10 langues largement parlées : Chinois simplifié et traditionnel, français, allemand, italien, japonais, coréen, espagnol, turc et russe. Cette liste sera encore élargie dans les prochaines versions. Pour changer de langue, utilisez le menu correspondant :


    Interface du terminal Web disponible en 11 langues


  2. Optimisation du mécanisme de connexion au serveur de trading.

MQL5

  1. MQL5 : Ajout des flags COPY_TICKS_VERTICAL et COPY_RATES_VERTICAL pour les méthodes CopyTicks, CopyTicksRange et CopyRates.

    Par défaut, les ticks et les séries sont copiées dans la matrice le long de l'axe horizontal, ce qui signifie que les données sont ajoutées à droite, à la fin de la ligne. Dans les tâches d'exécution du modèle ONNX entraîné , ce type de matrice doit être transposée afin d'alimenter les données d'entrée :

    const long   ExtOutputShape[] = {1,1};    // model's output shape
    const long   ExtInputShape [] = {1,10,4}; // model's input shape
    #resource "Python/model.onnx" as uchar ExtModel[]// model as a resource
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    int OnStart(void)
      {
       matrix rates;
    //--- get 10 bars
       if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
          return(-1);
    //--- input a set of OHLC vectors
       matrix x_norm=rates.Transpose();
       vector m=x_norm.Mean(0);               
       vector s=x_norm.Std(0);
       matrix mm(10,4);
       matrix ms(10,4);

    En spécifiant le flag supplémentaire COPY_RATES_VERTICAL (COPY_TICKS_VERTICAL pour les ticks) lors de l'appel à la méthode, il n’est plus nécessaire de transposer les données :

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    int OnStart(void)
      {
       matrix rates;
    //--- get 10 bars
       if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC|COPY_RATES_VERTICAL,2,10))
          return(-1);
    //--- input a set of OHLC vectors
  2. Nouvelle valeur dans l'énumération ENUM_CHART_PROPERTY_INTEGER — CHART_SHOW_TRADE_HISTORY. La propriété contrôle l'affichage des transactions depuis l'historique des transactions sur le graphique. Utilisez les fonctions ChartGetInteger et ChartSetInteger pour obtenir et définir la propriété. Pour plus de détails sur l'affichage des transactions sur le graphique, veuillez lire la documentation de la plateforme.

MetaEditor

  • Correction du gel de l'interface qui pouvait survenir lors de la compilation du fichier sous certaines conditions.

Terminal

  • Correction des erreurs rapportées dans les journaux de crash.
10 mars 2023
MetaTrader 5 build 3620 : Améliorations du terminal Web, support ONNX et multiplications matricielles rapides dans MQL5

Terminal

  1. Correction du calcul du bénéfice total dans les rapports de trading.
  2. Mise à jour des données fondamentales pour les instruments de trading disponibles via la fenêtre du Market Watch.
  3. Correction du lancement de la plateforme de trading sous Wine 7.0.1 sous Linux.
  4. Correction de l'ajout de symboles dans la fenêtre de Profondeur de Marché via la barre de recherche. Un symbole trouvé par description ne pouvait pas être ajouté à la liste en cliquant sur sa ligne.

MQL5

  1. Prise en charge des opérations avec les modèles ONNX (Open Neural Network Exchange).

    ONNX est un format open-source pour les modèles d'apprentissage automatique. Ce format est pris en charge par de nombreuses plateformes, notamment Chainer, Caffee2 et PyTorch. Créez un modèle ONNX à l'aide d'outils spécialisés, intégrez-le dans votre application MQL5 et utilisez-le pour prendre des décisions de trading.

    Les descriptions de toutes les fonctions prises en charge sont disponibles dans la documentation. Un exemple de modèle ONNX de test est disponible dans les projets publics dans MetaEditor. Trouvez le projet ONNX.Price.Prediction dans "Boîte à Outils \ Projets Publics" et sélectionnez Rejoindre dans le menu contextuel. Le projet sera téléchargé sur votre ordinateur et apparaîtra dans le Navigateur :


    Un exemple de travail avec un modèle ONNX dans des projets publics


    Compilez le projet et exécutez-le sur EURUSD H1 pour voir le résultat.

    En plus du modèle et du code MQL5 qui l'exécute, le projet comprend également le script Python PricePredictionTraining.py. Il montre comment vous pouvez créer vous-même un modèle ONNX. Pour exécuter le script, installez Python sur votre ordinateur et les modules requis à partir de la ligne de commande :

    python.exe -m pip install --upgrade pip
    python -m pip install --upgrade tensorflow
    python -m pip install --upgrade pandas
    python -m pip install --upgrade scikit-learn
    python -m pip install --upgrade matplotlib
    python -m pip install --upgrade tqdm
    python -m pip install --upgrade metatrader5
    python -m pip install --upgrade onnx==1.12
    python -m pip install --upgrade tf2onnx
    Des instructions sur l'utilisation de ONNX sont disponibles dans la documentation.

  2. Ajout de la prise en charge de la Multiplication de Matrices Générales (GeMM). Cet algorithme accélère les calculs sur certains types de processeurs grâce à des tâches parallélisées et à une utilisation optimisée des caches L1/L2/L3. La vitesse de calcul est comparable à celle de logiciels populaires tels que Math Kernel Library (MKL) et OpenBLAS. Des tests comparatifs détaillés seront publiés prochainement.

    Le nouvel algorithme est actuellement pris en charge dans la méthode matrix::GeMM. Si votre processeur prend en charge les instructions AVX et FMA (la plupart des processeurs commercialisés après 2013 prennent en charge ces instructions), l'algorithme sera activé automatiquement.

  3.  Ajout de la possibilité de transférer des matrices et des vecteurs vers les DLL. Cela permet d'importer des fonctions qui utilisent les types pertinents à partir de variables externes.

    Les matrices et les vecteurs sont transmis à une DLL sous la forme d’un pointeur vers un buffer. Par exemple, pour passer une matrice de type float, le paramètre correspondant de la fonction exportée depuis la DLL doit prendre un pointeur de buffer de type float. Par exemple :

    MQL5
    #import "mmlib.dll"
    bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
    #import
    C++
    extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
    En plus des buffers, vous devez transmettre les tailles de matrice et de vecteur pour un traitement correct.

  4. Ajout d'une nouvelle fonction CopySeries pour copier des séries temporelles synchronisées de MqlRates dans des tableaux séparés.

    La fonction CopySeries permet d'obtenir uniquement les séries temporelles nécessaires dans différents tableaux spécifiés au cours d'un appel, et toutes les données des séries temporelles seront synchronisées. Cela signifie que toutes les valeurs des tableaux résultants à un certain indice N appartiendront à la même barre sur la paire Symbole/Timeframe spécifiée. Par conséquent, le programmeur n'a pas besoin de synchroniser les séries temporelles reçues avec l'heure d'ouverture de la barre.

    Contrairement à CopyRates, qui renvoie l'ensemble complet des séries temporelles sous la forme d'un tableau MqlRates, la fonction CopySeries permet d'obtenir des séries temporelles spécifiques requises dans des tableaux séparés. Cela peut se faire en spécifiant une combinaison de drapeaux pour sélectionner le type de série temporelle. L'ordre des tableaux transmis à la fonction doit correspondre à l'ordre des champs dans la structure MqlRates :

    struct MqlRates
      {
       datetime time;         // period beginning time
       double   open;         // open price
       double   high;         // high price for the period
       double   low;          // low price for the period
       double   close;        // close price
       long     tick_volume;  // tick volume
       int      spread;       // spread
       long     real_volume;  // exchange volume
      }

    Donc si vous avez besoin d'obtenir les valeurs des séries temporelles 'time', 'close' et 'real_volume' pour les 100 dernières barres du Symbol/Timeframe actuel, vous devez faire l'appel suivant :

    datetime  time[];
    double    close[];
    long      volume[];
    CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
    

    L'ordre des tableaux "time, close, volume" doit correspondre à l'ordre des champs de la structure MqlRates. L'ordre des valeurs dans rate_mask est ignoré. Le masque pourrait être le suivant :

    COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

    Exemple

    //--- input parameters
    input datetime InpDateFrom=D'2022.01.01 00:00:00';
    input datetime InpDateTo  =D'2023.01.01 00:00:00';
    input uint     InpCount   =20;
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart(void)
      {
    //--- arrays to get timeseries from the Rates structure
       double   open[];
       double   close[];
       float    closef[];
       datetime time1[], time2[];
    //---request close prices to a double array
       ResetLastError();
       int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
       PrintFormat("1. CopySeries  returns %d values. Error code=%d", res1, GetLastError());
       ArrayPrint(close);
       
    
    //--- now also request open prices; use float array for close prices
       ResetLastError();
       int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
       PrintFormat("2. CopySeries  returns %d values. Error code=%d", res2, GetLastError());
       ArrayPrint(closef);
    //--- compare the received data
       if((res1==res2) && (time1[0]==time2[0]))
         {
          Print("  | Time             |    Open      | Close double | Close float |");
          for(int i=0; i<10; i++)
            {
             PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                         i, TimeToString(time1[i]), open[i], close[i], closef[i]);
            }
         }
    /*  Result
            1. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
            2. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
              | Time             |    Open      | Close double | Close float |
            0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
            1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
            2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
            3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
            4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
            5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
            6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
            7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
            8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
            9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
    */
      }
  5. Correction de la fonction OrderSend. La fonction pouvait retourner un ticket d’ordre incorrect si un même compte était utilisé simultanément sur plusieurs plateformes.
  6. Correction de l'importation des bibliothèques EX5. Une erreur s'est produite si le nom de la bibliothèque importée correspondait au nom du fichier dans lequel elle a été importée.

MetaEditor

  1. Ajout de l'envoi de notifications push aux membres d’un projet partagé. La nouvelle option permet d’informer les utilisateurs des modifications apportées aux paramètres et aux fichiers du projet. Pour activer les notifications, entrez votre identifiant MetaQuotes dans la section "Paramètres \ Sécurité" de votre profil MQL5.Community.


    Notifications push lors des mises à jour du projet


  2. Mise à jour des icônes de fichiers dans le navigateur. De nouvelles icones plus simples les rendront plus faciles à comprendre.

Tester

  1. Correction d'une erreur qui provoquait la coupure d’une chaîne de caractère si elle contenait le caractère "|".
  2. Correction des erreurs rapportées dans les journaux de crash.

Nouvelle version 3620 du Terminal Web MetaTrader 5

  1. Ajout de modèles de couleurs prêts à l'emploi pour l'interface du Terminal Web. Les modèles affectent l'affichage des barres et des lignes du graphique, ainsi que les prix dans le Market Watch et les états financiers du compte. Notre équipe de conception a préparé des préréglages de modèles de couleurs, basés sur vos suggestions et sur des combinaisons de couleurs traditionnelles.


    Nouveaux modèles de couleurs pour les terminaux web


  2. Fenêtre de spécification de symbole repensée. Les données des instruments de trading ont été réorganisées en blocs logiques pour faciliter la visualisation.


    Mise à jour de la fenêtre de spécification des instruments de trading


  3. Correction de l’ouverture de comptes réels via le terminal web. Le serveur pouvait renvoyer une erreur après avoir rempli un formulaire d'inscription.
  4. Correction d'une erreur dans la boîte de dialogue de trading. Si l'utilisateur fermait une position en appuyant sur le bouton X dans la fenêtre Boîte à outils alors que la boîte de dialogue de modification de position était ouverte, le contenu de la boîte de dialogue n'était pas réinitialisé. Après la mise à jour, la boîte de dialogue sera automatiquement réinitialisée à un nouveau mode de passation d’ordre dans ce cas.
  5. Correction de l'affichage du champ Serveur dans la boîte de dialogue de gestion des comptes.
  6. Correction de l'affichage de la période actuelle sur la barre d'outils.
  7. Correction de l’affichage des volumes en termes d'unités d'actifs sous-jacents, dans la boîte de dialogue de trading.
  8. Correction de la modification des niveaux du Stop Loss et du Take Profit. La modification d'une des valeurs peut réinitialiser la seconde sous certaines conditions.
  9. Correction de l’affichage des avertissements de risque d'investissement.


6 mars 2023
MetaTrader 5 pour iPhone/iPad : Amélioration des fonctions de trading et d'analyse sur les graphiques
  1. Ajout de la possibilité de placer des ordres stop et stop-limit à partir du graphique.

    Dans les versions précédentes, seuls les ordres à cours limité étaient disponibles. Sélectionnez le type désiré en appuyant successivement sur le bouton situé dans la partie inférieure du tableau.


    Placer des ordres Stop et Stop Limit depuis le graphique


  2. Ajout de la possibilité d'accéder aux fonctions de clôture de position ou de suppression d'ordre en attente à partir du graphique. Sélectionnez une position ou un niveau d'ordre sur le graphique, et la commande correspondante apparaîtra dans le panneau de trading inférieur :


    Gérer les positions et les ordres à partir du graphique


  3. Fonctionnalité améliorée qui déplace le bord droit du graphique des prix. Pour modifier le décalage, il suffit de faire défiler le graphique jusqu'au dernier prix, jusqu'à ce qu'un séparateur vertical apparaisse. Faites ensuite glisser le triangle situé en bas de l'échelle graphique :


    Modifier le décalage du graphique en faisant glisser le triangle sur l'échelle inférieure


  4. Ajout de la possibilité de copier des objets d’analyse sur le graphique. Cela permet d'accélérer le marquage des graphiques. Ouvrez le menu de l'objet avec une pression longue et sélectionnez "Copier" :

    Créer des copies d'objets d’analyse


  5. Ajout de la possibilité de gérer l'affichage des indicateurs sur différentes périodes. Si l'indicateur n'est pas adapté à certaines périodes du graphique, il peut être masqué afin de libérer de l'espace sur l'écran pour d'autres objets d'analyse.


    Gérer l'affichage des indicateurs sur différentes périodes


  6. Ajout de l'affichage des commissions des symboles dans la fenêtre de spécification de l'instrument.


    Découvrez le montant de la commission dans la spécification de l'instrument


  7. Ajout d'un lien de récupération du mot de passe. Le mot de passe d'un compte ne peut être rétabli que par l'intermédiaire du courtier concerné. Le lien indique les coordonnées du courtier.


    Aide à la récupération du mot de passe


  8. Ajout de la possibilité de partager un lien vers une chaîne de la MQL5.community.


    Partager un lien vers votre chaîne via l'application


  9. Amélioration de l'expérience de l'utilisateur lorsqu'il se connecte à un compte soumis à des restrictions de trading.

    Le trading peut être limité pour diverses raisons : connexion en mode investisseur ; aucun accord de trading accepté ; la vérification du courtier n'a pas été effectuée, etc. La raison de l'indisponibilité des fonctions de trading n'était pas expliquée auparavant.

    Maintenant, si les fonctions de trading sont limitées, le bouton de passation d'ordre de la section Trade est grisé. En appuyant sur cette touche, les informations et recommandations pertinentes sont affichées.


    Informations utiles en cas de restriction du trading


  10. Amélioration du flux de travail avec les certificats SSL utilisés pour l'authentification avancée.

    Maintenant, lorsque l'utilisateur se connecte à un compte avec une authentification avancée, l'application affiche une brève description des actions requises.


    Amélioration du fonctionnement des certificats SSL


    Un certificat peut être importé à partir d'un fichier PFX. Enregistrez le fichier nécessaire dans l'application Files, puis utilisez la fonction d'import dans la boîte de dialogue de démarrage.

    Il est également possible d'importer des certificats dans des fichiers, ce qui permet d'utiliser des certificats sur d'autres appareils. Pour ce faire, allez dans Paramètres \ Certificats et sélectionnez "Exporter" dans le menu des certificats.

  11. La construction des graphiques de prix a été transférée à Metal, l'API graphique de dernière génération utilisée dans les appareils Apple. Cela augmente considérablement les performances de rendu des graphiques, des indicateurs et des objets.
  12. Correction du remplacement des niveaux de Stop Loss et de Take Profit dans la Profondeur de Marché. Pour les comptes FIFO, les niveaux de stop seront automatiquement définis selon les niveaux de stop des positions ouvertes sur le même instrument. Ce processus est nécessaire pour se conformer à la règle FIFO.
  13. Correction des recotations. Lorsqu'une nouvelle cotation est reçue, l'utilisateur dispose d'un court délai pour accepter ou refuser les nouveaux prix. Si aucune décision n'est prise dans le délai imparti, la demande est automatiquement rejetée et la fenêtre de recotation est automatiquement fermée.
  14. Correction de l'affichage de l'heure dans la section Graphique lors de l'utilisation du thème sombre de l’interface.
16 décembre 2022
MetaTrader 5 build 3550 : Améliorations et corrections

Terminal

  1. Terminal : Mise à jour des traductions de l'interface utilisateur.
  2. Corrections basées sur les journaux d'incidents.

Terminal Web

9 décembre 2022
MetaTrader 5 build 3540 : Authentification 2FA/TOTP et amélioration du Market Watch dans le terminal Web

Terminal Web

  1. Ajout de l'authentification 2FA/TOTP à l'aide de Google Authenticator et d'applications similaires.

    L'authentification forte 2FA/TOTP protège un compte de trading contre tout accès non autorisé même si son identifiant et son mot de passe sont divulgués. L'authentification à l'aide de l'algorithme de mot de passe à usage unique (TOTP) basé sur le temps peut être mis en œuvre à l'aide de diverses applications mobiles. Les plus populaires d'entre elles sont Google Authenticator, Microsoft Authenticator, LastPass Authenticator et Authy. Vous pouvez maintenant vous connecter à votre compte dans le terminal client MetaTrader 5 en utilisant des mots de passe à usage unique générés par ces applications Authenticator.

    Pour activer l'option d'authentification à deux facteurs, connectez-vous à votre compte via le terminal Web MetaTrader 5. Cliquez ensuite sur votre compte dans le menu et sélectionnez "Activer 2FA/TOTP" dans la boîte de dialogue qui s'ouvre. Exécutez l'application Authenticator sur votre appareil mobile, cliquez sur "+" pour ajouter votre compte de trading et scannez le QR code depuis le terminal. Saisissez le code généré dans le champ "Mot de passe à usage unique" et cliquez sur "Activer la 2FA". Un secret sera enregistré pour votre compte sur le serveur de trading du courtier.


    Ajout de la prise en charge de l'authentification 2FA/TOTP à l'aide de Google Authenticator et d'applications similaires


    Le secret enregistré sera utilisé dans l'application Authenticator pour générer un code OTP chaque fois que vous vous connectez à votre compte. Chaque mot de passe est valide pendant 30 secondes. Après cela, un nouveau mot de passe est généré.


    Un OTP supplémentaire de l'application Authenticator sera nécessaire pour se connecter au compte


    Un code de sauvegarde est également affiché dans la boîte de dialogue du QR code pour la liaison avec le générateur. Sauvegardez-le dans un endroit sûr. Si vous perdez l'accès à votre appareil lié, le code vous permettra d'ajouter à nouveau votre compte à l'application Authenticator.

    Si vous décidez de supprimer le secret stocké de l'application Authenticator, vous devez d'abord désactiver l'authentification 2FA/TOTP à l'aide de la commande correspondante du menu contextuel du compte. Si la nouvelle méthode d'authentification 2FA/TOTP n'est pas disponible sur votre compte, veuillez contacter votre courtier.

  2. Augmentation de la quantité de données affichées dans le Market Watch. Maintenant, en plus des prix d'achat et de vente actuels et du pourcentage de changement de prix, vous pouvez voir :

    • Prix maximum et minimum de l'offre et de la demande pour la session de trading en cours
    • Prix d'ouverture de la session de trading actuelle et prix de clôture de la session de trading précédente

    Utilisez le menu contextuel pour personnaliser les informations affichées :


    Données supplémentaires du Market Watch


  3. Ajout de l'affichage de la notification de risque lorsqu'un paramètre correspondant est activé du côté du courtier. Certains régulateurs exigent que les traders lisent et acceptent la notification avant de négocier.
  4. Correction de l'affichage de la barre d'outils supérieure sur les modèles d'iPhone présentant une encoche en haut de l'écran. Auparavant, il pouvait occasionnellement couvrir les boutons du panneau.
  5. Correction de l'affichage des paramètres financiers finaux du compte (bénéfice, fonds propres, etc.) dans le navigateur Google Chrome. Parfois, ils n'étaient pas mis à jour.

Terminal Client

  1. Boîte de dialogué d’ouverture d’un compte de démo optimisée et grandement accélérée.
  2. Mise à jour des traductions de l'interface utilisateur.
  3. Corrections basées sur les journaux d'incidents.

MQL5

  1. Ajout de nouvelles méthodes à la classe COpenCL de la Bibliothèque Standard :

    • BufferFromMatrix - remplissage du tampon du périphérique avec des données provenant de la matrice
    • BufferToMatrix - lecture des données du tampon du périphérique dans la matrice
    • ContextCreate - création du contexte du périphérique (la première partie de la méthode Initialize)
    • ProgramCreate - création d'un programme basé sur le code source OpenCL (la deuxième partie de la méthode Initialize)
    • ContextClean - libération de toutes les données appartenant au contexte du périphérique (similaire à la méthode Shutdown mais sans supprimer le contexte)
    • GetDeviceInfoInteger - pour récupérer une propriété de type "integer" du périphérique
    • GetKernelInfoInteger - pour récupérer une propriété de type "integer" du noyau
    • GetDeviceInfo - pour récupérer n’importe quelle propriété de type "integer" du périphérique non présente dans l'énumération ENUM_OPENCL_PROPERTY_INTEGER

    Exemple d'utilisation de GetDeviceInfo :
    long preferred_workgroup_size_multiple = OpenCL.GetDeviceInfo(0x1067);
  2. Ajout des valeurs TERMINAL_CPU_NAME et TERMINAL_OS_VERSION dans l'énumération ENUM_TERMINAL_INFO_STRING. Ils permettent d’obtenir les noms du processeur et du système d'exploitation de l'utilisateur.
    void OnStart()
      {
       string  cpu, os;
    //---
       cpu = TerminalInfoString(TERMINAL_CPU_NAME);
       os = TerminalInfoString(TERMINAL_OS_VERSION);
       PrintFormat("CPU : %s, OS : %s", cpu, os);
      }
    
    Résultat :
    CPU : Intel Xeon E5-2630 v4 @ 2.20GHz, OS : Windows 10, version 19045
  3. Correction du fonctionnement du paramètre "table_or_sql" dans les fonctions DatabasePrint et DatabaseExport. Il est maintenant possible de passer un nom de table en plus d'une requête SQL.

MetaEditor

  1. Correction de la vérification du nombre maximum de colonnes affichables dans la base de données. Il est désormais possible d'afficher jusqu'à 64 colonnes.
  2. Correction du fonctionnement des points d'arrêt dans les constructions courtes comme IF[ if (condition) break; ].
25 novembre 2022
MetaTrader 5 build 3520 : Authentification 2FA/TOTP avec Google Authenticator

Terminal

  1. Ajout de l'authentification 2FA/TOTP à l'aide de Google Authenticator et d'applications similaires.

    L'authentification forte 2FA/TOTP protège un compte de trading contre tout accès non autorisé même si son identifiant et son mot de passe sont divulgués. L'authentification à l'aide de l'algorithme de mot de passe à usage unique (TOTP) basé sur le temps peut être mis en œuvre à l'aide de diverses applications mobiles. Les plus populaires d'entre elles sont Google Authenticator, Microsoft Authenticator, LastPass Authenticator et Authy. Vous pouvez maintenant vous connecter à votre compte dans le terminal client MetaTrader 5 en utilisant des mots de passe à usage unique générés par ces applications Authenticator.

    Pour activer l'option d'authentification à 2 facteurs, connectez-vous à votre compte et exécutez la commande "Activer la 2FA/TOTP" dans le menu contextuel du compte. Exécutez l'application Authenticator sur votre appareil mobile, cliquez sur "+" pour ajouter votre compte de trading et scannez le QR code depuis le terminal. Saisissez le code généré dans le champ "Mot de passe à usage unique" et cliquez sur "Activer la 2FA". Un secret sera enregistré pour votre compte sur le serveur de trading du courtier.


    Ajout de la prise en charge de l'authentification 2FA/TOTP à l'aide de Google Authenticator et d'applications similaires.

    Le secret enregistré sera utilisé dans l'application Authenticator pour générer un code OTP chaque fois que vous vous connectez à votre compte. Chaque mot de passe est valide pendant 30 secondes. Après cela, un nouveau mot de passe est généré.



    Un OTP supplémentaire de l'application Authenticator sera nécessaire pour se connecter au compte

    Si vous décidez de supprimer le secret stocké de l'application Authenticator, vous devez d'abord désactiver l'authentification 2FA/TOTP à l'aide de la commande correspondante du menu contextuel du compte. Si la nouvelle méthode d'authentification 2FA/TOTP n'est pas disponible sur votre compte, veuillez contacter votre courtier.

MQL5

  1. Correction du fonctionnement de la fonction CopyTicks pour les instruments de trading personnalisés. Lorsque vous travaillez avec des symboles personnalisés, les ticks initiaux de la session précédente peuvent être renvoyés au lieu des données demandées, sous certaines conditions.

  2. Ajout de nouvelles valeurs d'énumération pour obtenir le dernier code d'erreur OpenCL et la description textuelle.
    1. La valeur CL_LAST_ERROR (code 4094) a été ajoutée à l'énumération ENUM_OPENCL_PROPERTY_INTEGER

      Lors de la récupération de la dernière erreur OpenCL via CLGetInfoInteger, le paramètre handle est ignoré. Descriptions des erreurs : https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API. html#CL_SUCCESS.
      Pour un code d'erreur inconnu, la chaîne "erreur OpenCL inconnue N" est renvoyée, où N est le code d'erreur.

      Exemple :
      //--- the first handle parameter is ignored when obtaining the last error code
      int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);

    2. La valeur CL_ERROR_DESCRIPTION (4093) a été ajoutée à l'énumération ENUM_OPENCL_PROPERTY_STRING .
      Une description d'erreur textuelle peut être obtenue à l'aide de CLGetInfoString. Descriptions des erreurs : https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API. html#CL_SUCCESS.

      Lors de l'utilisation de CL_ERROR_DESCRIPTION, un code d'erreur doit être transmis pour le paramètre handle dans CLGetInfoString. Si CL_LAST_ERROR est transmis à la place du code d'erreur, la fonction renverra la dernière description d'erreur.

      Exemple :
      //--- get the code of the last OpenCL error
      int    code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
      string desc; // to get the text description of the error
      
      //--- use the error code to get the text description of the error
      if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      
      
      //--- to get the description of the last OpenCL error without receiving the code, pass CL_LAST_ERROR  
      if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION, desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      Le nom de l'énumération interne est transmis comme description de l'erreur. Son explication peut être trouvée sur https://registry.khronos.org/OpenCL/specs/3.0-unified/html /OpenCL_API.html#CL_SUCCESS. Par exemple, la valeur CL_INVALID_KERNEL_ARGS signifie "Renvoyé lors de la mise en file d'attente d'un noyau lorsque certains arguments du noyau n'ont pas été définis ou sont invalides." (" Returned when enqueuing a kernel when some kernel arguments have not been set or are invalid." )

  3. Correction du fonctionnement de la méthode matrix::MatMul. Lorsque vous travaillez avec de grandes matrices, le terminal peut planter sur certaines tailles.

Correction des erreurs rapportées dans les journaux de crash.
18 novembre 2022
MetaTrader 5 build 3510 : Améliorations du Terminal Web

WebTerminal  MetaTrader 5

  1. Dans la version mobile, nous avons implémenté le tri de l'historique des transactions et le filtrage par profondeur. Utilisez les commandes du panneau supérieur pour personnaliser l'affichage de l'historique :


    Vue de l'historique des transactions personnalisable dans la version mobile


    Les opérations peuvent être triées selon les principaux paramètres, tels que la date, le ticket, le symbole et le volume.

  2. Amélioration de l'accès aux détails du compte de trading.

    • Dans la version de bureau, il est possible de cliquer sur les données du compte courant. Cliquez sur le compte pour afficher ses détails.
    • Dans la version mobile, le compte courant est affiché dans la section "Paramètres". Cliquez sur le compte pour afficher ses détails.


    Amélioration de l'accès aux données du compte de trading

  3. Correction de l'affichage du type de compte dans la fenêtre de gestion du compte.
  4. Les fonds propres et la marge libre s'affichent après le rafraîchissement de la page du terminal web dans les navigateurs mobiles.
  5. Correction de l'affichage de la barre inférieure dans le navigateur mobile Firefox.

Terminal

  1. Calculs des fonds propres et du graphique du solde dans le rapport de trading.

MQL5

  1. Nouveau comportement de la fonction typename(expr). La nouvelle version de la fonction renvoie le type complet avec les modificateurs et les dimensions (pour les tableaux) :
    class A
      {
      };
    
    void OnStart(void)
      {
       const A *const arr[][2][3]={};
       Print(typename(arr));
      }
    
    Résultat :
    "class A const * const [][2][3]"
Correction des erreurs rapportées dans les journaux de crash.


11 novembre 2022
MetaTrader 5 build 3500 : Améliorations et corrections

Terminal

  1. Une nouvelle commande a été ajoutée au menu contextuel des sections Trade et Historique, pour permettre l'accès au nouveau rapport de trading.


    Le rapport de trading fournit les données de performance suivantes :
    • Graphiques et tableaux de l’évolution mensuelle
    • Graphique des fonds
    • Graphique sous forme de radar permettant une évaluation rapide de l'état du compte
    • Statistiques de trading par instrument
    • Une variété de métriques supplémentaires pour l'analyse de toutes les transactions

  2. Correction du calcul du dépôt initial dans le rapport de trading.
  3. Correction du réglage des niveaux de Stop Loss et Take Profit lors de l'utilisation du panneau de trading rapide dans le graphique et dans le Market Watch. Les niveaux pouvaient être hérités de positions précédemment ouvertes, même lorsque l'héritage n'était pas nécessaire (la fonctionnalité correspondante est mise en œuvre pour les comptes basés sur le FIFO).
  4. Mise à jour des traductions de l'interface utilisateur.

MQL5

  1. Correction d'un bug du compilateur qui permettait l'accès à un champ de structure en utilisant une constante avec la valeur du nom du champ.
  2. Correction de la vérification des états des touches à l'aide de la fonction TerminalInfoInteger(TERMINAL_KEYSTATE_*).

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

Nouvelle version du Terminal Web MetaTrader 5

  1. Correction de la clôture des positions lors des re-cotations.
  2. Correction de la reconnexion au serveur après la maximisation d'une fenêtre de navigateur restée inactive pendant une longue période.
  3. Correction de l’affichage des fonds de crédit.
  4. Autres améliorations et corrections.


4 novembre 2022
MetaTrader 5 build 3490 : Version du terminal Web mobile et nouvelles méthodes matricielles dans MQL5

Version mobile de la plateforme web

Le nouveau terminal Web offre le support complet des appareils mobiles. L'interface s'adaptera automatiquement à la taille de l'écran, permettant des opérations plus efficaces depuis les téléphones et tablettes iOS et Android :

Ajout du support des appareils mobiles dans le nouveau terminal web

En outre, le Terminal Web comporte de nombreuses corrections et améliorations.

Le nouveau terminal Web MetaTrader 5 prend en charge l'ensemble des fonctions de trading. Il permet aux utilisateurs de :

  • Travailler avec des comptes de démonstration et des comptes réels
  • Recevoir les cotations de n’importe quel symbole financier
  • Trader sur tous les marchés
  • Analyser les cotations des symboles à l'aide de plus de 30 indicateurs et de 20 objets graphiques.
  • Utiliser les données du Calendrier Economique pour l'analyse fondamentale


Terminal

  1. Fonctions étendues du gestionnaire des tâches. La nouvelle version permet un suivi plus précis des ressources consommées.

    • Ajout de l’affichage de la taille de la pile des threads.
    • Ajout de l'affichage du nombre de changements de contexte.
    • Ajout de la reconnaissance des threads de DLL du système et de tiers.
    • Ajout de l'affichage du temps de fonctionnement en mode noyau. Une augmentation de cette mesure par rapport au temps passé par l’utilisateur peut indiquer des problèmes au niveau du système : problèmes de pilotes, erreurs matérielles ou matériel lent. Pour plus de détails, veuillez lire la documentation de Microsoft.
    • Ajout de l'affichage du temps de fonctionnement en mode utilisateur.

    Gestionnaire OpenCL pour contrôler les périphériques disponibles


  2. Nouvel onglet OpenCL dans les paramètres du terminal pour la gestion des périphériques disponibles. Le nouveau gestionnaire OpenCL permet de spécifier explicitement les périphériques à utiliser pour les calculs.

    Gestionnaire OpenCL pour contrôler les périphériques disponibles

  3. Ajout de l'indication des niveaux de Stop Loss et de Take Profit dans le Depth of Market pour les comptes fonctionnant en mode FIFO (le mode peut être activé du côté du courtier).

    Selon la règle FIFO, les positions de chaque instrument ne peuvent être clôturées que dans l'ordre dans lequel elles ont été ouvertes. Pour assurer une fermeture de position conforme au FIFO par des niveaux de stops, la logique suivante a été implémentée du côté du terminal client :

    Si plusieurs positions existent pour le même instrument, le placement des niveaux de stop pour l'une des positions entraîne le placement des mêmes niveaux pour toutes les autres positions également. Par conséquent, si un niveau se déclenche, toutes les positions seront fermées dans un ordre conforme au FIFO.

    Désormais, lorsque l'utilisateur ouvre le Depth of Market d'un instrument pour lequel des positions sont déjà ouvertes, les niveaux des positions existantes (le cas échéant) sont automatiquement spécifiés dans les champs Stop Loss et Take Profit.

  4. Correction de la suppression des niveaux de Stop Loss et Take Profit à l'aide des boutons X dans la fenêtre Boîte à Outils\Trade. Une erreur pouvait se produire lorsque la fonction de trading rapide était désactivée. Un clic sur le bouton ouvre une boîte de dialogue de trading avec une valeur vide pour le niveau concerné.

  5. Correction des légendes des graphiques et des calculs des commissions finales dans le rapport de trading. La section pouvait afficher des bénéfices incorrects dans les statistiques du rapport et des valeurs incorrectes dans les infobulles des graphiques Equity et Balance.

MQL5

  1. Ajout des méthodes CopyTicks et CopyTicksRange pour les vecteurs et pour les matrices. Elles permettent de copier facilement des tableaux de données de ticks en vecteurs et matrices.
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    Le type de données copié est spécifié dans le paramètre 'flags' à l'aide de l'énumération ENUM_COPY_TICKS. Les valeurs suivantes sont disponibles :
    COPY_TICKS_INFO    = 1,       // ticks résultant du changement des prix Bid et/ou Ask
    COPY_TICKS_TRADE   = 2,       // ticks résultant du changement des du prix Last et du Volume
    COPY_TICKS_ALL     = 3,       // tous les ticks ont changé
    COPY_TICKS_TIME_MS = 1<<8,    // heure en millisecondes
    COPY_TICKS_BID     = 1<<9,    // prix Bid
    COPY_TICKS_ASK     = 1<<10,   // prix Ask
    COPY_TICKS_LAST    = 1<<11,   // prix Last
    COPY_TICKS_VOLUME  = 1<<12,   // volume
    COPY_TICKS_FLAGS   = 1<<13,   // flags du tick
    Si plusieurs types de données sont sélectionnés (uniquement disponible pour les matrices), l'ordre des lignes dans la matrice correspondra à l'ordre des valeurs dans l'énumération.

  2. Fonctionnalités des méthodes matrix::Assign et vector::Assign améliorées.

    On peut maintenant attribuer à la matrice un tableau ou un vecteur unidimensionnel :
    Le résultat sera une matrice de 1 ligne.

    De plus, une matrice peut maintenant être assignée à un vecteur (un lissage de la matrice sera effectué) :
    bool vector::Assign(const matrix &mat);
  3. Ajout des méthodes Swap pour les vecteurs et les matrices.
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    Chaque tableau, vecteur ou matrice fait référence à un buffer mémoire contenant les éléments de cet objet. La méthode Swap échange en fait les pointeurs vers ces buffers sans écrire les éléments en mémoire. Par conséquent, une matrice reste une matrice, et un vecteur reste un vecteur. L'échange d'une matrice et d'un vecteur donnera une matrice à 1 rangée avec des éléments de vecteur et un vecteur avec des éléments de matrice dans une représentation plate (voir la méthode Flat).
    //+------------------------------------------------------------------+
    //| Fonction de démarrage du programme de script                     |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3}, {4, 5, 6}};
      Print("a avant Swap: \n", a);
      matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
      Print("b après Swap: \n", b);  
    //--- échange les pointeurs des matrices
      a.Swap(b);
      Print("a avant Swap: \n", a);
      Print("b après Swap: \n", b);
      /*
      a avant Swap:
      [[1,2,3]
      [4,5,6]]
      b avant Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a après Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b après Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v avant Swap: \n", v);
      Print("b avant Swap: \n", b);
      v.Swap(b);
      Print("v après  Swap: \n", v);
      Print("b après  Swap: \n", b);
      /*
      v avant Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b avant  Swap:
      [[1,2,3]
      [4,5,6]]
      
      v après Swap:
      [1,2,3,4,5,6]
      b après  Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    La méthode Swap() permet également d'effectuer des opérations avec des tableaux dynamiques (les tableaux de taille fixe ne peuvent pas être passés en paramètre). Le tableau peut être de n'importe quelle dimension mais d'une taille convenue, ce qui signifie que la taille totale d'une matrice ou d'un vecteur doit être un multiple de la dimension 0 du tableau. La dimension 0 du tableau est le nombre d'éléments contenus au 1er indice. Par exemple, pour un tableau dynamique à 3 dimensions "double array[][2][3]", la dimension 0 est le produit de la taille des 2ème et 3ème dimensions : 2 x 3 = 6. Ainsi, un tel tableau ne peut être utilisé dans la méthode Swap qu'avec des matrices et des vecteurs dont la taille totale est un multiple de 6 : 6, 12, 18, 24, etc.

    Prenons l'exemple suivant :
    //+------------------------------------------------------------------+
    //| Fonction de démarrage du script                                  |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- remplit la matrice 1x10 avec la valeur 7.0
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix avant Swap :\n", m);
    //--- essaye d'échanger la matrice et le tableau
      double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
      Print("array_small avant Swap :");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small après Swap :");
        ArrayPrint(array_small);
        Print("matrix après Swap : \n", m);
       }
      else // la taille de la matrice n'est pas un multiple de la première dimension du tableau
       {
        Print("Echec de m.Swap(array_small). Erreur ", GetLastError());
       }
      /*
      matrix avant Swap :
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small avant Swap :
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      Echec de m.Swap(array_small). Erreur 4006
      */
    //--- utilise une matrice plus grande et réessaye l'opération de swap
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static avant Swap :");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static après Swap :");
        ArrayPrint(array_static);
        Print("matrix après Swap : \n", m);
       }
      else // un tableau statique ne peut pas être utilisé pour permuter avec une matrice
       {
        Print("Echec de m.Swap(array_static). Erreur ", GetLastError());
       }
      /*
      array_static avant Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      Echec de m.Swap(array_static). Erreur 4006
      */
    //--- une autre tentative d'échanger un tableau et une matrice
      double array_dynamic[][10];    // tableau dynamique
      ArrayResize(array_dynamic, 3); // définit la taille de la première dimension
      ArrayCopy(array_dynamic, array_static);
    //--- utilise maintenant un tableau dynamique pour le swap
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic après Swap :");
        ArrayPrint(array_dynamic);
        Print("matrix après Swap : \n", m);
       }
      else //  aucune erreur
       {
        Print("Echec de m.Swap(array_dynamic). Erreur ", GetLastError());
       }
      /*
      array_dynamic après Swap :
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      matrix après Swap :
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  4. Ajout de la méthode LossGradient pour les vecteurs et les matrices. Cette méthode calcule un vecteur ou une matrice de dérivées partielles de la fonction de perte sur les valeurs prédites. En algèbre linéaire, un tel vecteur est appelé gradient et est utilisé dans l'apprentissage automatique.
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  5. Permet l'utilisation de FOREIGN KEYS dans SQLite pour renforcer les relations entre les tables dans les requêtes SQL.   Exemple :
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  6. Sélection fixe de la méthode de classe appropriée en fonction de la constance de la méthode et de l'objet.

MetaEditor

  1. Augmentation de la longueur autorisée des commentaires dans commits du Dépôt MQL5. Des commentaires détaillés lors de la validation des changements dans le référentiel sont considérés comme une bonne pratique lorsque l'on travaille sur de grands projets, mais auparavant la longueur des commentaires était limitée à 128 caractères. La longueur autorisée est désormais de 260 caractères maximum.

MetaTester

  1. Sensibilité accrue du sélecteur de vitesse de test en mode visuel.

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

17 septembre 2022
MetaTrader 5 build 3440 : Nouveau rapport sur le compte de trading

Terminal

  1. Ajout d'un nouveau rapport sur les performances de trading des comptes. Il est similaire aux rapports de la section Signals déjà connus, en termes de disponibilité des statistiques et de présentation des données. Les données de performance suivantes seront disponibles dans la plateforme :
    • Graphiques et tableaux visualisant les mesures de croissance mensuelles
    • Graphique des fonds
    • Graphique sous forme de radar permettant une évaluation rapide de l'état du compte
    • Statistiques de trading par instrument
    • Une variété de métriques supplémentaires pour l'analyse de toutes les transactions

    Le rapport peut être consulté directement depuis la plateforme, sans qu'il soit nécessaire de l'exporter vers un fichier. Pour l'ouvrir, sélectionnez Rapports dans le menu Affichage.




  2. Correction du remplissage du tableau des options pour les contrats de type Call et Put dont la quantité ou le type de symbole ne correspond pas.
  3. Correction de la sélection de la position dans la boîte de dialogue Trade pendant les opérations de type Close by. L'erreur pouvait se produire pour les listes d'ordres opposés triées par toute colonne autre que le ticket.
  4. Journalisation accélérée de la plateforme.
  5. Correction de l'affichage des commentaires sur les graphiques des symboles personnalisés.

MQL5

  1. Correction du fonctionnement de la fonction CArrayList::LastIndexOf. Auparavant, elle retournait toujours -1 au lieu de l'index du dernier élément trouvé.
  2. Ajout d'une nouvelle méthode de matrice et de vecteur - Assign. Elle remplace les éléments de la matrice/du vecteur par les données de la matrice, du vecteur ou du tableau transmis.
    bool vector<TDst>::Assign(const vector<TSrc> &assign);
    bool matrix<TDst>::Assign(const matrix<TSrc> &assign);
    
    Exemple :
      //--- copying matrices
      matrix b={};
      matrix a=b;
      a.Assign(b);
      
      //--- copying an array to a matrix
      double arr[5][5]={{1,2},{3,4},{5,6}};
      Print("array arr");
      ArrayPrint(arr);
      b.Assign(arr);
      Print("matrix b \n",b);
    /*
    array arr
            [,0]    [,1]    [,2]    [,3]    [,4]
    [0,] 1.00000 2.00000 0.00000 0.00000 0.00000
    [1,] 3.00000 4.00000 0.00000 0.00000 0.00000
    [2,] 5.00000 6.00000 0.00000 0.00000 0.00000
    [3,] 0.00000 0.00000 0.00000 0.00000 0.00000
    [4,] 0.00000 0.00000 0.00000 0.00000 0.00000
    matrix b 
    [[1,2,0,0,0]
     [3,4,0,0,0]
     [5,6,0,0,0]
     [0,0,0,0,0]
     [0,0,0,0,0]]
    
    */
  3. Ajout d'une nouvelle méthode de matrice et de vecteur - CopyRates. Elle copie les tableaux de données de prix en vecteurs et matrices.
    bool matrix::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    bool vector::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    Le type de données copiées est spécifié dans le paramètre rates_mask en utilisant l'énumération ENUM_COPY_RATES. Les valeurs suivantes sont disponibles :
    COPY_RATES_OPEN
    COPY_RATES_HIGH
    COPY_RATES_LOW
    COPY_RATES_CLOSE
    COPY_RATES_TIME
    COPY_RATE_VOLUME_TICK
    COPY_RATES_VOLUME_REAL
    COPY_RATES_SPREAD
    COPY_RATES_OHLC
    COPY_RATES_OHLCT
    Les deux dernières valeurs permettent la sélection simultanée de plusieurs paramètres des barres : Ouverture, Plus Haut, Plus Bas, Clôture et l’heure.

    Si plusieurs types de données sont sélectionnés (uniquement disponible pour les matrices), l'ordre des lignes de la matrice correspondra à l'ordre des valeurs dans l'énumération.

  4. Correction de l'affichage des objets de type "Etiquette de Texte". Lors de l'utilisation des propriétés OBJPROP_XOFFSET et OBJPROP_YOFFSET, un mauvais fragment d'image pouvait être affiché sur le graphique.

  5. Correction d'une erreur lors de la modification d'un paramètre constant transmis à une fonction en tant que référence de pointeur d'objet.

    Le spécificateur const déclare une variable comme étant une constante pour éviter qu'elle ne soit modifiée pendant l'exécution du programme. Il ne permet qu'une seule initialisation de la variable lors de sa déclaration. Exemple de variables constantes dans la fonction OnCalculate:

    int OnCalculate (const int rates_total,      // price[] array size
                     const int prev_calculated,  // bars processed on previous call
                     const int begin,            // meaningful data starts at
                     const double& price[]       // array for calculation
       );
    

    L'exemple ci-dessous contient une erreur de compilation qui a permis un casting implicite de pointeur pour les paramètres de référence :

    class A {};
    const A *a = new A;
    
    void foo( const A*& b )
      {
       b = a;
      }
    
    void OnStart()
      {
            A *b; 
            foo(b);  // not allowed
            Print( a,":",b );
      }
    Le compilateur détectera ces opérations illégales et renverra une erreur correspondante.

MetaEditor

  1. Correction de l'affichage des références à des nombres complexes dans le débogueur.
  2. Amélioration du MQL5 Cloud Protector. La protection des fichiers pouvait auparavant échouer dans certaines conditions.
  3. Correction des erreurs rapportées dans les journaux de crash.

Nouveau version du Terminal Web MetaTrader 5

Nous avons publié une nouvelle version du Terminal Web MetaTrader 5 avec une nouvelle interface et un noyau repensé. La nouvelle interface est similaire à la version du terminal pour iPad :

Nouveau Terminal Web MetaTrader 5


Cette nouvelle version dispose également de nombreuses nouvelles fonctions :

  • Possibilité de demander un comptes réel via le formulaire d'inscription détaillé et les options d’envoi des documents
  • Prise en charge des abonnements aux flux de données des prix et possibilité de recevoir des cotations différées
  • Plus d'objets d’analyse avec des options de gestion pratiques
  • Entrées et sorties du marché affichées sur les graphiques
  • Evénements du Calendrier Economique affichés sur les graphiques
  • Configuration pratique des instruments dans le Market Watch, ainsi que les données quotidiennes de changement de prix
  • Interface simplifiée pour aider les débutants à démarrer avec le terminal : suppression du menu contextuel du graphique et du menu supérieur. Toutes les commandes de contrôle du graphique, les objets et les indicateurs sont disponibles sur le côté gauche et dans les panneaux supérieurs. Les autres commandes sont accessibles via le menu hamburger
  • Mode sombre de l'interface

Essayez dès maintenant le nouveau terminal Web sur www.mql5.com. Il sera bientôt disponible pour vos courtiers.

4 août 2022
MetaTrader 5 build 3390 : Type ’float’ dans OpenCL et dans les fonctions mathématiques, méthodes d'Activation et de Perte pour l'apprentissage automatique

Terminal

  1. Ajout de l'ouverture automatique d'un tutoriel lors de la première connexion à un compte de trading. Il aidera les débutants à apprendre les bases du trading et à explorer les nombreuses fonctionnalités de la plateforme. Le tutoriel est divisé en plusieurs sections, chacune fournissant de brèves informations sur un sujet spécifique. La progression de l'entraînement est indiquée par une ligne bleue.

    Ajout de l'ouverture automatique d'un tutoriel lors de la première connexion à un compte de trading.


  2. Correction des opérations en masse 'Fermer les positions gagnantes'/'Fermer les positions perdantes'. Auparavant, la plateforme utilisait des positions opposées si elles existaient. Par exemple, si vous aviez 2 positions longues perdantes pour l’EURUSD et 1 position courte gagnante sur l’EURUSD, les 3 positions auraient été fermées par l’opération en masse ’Fermer les positions perdantes’. Les positions longues (Buy) et courtes (Sell) seraient fermées par une opération ’Close by’. La position longue (Buy) restante serait fermée par une opération normale. Les commandes fonctionnement correctement maintenant : elles ne ferment que les positions sélectionnées, qu’elles soient profitables ou perdantes.
  3. Correction de l’affichage des prix historiques négatifs. Ces prix apparaîtront correctement sur toutes les périodes.
  4. Optimisation et réduction significative de la consommation des ressources du système par le terminal.
  5. Base de données fondamentale mise à jour pour les instruments de trading. Le nombre d'agrégateurs de données disponibles pour les instruments boursiers a été étendu à 15. Les utilisateurs auront accès aux informations de plus nombreux tickers via les agrégateurs économiques les plus populaires.

    Base de données fondamentale mise à jour pour les instruments de trading.

    Près de 7 000 titres et plus de 2 000 ETF sont cotés sur le marché boursier mondial. Les bourses proposent en plus des contrats à terme et d'autres produits dérivés. La plateforme MetaTrader 5 offre un accès à une énorme base de données d'instruments boursiers. Pour accéder aux données fondamentales correspondantes, les utilisateurs peuvent basculer en un clic sur le site Web de l'agrégateur sélectionné, directement depuis le Market Watch. De façon plus pratique, la plateforme propose directement une sélection de sources d'information pour chaque instrument financier.

  6. Correction de l’indication des Stop Loss et Take Profit dans la fenêtre de placement d’un nouvel ordre. Pour les comptes FIFO, les niveaux de stop seront automatiquement définis selon les niveaux de stop des positions ouvertes sur le même instrument. La procédure est requise conformément à la règle FIFO.

MQL5

  1. Les fonctions mathématiques peuvent maintenant fonctionner avec des matrices et des vecteurs.

    Nous continuons à améliorer les capacités de la plateforme MetaTrader 5 pour le trading algorithmique et l'apprentissage automatique. Nous avions auparavant ajouté de nouveaux types de données : matrices et vecteurs, qui éliminent le besoin d'utiliser des tableaux pour le traitement des données. Plus de 70 méthodes ont été ajoutées à MQL5 pour les opérations avec ces types de données. Les nouvelles méthodes permettent des calculs algébriques linéaire et des calculs statistiques en une seule opération. La multiplication, la transformation et les systèmes d'équations peuvent être mis en œuvre facilement, sans lignes de code supplémentaires. La dernière mise à jour ajoute des fonctions mathématiques.

    Les fonctions mathématiques ont été conçues à l'origine pour effectuer des opérations spécifiques sur des valeurs scalaires. À partir de cette construction, la plupart des fonctions peuvent être appliquées aux matrices et aux vecteurs. Parmi celles-ci, nous trouvons MathAbs, MathArccos, MathArcsin, MathArctan, MathCeil, MathCos, MathExp, MathFloor, MathLog, MathLog10, MathMod, MathPow, MathRound, MathSin, MathSqrt, MathTan, MathExpm1, MathLog1p, MathArccosh, MathArcsinh, MathArctanh, MathCosh, MathSinh et MathTanh . Ces opérations impliquent une manipulation élément par élément des matrices ou des vecteurs. Exemple :
    //---
      matrix a= {{1, 4}, {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    Pour MathMod et MathPow, le deuxième élément peut être soit un scalaire, soit une matrice/vecteur de la bonne taille.

    L'exemple suivant montre comment calculer l'écart type en appliquant des fonctions mathématiques à un vecteur.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- Use the initializing function to populate the vector
      vector r(10, ArrayRandom); // Array of random numbers from 0 to 1
    //--- Calculate the average value
      double avr=r.Mean();       // Array mean value
      vector d=r-avr;            // Calculate an array of deviations from the mean
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // Array of squared deviations
      double sum=s2.Sum();       // Sum of squared deviations
    //--- Calculate standard deviation in two ways
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Fills the vector with random values                              |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. Dans les fonctions templates, ajout de la prise en charge des notations matrix<double>, matrix<float>, vector<double>, vector<float> au lieu des types matrix, matrixf, vector et vectorf correspondants.
  3. Améliorations des fonctions mathématiques pour les opérations utilisant le type float. La possibilité nouvellement implémentée d'appliquer des fonctions mathématiques à des matrices et des vecteurs de ’float’ a permis une amélioration des fonctions mathématiques appliquées aux scalaires de type ’float’. Ces paramètres de fonction étaient auparavant automatiquement transformés en type 'double'. L'implémentation correspondante de la fonction mathématique était ensuite appelée et le résultat était retransformé en type 'float'. Les opérations sont désormais implémentées sans conversion de type supplémentaire.

    L'exemple suivant montre la différence dans les calculs mathématiques du sinus :

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  Array of random numbers from 0 to 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Fills the vector with random values                              |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. Ajout des méthodes Activation et Derivative pour les matrices et les vecteurs :
    AF_ELU               Unité Linéaire Exponentielle
    AF_EXP               Exponentiel
    AF_GELU              Unité Linéaire d'Erreur Gaussienne
    AF_HARD_SIGMOID      Sigmoïde Dure
    AF_LINEAR            Linéaire
    AF_LRELU             Unité Linéaire Rectifiée Perméable
    AF_RELU              Unité Linéaire Rectifiée
    AF_SELU              Unité Linéaire Exponentielle Mise à l'Echelle
    AF_SIGMOID           Sigmoïde
    AF_SOFTMAX           Softmax
    AF_SOFTPLUS          Softplus
    AF_SOFTSIGN          Softsign
    AF_SWISH             Bruissement
    AF_TANH              Tangente Hyperbolique
    AF_TRELU             Unité Linéaire Rectifiée Avec Seuil
    La fonction d'activation du réseau de neurones détermine comment la somme pondérée des signaux d'entrée est convertie en un signal de sortie de nœud au niveau du réseau. La sélection de la fonction d'activation a un impact important sur les performances du réseau de neurones. Différentes parties du modèle peuvent utiliser différentes fonctions d'activation. En plus de toutes les fonctions connues, MQL5 propose des fonctions dérivées. Les fonctions dérivées permettent un calcul rapide des ajustements en fonction de l'erreur obtenue lors de l'apprentissage.

  5.  Ajout de la fonction Loss pour les matrices et les vecteurs. Elle a les paramètres suivants :
    LOSS_MSE            Erreur Quadratique Moyenne
    LOSS_MAE            Erreur Absolue Moyenne
    LOSS_CCE            Inter-entropie Catégorielle
    LOSS_BCE            Inter-entropie Binaire
    LOSS_MAPE           Erreur Moyenne en Pourcentage Absolu
    LOSS_MSLE           Erreur Logarithmique Quadratique Moyenne
    LOSS_KLD            Divergence Kullback-Leibler
    LOSS_COSINE         Similarité/Proximité Cosinus
    LOSS_POISSONS        Poisson
    LOSS_HINGE          Charnière
    LOSS_SQ_HINGE       Charnière Au carré
    LOSS_CAT_HINGE      Charnière Catégorielle
    LOSS_LOG_COSH       Logarithme du Cosinus Hyperbolique
    LOSS_HUBER          Huber

    La fonction de perte évalue dans quelle mesure le modèle prédit les valeurs réelles. La construction du modèle vise à minimiser de la valeur de la fonction à chaque étape. L'approche dépend de l'ensemble de données donné. La fonction de perte peut également dépendre du poids et du décalage. La fonction de perte est unidimensionnelle. Elle n'est pas un vecteur car elle fournit une évaluation générale du réseau de neurones.

  6. Ajout des méthodes matrix::CompareByDigits et vector::CompareByDigits pour les matrices et vecteurs. Elles comparent les éléments de 2 matrices/vecteurs jusqu’aux chiffres significatifs.

  7. Ajout du support des fonction MathMin et MathMax pour les chaînes de caractères. Les fonctions utiliseront une comparaison lexicographique : les lettres sont comparées alphabétiquement, et sont sensibles à la casse (majuscule/minuscule).

  8. Le nombre maximum d'objets OpenCL a été augmenté de 256 à 65 536. Les descripteurs d'objet OpenCL sont créés dans un programme MQL5 à l'aide des fonctions CLContextCreate, CLBufferCreate et CLProgramCreate. La limite précédente de 256 descripteurs n'était pas suffisante pour une utilisation efficace des méthodes d'apprentissage automatique.

  9. Ajout de la possibilité d'utiliser OpenCL sur une carte graphique sans prise en charge du type ’double’. Auparavant, seuls les GPU prenant en charge le type ’double’ étaient autorisés dans les programmes MQL5, bien que de nombreuses tâches permettent des calculs utilisant le type ’float’. Le type ’float’ est considéré comme un type natif pour le calcul parallèle, car il prend moins de place. Par conséquent, cette ancienne exigence a été levée.

    Pour définir l'utilisation obligatoire des GPU avec la prise en charge du type ’double’ pour des tâches spécifiques, utilisez CL_USE_GPU_DOUBLE_ONLY dans l'appel à CLContextCreate.
       int cl_ctx;
    //--- Initializing the OpenCL context
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. Correction du fonctionnement de la fonction CustomBookAdd. Auparavant, une valeur différente de zéro dans le paramètre MqlBookInfo::volume_real empêchait la fonction de créer un snapshot du Market Depth. Le contrôle s'effectue désormais de la façon suivante :
    Les données transmises sont d’abord validées : le type, le prix et le volume doivent être précisés pour chaque élément. MqlBookInfo.volume et MqlBookInfo.volume_real ne doivent pas non plus être nuls ou négatifs. Si les deux volumes sont négatifs, cela est considéré comme une erreur. Vous pouvez spécifier l'un des types de volume, ou les deux, et le système utilisera celui qui est indiqué ou celui qui est positif :

       volume=-1 && volume_real=2 — volume_real=2 sera utilisé,

       volume=3 && volume_real=0 — volume=3 sera utilisé.

    Le volume avec une meilleure précision MqlBookInfo.volume_real a une priorité plus élevée que MqlBookInfo.volume. Par conséquent, si les deux valeurs sont spécifiées et valides, volume_real sera utilisé.

    Si l'un des éléments du Market Depth est décrit de manière incorrecte, le système rejettera complètement l'état transféré.

  11. Correction du fonctionnement de la fonction CalendarValueLast. En raison d'une erreur, des appels successifs à la fonction après des changements dans le Calendrier Economique (le paramètre 'change' a reçu une nouvelle valeur après l'appel) pouvaient ne pas prendre en compte certains événements avec l'utilisation du filtre sur devise.
    CalendarValueLast(change, result, "", "EUR")
  12. Correction du comportement de la fonction ArrayBSearch . Si plusieurs éléments identiques sont trouvés, un lien vers le premier résultat est renvoyé, plutôt qu'un lien aléatoire.
  13. Correction des vérifications de la visibilité des templates de fonctions dans une classe. En raison d'une erreur, les fonctions de modèle de classe déclarées comme private/protected semblaient être considérées comme public.

MetaEditor

  1. Correction des erreurs et du comportement de MetaAssist.
  2. Ajout de la prise en charge de la macro %terminal% qui indique le chemin d'accès au répertoire d'installation du terminal. Par exemple, %terminal%\MQL5\Experts. 

    Ajout de la prise en charge de la macro %terminal% qui indique le chemin d'accès au répertoire d'installation du terminal.

  3. Amélioration de l'affichage des tableaux dans le débogueur.
  4. Augmentation de la taille du buffer pour copier les valeurs du débogueur.
  5. Améliorations des conseils en cas d'erreur.
  6. Ajout d'une indication des chemins relatifs dans le fichier de projet *.mproj. Les chemins absolus étaient utilisés auparavant, ce qui entraînait des erreurs de compilation en cas de déplacement du projet.
  7. Ajout de l'intégration automatique des ressources BMP en tant que tableaux de bitmap 32 bits disponibles de façon globale dans les projets. Cela élimine le besoin d'appeler ResourceReadImage à l'intérieur du code pour lire une ressource graphique.
    'levels.bmp' as 'uint levels[18990]'
    
  8. Amélioration de la lecture des formats de fichiers BMP étendus.
  9. Mises à jour des traductions de l'interface utilisateur.
  10. Correction des erreurs signalées dans les journaux de plantage.
2 juin 2022
MetaTrader 5 build 3320 : Améliorations et correctifs

Terminal

  1. Info-bulles étendues pour les objets des trades affichés sur les graphiques :
    • Les transactions de sortie du marché affichent désormais les bénéfices.
    • L'indication correspondante est affichée pour les transactions exécutées à la suite de l'activation du Take Profit ou du Stop Loss.

    Des info-bulles similaires sont disponibles pour les lignes joignant les transactions d'entrée et de sortie.

    Info-bulles étendues pour les objets de transaction


  2. Amélioration des performances du système graphique.
  3. Ajout de la journalisation des opérations en masse avec des ordres et des positions ouvertes. Lorsqu'une telle commande est exécutée, une entrée est ajoutée dans le journal, par exemple : "la fermeture en masse de XXX positions a commencé".
  4. Correction de la fermeture en masse des positions opposées.
  5. Correction de la mise à jour des objets sur le graphique affichant l'historique des transactions. L'erreur s'est produite lors de la modification du symbole du graphique.

MQL5

  1. Des travaux sur les fonctions matricielles et vectorielles sont en cours : la prise en charge de 'float' et 'complex' est en cours d'implémentation.
  2. Opérateur "!" (LNOT) pour un pointeur vérifie sa validité via un appel implicite CheckPointer. L'opérateur "==" doit être utilisé pour une vérification NULL rapide. Par exemple : ptr==NULL ou ptr!=NULL.

MetaTester

  1. Correction de l'affichage des objets de transaction sur les graphiques de test.
  2. Amélioration des performances graphiques du système.

MetaEditor

  • Traductions de l'interface utilisateur mises à jour.

Correction des erreurs signalées dans les journaux de plantage.

20 mai 2022
MetaTrader 5 build 3300 : Compilation rapide et navigation dans le code améliorée dans MetaEditor

Terminal 

  1. Ajout de la possibilité de redimensionner l'objet graphique Rectangle en faisant glisser l'un de ses quatre coins.


  2. Rendu plus rapide de l'interface graphique.
  3. Prise en charge améliorée des adresses IPv6.
  4. Correction de la calcul de la hauteur du champ de date inférieur et du calcul de la largeur du champ de prix de droite lors du premier lancement de la plateforme.

MQL5

  1.  Ajout d'une fonction pour travailler avec les matrices et les vecteurs :  RegressionMetric. Elle définit la métrique pour l'évaluation de la régression.
     double vector.RegressionError(const enum lr_error);
     double matrix.RegressionError(const enum lr_error);
     vector matrix.RegressionError(const enum lr_error,const int axis);
    Les variables suivantes peuvent être utilisées comme métriques :
    enum REGRESSION_ERROR
      {
       REGRESSION_MAE,     // Erreur absolue moyenne
       REGRESSION_MSE,     // Erreur quadratique moyenne
       REGRESSION_RMSE,    // Erreur quadratique racine moyenne
       REGRESSION_R2,      // R au carré
       REGRESSION_MAPE,    // Erreur absolue moyenne en pourcentage
       REGRESSION_MSPE,    // Erreur de pourcentage carré moyen
       REGRESSION_RMSLE    // Erreur logarithmique quadratique moyenne
      };
  2. Ajout de la possibilité d'écrire des tableaux avec une taille de données supérieure à INT_MAX (tableaux de structures).

MetaEditor

  1. Améliorations de la barre d'onglets :
    • Le panneau n'est pas masqué même si une seule fenêtre est ouverte. Ainsi, les commandes du menu contextuel de l'onglet sont toujours visibles pour l'utilisateur.
    • Le bouton de fermeture 'X' a été ajouté à chaque onglet. De plus, les onglets peuvent être fermés à l'aide du bouton central de la souris ou via le menu contextuel.


  2. Ajout d'une commande pour une compilation rapide du programme. Ce mode ignore l'optimisation du code, ce qui accélère considérablement la création d'un fichier exécutable EX5. Utilisez ce mode pendant la phase de développement actif, lorsque vous devez vérifier rapidement le code écrit. Lors de la compilation finale du programme, activez le mode d'optimisation maximale pour des performances améliorées.

    Le paramètre "Optimisation maximale" dans les paramètres du projet remplit la même fonction.

    Toutes les opérations de compilation-relation sont disponibles dans le menu "Build".

  3. Améliorations de la gestion du code :
    • Des commandes distinctes ont été implémentées pour sauter aux définitions et aux déclarations. Auparavant, le menu avait une commande qui ouvrait un sous-menu de sélection. Les nouvelles commandes permettent un passage plus rapide aux parties de code nécessaires.
    • Ajout de la substitution des mots clés reconnus par la touche "Tab", en plus de "Entrée".


  4. Ajout de la possibilité d'afficher automatiquement les variables locales dans la liste de surveillancedu débogueur. L'affichage peut être activé par la commande de menu contextuel "Local". Au fur et à mesure que l'opération de débogage progresse dans le code, les variables de la portée actuelle sont automatiquement affichées dans la liste.



  5. Améliorations de la liste de surveillance du débogueur pour les vecteurs et les matrices.
  6. Correction des chemins dans les fichiers de projet. Une erreur peut entraîner la disparition des fichiers des projets.

Testeur

  1. Amélioration de l'arrêt des agents testeurs à l'arrêt de la plateforme.
  2. Le cinquième nœud MQL5 Cloud Network a été ajouté. Il est situé à Hong-Kong. Le nouveau nœud accélère l'optimisation des robots via le réseau dans les régions les plus proches.

Correction des erreurs signalées dans les journaux de plantage.

29 avril 2022
MetaTrader 5 build 3280 : Améliorations et corrections grâce aux retours des traders

Terminal

  1. Correction du remplissage des niveaux de Trailing Stop standard dans le menu contextuel des ordres et positions ouverts.



  2. Traductions de l'interface utilisateur mises à jour.

Correction d'erreurs rapportées dans les journaux de crash
21 avril 2022
MetaTrader 5 build 3270: Améliorations et correctifs

Terminal

  1. Améliorations intégrées du chat.
    • Conception mise à jour. Les messages apparaissent maintenant sans bulles encerclante pour optimiser l'affichage et l'utilisation de l'espace. Ajout d'avatars et de séparateurs de date.
    • Les commandes Copier et Supprimer ont été ajoutées au menu des messages.
    • Corrections de bugs et améliorations de la stabilité.



  2. Correction des commandes de fermeture de position en masse. Une erreur pouvait se produire sur les comptes avec le système de comptabilisation des positions de couverture.
  3. Correction de la comptabilisation de certains types de transactions lors de la génération de l'historique des positions.

Correction des erreurs signalées dans les journaux de plantage.
15 avril 2022
MetaTrader 5 build 3260 : Opérations en masse, fonctions matricielles et vectorielles, et améliorations du chat

Terminal

  1. Ajout de commandes pour la fermeture groupée des positions et l'annulation d'ordres en attente.

    Une nouvelle commande "Opérations en masse" a été ajoutée au menu contextuel de l'onglet Trade. La liste des commandes disponibles est formée automatiquement, en fonction de l'opération sélectionnée et de votre type de compte.



    Les commandes suivantes sont toujours disponibles dans le menu :
    • Fermeture de toutes les positions Sur les comptes de couverture, le système essaie de fermer les positions par des positions opposées (Close By), puis il ferme les positions restantes en suivant une procédure régulière.
    • Fermer toutes les positions rentables ou toutes les positions perdantes
    • Supprimer toutes les commandes en attente
    • Supprimer les ordres en attente de certains types : Limit, Stop, Stop Limit

    Si vous sélectionnez une position, des commandes supplémentaires apparaissent dans le menu :
    • Fermer toutes les positions du symbole
    • Fermer toutes les positions dans le même sens (sur les comptes de couverture)
    • Fermer les positions opposées pour le même symbole (sur les comptes de couverture)
    • Inversion de position (sur les comptes de compensation)

    Si vous sélectionnez un ordre en attente, des commandes supplémentaires apparaissent dans le menu :
    • Supprimer tous les ordres en attente pour le même symbole
    • Supprimer tous les ordres en attente du même type pour le même symbole

    Ces commandes ne sont disponibles que si le Trading En Un Clic est activé dans les paramètres de la plateforme : Outils \ Options \ Trade.
  2. Fonctionnalités graphiques internes améliorées :
    • Ajout de la possibilité de répondre aux messages. Le texte du message source sera cité dans la réponse.
    • Ajout de la possibilité de créer des messages avec différents types de contenu, tels que des images avec du texte et du texte avec des pièces jointes, entre autres.
    • Correction de l'affichage du séparateur entre les messages lus et non lus.
    • Corrections d'erreurs et améliorations de la stabilité.



  3. Fonctionnement optimisé et accéléré du système graphique du terminal. Le rendu de l'interface nécessitera moins de ressources.
  4. Correction du calcul des variations de prix quotidiennes pour les contrats à terme. Si le courtier fournit un prix de compensation, ce prix sera utilisé pour les calculs.
    ((Last - Prix de compensation)/Prix de compensation)*100
    Une description détaillée de tous les types de calcul est disponible dans la Documentation.

  5. Correction d'erreurs lors des achats de services MQL5 :
    • Les systèmes de paiement peuvent renvoyer des erreurs pour des opérations réussies sous certaines conditions.
    • Un prix incorrect pouvait être affiché dans les étapes intermédiaires de location du produit sur le Market.

  6. Correction du fonctionnement du bouton "Démarrer" dans la page des produits Market achetés/téléchargés. Maintenant, le bouton lance correctement l'application sur le premier graphique ouvert.
  7. Correction de la comptabilisation de certains types de transactions lors de la génération de l'historique des positions.

MQL5

  1. Ajout de nouvelles fonctions pour travailler avec matrices et vecteurs :
    • Median — renvoie la médiane des éléments de la matrice ou du vecteur
    • Quantile — renvoie le qième quantile des éléments matriciels/vectoriels ou des éléments le long de l'axe spécifié
    • Percentile — renvoie le q-ième centile des éléments matriciels/vectoriels ou des éléments le long de l'axe spécifié
    • Std — calcule l'écart type des éléments matriciels ou vectoriels
    • Var — calcule la variance des éléments matriciels ou vectoriels
    • CorrCoef — calcule le coefficient de corrélation matrice/vecteur
    • Correlate — calcule la corrélation croisée de deux vecteurs
    • Convolve — renvoie la convolution discrète et linéaire de deux vecteurs
    • Cov — calcule la matrice de covariance

  2. Nous avons commencé à ajouter des méthodes intégrées pour les tableaux numériques. Les nouvelles méthodes améliorent la convivialité, la compacité du code et la compatibilité du code avec d'autres langages.

    Les 3 méthodes suivantes sont déjà disponibles :
    • ArgSort — trie les tableaux selon la dimension spécifiée ; le dernier est utilisé par défaut (axe=-1).
    • Range — renvoie le nombre d'éléments dans la dimension de tableau spécifiée. Analogue de ArrayRange.
    • Size — retourne le nombre d'éléments du tableau. Analogue de ArraySize.

    Exemple :
    void OnStart()
      {
       int arr[4][5]=
         {
            {22, 34, 11, 20,  1},
            {10, 36,  2, 12,  5},
            {33, 37, 25, 13,  4},
            {14,  9, 26, 21, 59}
         };
       ulong indexes[4][5];
    //--- Trie le tableau
       arr.ArgSort(indexes,-1,0);
       Print("indexes");  
       ArrayPrint(indexes);
      }
    
    // Résultat :
    // indexes
    //     [,0][,1][,2][,3][,4]
    // [0,]   4   2   3   0   1
    // [1,]   2   4   0   3   1
    // [2,]   4   3   2   0   1
    // [3,]   1   0   3   2   4

  3. Nous avons commencé à ajouter des méthodes intégrées pour les chaînes.

    Les méthodes suivantes sont actuellement disponibles :
    • BufferSize — renvoie la taille de la mémoire tampon allouée pour la chaîne.
    • Compare — compare deux chaînes et renvoie le résultat de la comparaison sous la forme d'un entier.
    • Length — renvoie le nombre de caractères dans une chaîne.
    • Find — recherche une sous-chaîne dans une chaîne.
    • Upper — met une chaîne en majuscule.
    • Lower — convertit une chaîne en minuscules.
    • Replace — remplace une sous-chaîne.
    • Reserve — réserve un tampon pour une chaîne.

    Toutes les méthodes sont analogues aux fonctions de chaîne.

      Exemple :
      void OnStart()
        {
         string test="some string";
         PrintFormat("La longueur de la chaîne est %d",test.Length());
        }
      
      // Résultat :
      // La longueur de la chaîne est 11
    • Ajout de la valeur SYMBOL_SUBSCRIPTION_DELAY dans l'énumération ENUM_SYMBOL_INFO_INTEGER pour le retard de livraison des cotations pour des symboles spécifiques.

      Elle n'est utilisée que pour les symboles de trading basés sur l'abonnement. Le délai s'applique généralement aux données fournies en mode d'essai.

      La propriété ne peut être demandée que pour les symboles sélectionnés dans le Market Watch. Sinon, l'erreur ERR_MARKET_NOT_SELECTED (4302) sera renvoyée.

    • Ajout de la propriété ACCOUNT_HEDGE_ALLOWED dans l'énumération ENUM_ACCOUNT_INFO_INTEGER – permet l'ouverture de positions opposées et d'ordres en attente. La propriété est uniquement utilisée pour les comptes de couverture afin de se conformer à des exigences réglementaires spécifiques, selon lesquelles un compte ne peut pas avoir de positions opposées pour le même symbole, alors que des positions dans la même direction sont autorisées.

      Si cette option est désactivée, les comptes ne sont pas autorisés à avoir des positions et des ordres de sens opposé pour le même instrument financier. Par exemple, si le compte a une position d'achat, l'utilisateur ne peut pas ouvrir une position de vente ou passer un ordre de vente en attente. Si l'utilisateur tente d'effectuer une telle opération, l'erreur TRADE_RETCODE_HEDGE_PROHIBITED sera renvoyée.

    • Nouvelles propriétés dans l'énumération ENUM_SYMBOL_INFO_DOUBLE :
      • SYMBOL_SWAP_SUNDAY
      • SYMBOL_SWAP_MONDAY
      • SYMBOL_SWAP_TUESDAY
      • SYMBOL_SWAP_WEDNESDAY
      • SYMBOL_SWAP_THURSDAY
      • SYMBOL_SWAP_FRIDAY
      • SYMBOL_SWAP_SATURDAY

      Utilisez les valeurs pour obtenir des taux de calcul de swap pour des jours spécifiques de la semaine. 1 — swap simple, 3 — swap triple, 0 — aucun swap.

    • Correction du fonctionnement des fonctions CopyTicks et CopyTicksRange. Une erreur pouvait entraîner le retour de données obsolètes lors du passage à minuit. L'erreur s'est produite lorsqu'aucun tick n'a été fourni pour l'instrument financier.
    • Correction des erreurs signalées dans les journaux de plantage.
    11 février 2022
    MetaTrader 5 build 3210 : Nouvelles méthodes matricielles et contrôle des valeurs minimales/maximales des indicateurs

    MQL5

    1. Ajout des fonctions Min, Max, ArgMin, ArgMax et Sum pour les vecteurs et les matrices. Utilisez ces fonctions pour trouver les valeurs minimales et maximales, les indices pertinents et la somme.
    2. Ajout du support des méthodes Flat pour la matrice. Avec ces méthodes, un élément de matrice peut être atteint via un index au lieu de deux.
      double matrix::Flat(ulong index) const;      // getter
      void matrix::Flat(ulong index,double value); // setter

      Pseudocode pour calculer l'adresse d'un élément matriciel :

      ulong row=index / mat.Cols();
      ulong col=index % mat.Cols();
      
      mat[row,col]

      Par exemple, pour 'matrix mat(3,3)', l'accès aux éléments peut s'écrire comme suit :

        lecture : 'x=mat.Flat(4)', qui équivaut à 'x=mat[1][1]'
        écriture : 'mat.Flat(5, 42)', équivaut à 'mat[1][2]=42'

      Si la fonction est appelée avec un index de matrice non valide, l'erreur d'exécution critique OutOfRange sera générée.

    3. Formatage amélioré des nombres à virgule flottante dans les paramètres d'entrée du programme MQL5. Lors de la lecture de certains nombres réels, des nombres avec de nombreux zéros ont été remplacés dans les paramètres d'entrée, par exemple, 0,4 était représenté par 0,400000000002.
    4. Correction d'erreurs dans la bibliothèque mathématiqueMath\Stat\Math.mqh. La fonction MathSample de cette bibliothèque a été révisée pour correspondre au comportement traditionnel des bibliothèques mathématiques similaires lors de l'échantillonnage avec retour en arrière.
    5. Correction de l'erreur CopyTicks/CopyTicksRange qui pouvait entraîner le retour de données obsolètes lors du franchissement de minuit, lorsqu'aucun tick n'est fourni pour l'instrument financier.
    6. Ajout de nouvelles valeurs INDICATOR_FIXED_MINIMUM et INDICATOR_FIXED_MAXIMUM dans l'énumération ENUM_CUSTOMIND_PROPERTY_INTEGER.
      À l'aide de ces propriétés, vous pouvez fixer ou défixer les valeurs d'indicateur minimales et maximales à l'aide de la fonction IndicatorSetInteger. Lors de l'appel de IndicatorSetInteger(INDICATOR_FIXED_MINIMUM/INDICATOR_FIXED_MAXIMUM, true), la valeur minimale ou maximale actuelle est utilisée.



    Testeur

    1. Algorithme de calcul du ratio de Sharpe révisé pour correspondre à la formule traditionnelle, dans laquelle la valeur correspond à un intervalle d'un an. L'algorithme précédent était basé sur la variabilité du PnL obtenu et ignorait les fluctuations des actions par rapport aux positions ouvertes. Désormais, le calcul inclut les mouvements des actions, tandis que le ratio de Sharpe est interprété de manière classique :
      • Ratio de Sharpe < 0              La stratégie n'est pas rentable et n'est pas adaptée. Mauvais.
      • 0 < Ratio de Sharpe  < 1,0    Le risque ne paie pas. De telles stratégies peuvent être envisagées lorsqu'il n'y a pas d'alternative. Indéfini.
      • Ratio de Sharpe ≥ 1,0          Si le ratio de Sharpe est supérieur à un. Cela peut signifier que le risque est payant et que le portefeuille/stratégie peut donner des résultats. Bon.
      • Ratio de Sharpe ≥ 3,0          Une valeur élevée indique que la probabilité d'obtenir une perte dans chaque transaction particulière est très faible. Très bien.

    Terminal

    1. Optimisation de la consommation mémoire du terminal.
    2. Fonctionnement amélioré de la plateforme avec un sous-système réseau pour améliorer les performances et réduire les retards du réseau.
    3. Suppression de l'affichage du niveau zéro de la grille dans les indicateurs lorsque le rendu de la grille est désactivé.


    28 janvier 2022
    MetaTrader 5 build 3180: Vecteurs et matrices en MQL5 et utilisation améliorée

    Terminal

    1. Ajout de l'activation de la fenêtre graphique lors du déplacement d'un symbole du Market Watch ou d'une opération de trading de l'historique du compte vers celui-ci.

      Ces deux actions changent l'instrument financier du graphique en celui sélectionné. Auparavant, ils ne laissaient pas la fenêtre du graphique devenir active. En conséquence, certaines actions supplémentaires, telles que l'appel d'une boîte de dialogue de trading (F9) ou la modification de l'échelle (+/-) à l'aide de raccourcis clavier, pouvaient être appliquées par erreur à un autre graphique. Maintenant, le graphique, dont le symbole a été modifié par le glisser, est immédiatement sélectionné pour un travail ultérieur.

    2. Ajout de l'ouverture d'une nouvelle fenêtre d'ordre lors d'un double-clic sur une opération de trading dans l'historique du compte. Un instrument financier de l'opération sur laquelle un utilisateur a cliqué est immédiatement inséré dans la boîte de dialogue, ce qui permet un trading plus rapide. Une commande similaire a été ajoutée au menu contextuel.




    3. Ajout d'une inclusion intelligente des volumes réels ou des ticks lors de l'ouverture de nouveaux graphiques. Ces données sont importantes lors de l'analyse du marché. Cependant, tous les traders ne sont pas au courant de sa disponibilité sur la plateforme.

      Les volumes de trading réels ont une priorité plus élevée. S'ils sont fournis par un courtier, leur affichage est activé sur le graphique. Sinon, l'affichage des volumes de ticks est activé.

      Le mécanisme n'est utilisé que si le graphique est ouvert avec le modèledefault.tpl. Les volumes ne sont plus activés lors de la réouverture d'un graphique si un utilisateur les a désactivés manuellement dans les paramètres du graphique. Les modèles personnalisés ne sont pas affectés.

    4. Optimisation et accélération considérable de l'affichage de l'interface utilisateur.
    5. Amélioration de la fonction d'impression des graphiques appelée via le menu Fichier :
      • Correction de l'enregistrement des paramètres d'impression
      • Amélioration de l'apparence de la page imprimée : augmentation des lignes de grille, suppression du nom du programme, mise à jour de la police d'en-tête
      • Agrandissement de la boîte de dialogue d'impression pour un affichage correct de l'interface

    6. Correction du fonctionnement du champ de volume dans le panneau de trading rapide du graphique. Avant le correctif, la valeur était réinitialisée à la précédente valeur après avoir entré une nouvelle valeur et appuyé sur Tab.
    7. Correction de l'affichage de l'historique de trading sur le graphique. Auparavant, les opérations du compte précédent n'étaient pas supprimées des graphiques lors du passage d'un compte à l'autre.
    8. Correction du paiement pour MQL5.com via PayPal.
    9. Correction du blocage de la plateforme lors de l'affichage d'un graphique de volatilité des options.
    10. Vérification du numéro de téléphone fixe dans la fenêtre d'enregistrement du compte réel. Dans certains cas, la plateforme ne permettait pas à un utilisateur de passer à l'étape d'inscription suivante après avoir saisi un numéro correct.
    11. Correction de la vérification des droits lors de la participation à une discussion de groupe avec des membres de MQL5.com. Auparavant, un utilisateur nouvellement rejoint ne pouvait que lire les messages sans pouvoir en écrire.
    12. Modification du texte du graphique en cas d'absence de données. Désormais, "En attente de mise à jour" est remplacé par un nom de symbole, une période et un symbole.
    13. Meilleure prise en charge des prix négatifs ajoutés dans le build 2450. Les valeurs zéro peuvent désormais également être affichées pour les symboles du Market Watch appropriés.
    14. Correction de l'affichage des logos des produits dans le Market lorsque l'on travaillait sous Wine.

    MQL5

    1. Nous continuons à ajouter la prise en charge des vecteurs et des matrices. Les nouvelles fonctions élargissent considérablement les possibilités pour les développeurs de solutions basées sur des réseaux neuronaux.

      Plusieurs fonctions sont actuellement prêtes à l'emploi :
      • Eye - construit une matrice avec des 1 sur une diagonale spécifiée et des 0 ailleurs.
      • Identity - construit une matrice ayant une taille spécifiée avec des 1 sur la diagonale principale et des 0 ailleurs.
      • Ones — construit une matrice ayant une taille spécifiée remplie de 1.
      • Zeroes — construit une matrice ayant une taille spécifiée remplie de 0.
      • Full — construit une matrice ayant une taille spécifiée remplie de valeurs spécifiées.
      • Copy — construit une copie d'une matrice ou d'un vecteur.
      • Diag — extrait une diagonale d'une matrice et remplit la diagonale spécifiée avec les valeurs d'un vecteur.
      • Tri - construit une matrice avec des 1 sur une diagonale spécifiée et en dessous, et des 0 ailleurs.
      • Row — renvoie une ligne de matrice sous forme de vecteur et remplit la ligne spécifiée avec les valeurs du vecteur.
      • Col — renvoie une colonne de matrice sous forme de vecteur et remplit la colonne spécifiée avec les valeurs du vecteur.
      • Rows — renvoie le nombre de lignes dans une matrice.
      • Cols — renvoie le nombre de colonnes dans une matrice.
      • Transpose — transpose une matrice.
      • * — produit de matrices, vecteurs et scalaires — produit scalaire.
      • Power — élève une matrice à une puissance.
      • Kron — produit de Kronecker.
      • Cholesky — décomposition de Cholesky.
      • QR — Factorisation QR d'une matrice.
      • SVD — décomposition singulière.
      • LU — décomposition LU d'une matrice.
      • LUP — décomposition LUP d'une matrice.
      • Norm — calcule la norme de la matrice.
      • Cond — calcule le nombre conditionnel d'une matrice.
      • Spectrum - calcule le spectre d'une matrice
      • Det — calcule le déterminant d'une matrice.
      • Rank - calcule le rang de la matrice.
      • SLogDet — calcule le signe et le logarithme de base du déterminant d'une matrice.
      • Trace - calcule la trace de la matrice.
      • Solve — résoud un système d'équations linéaires.
      • LstSq — résoud un système d'équations linéaires en utilisant la méthode des moindres carrés.
      • Inv — calcule l'inverse d'une matrice.
      • PInv — calcule la pseudo-inverse d'une matrice par la méthode de Moore-Penrose.
      • Compare — compare deux matrices à l'aide d'epsilon.

      Pour plus de détails, veuillez lire la documentation MQL5correspondante.

    2. Correction d'erreurs lors de la gestion des fichiers et des bases de données liées à la limitation de la longueur du chemin. En particulier, la fonction DatabaseOpen permettait de définir un chemin plus grand que celui acceptable, provoquant une création incorrecte de la base de données. Maintenant, la fonction renvoie correctement le code d'erreur ERR_TOO_LONG_FILE_NAME.
    3. Correction du contrôle de la constance variable. Auparavant, le compilateur pouvait parfois ignorer l'erreur "La variable constante ne peut pas être transmise comme référence".
    4. Correction des avertissements erronés du compilateur concernant l'utilisation d'une variable non initialisée.
    5. Correction du fonctionnement de la fonction ChartWindowOnDropped pour les indicateurs. Auparavant, il retournait toujours zéro.
    6. Ajout de la prise en charge de Python 3.10 à l'intégration du module Python.

    VPS

    1. Correction de l'affichage de l'élément VPS dans le navigateur. Auparavant, il pouvait parfois disparaître lors du passage d'un compte à l'autre.

    MetaEditor

    1. Correction du déroulement des expressions complexes dans la fenêtre d'observation de débogage.

    Testeur

    1. Correction de l'exportation des rapports de test vers des fichiers. Certaines valeurs n'étaient pas arrondies correctement si une devise avec une précision de 0 décimales était utilisée comme devise de dépôt. Par exemple, JPY.
    22 octobre 2021
    MetaTrader 5 build 3091 : Améliorations

    Terminal

    1. Correction de l'ouverture d'une page vide lors de l'achat de services MQL5. Désormais, les résultats de l'opération sont immédiatement affichés pour l'utilisateur.
    2. Correction de la compression excessive des images de documents que les utilisateurs téléchargent lorsqu'ils demandent des comptes réels. Cela a amélioré la qualité des contrôles KYC automatiques et a facilité l'ensemble de la procédure d'ouverture de compte.
    3. Correction du fonctionnement des graphiques qui s'ouvrent à la fin du test.

    MQL5

    1. Ajout de la prise en charge de SQLite 3.36.0.

    MetaEditor

    1.  Ajout de la mise en surbrillance de l'arrière-plan des parenthèses correspondantes. L'option peut être activée via les paramètres générauxde MetaEditor.Amélioration du débogueurde programme MQL5.
    2. Amélioration du débogueurde programme MQL5.
    Correction des erreurs signalées dans les journaux de crash.
    précédent123456789101112131415