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

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

4 août 2022

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.