Nouvelle version de la plateforme MetaTrader 5 build 3490 : Version du terminal Web mobile et nouvelles méthodes matricielles dans MQL5

Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
La mise à jour de la plateforme MetaTrader 5 sera publiée le vendredi 4 novembre 2022.
La mise à jour introduit le terminal Web avec une prise en charge complète des appareils mobiles. Désormais, son interface s'adapte automatiquement à la taille de l'écran de l'utilisateur.
En outre, nous avons amélioré le gestionnaire de tâches pour un suivi plus précis des ressources consommées et nous avons ajouté l'onglet OpenCL pour gérer les périphériques disponibles. Le nouveau gestionnaire OpenCL permet de spécifier explicitement les périphériques à utiliser pour accélérer les calculs.
Nous continuons à développer les capacités de la plateforme grâce à l’utilisation des matrices et des vecteurs. MQL5 propose de nouvelles fonctions pour les opérations avec les ticks des prix et pour l'échange de données entre matrices et vecteurs. Il fournit également des méthodes plus larges d'affectation.
Nous avons également mis en œuvre de multiples corrections et améliorations dans tous les composants de la plateforme. Toutes les nouvelles fonctionnalités, les corrections et les améliorations des performances sont décrites en détail ici.
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 :
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 :
MetaTrader 5 Client Terminal build 3490
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.
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.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);
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]] */ }
vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const; matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
CREATE TABLE artist( artistid INTEGER PRIMARY KEY, artistname TEXT ); CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES artist(artistid) );
La mise à jour sera disponible via le système de Live Update.