MetaTrader 5 build 3620 : Améliorations du terminal Web, support ONNX et multiplications matricielles rapides dans MQL5

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

10 mars 2023

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.