La nouvelle version fournit la possibilité de voir les statistiques du marché des instruments financiers tradés dans le mode exécution boursière. Pour voir les statistiques, ouvrez le menu de n'importe quel symbole dans le Market Watch, et sélectionnez 'Statistiques'.
Les opérations sur les positions dans l'onglet Trade sont maintenant plus efficaces. Une simple tape sur une position ou un ordre révélera les informations détaillées et les actions disponibles, telles que la clôture, la modification ou l'augmentation du volume de la position, mais aussi l'ouverture du graphique du symbole de la position.
Avec MetaTrader 5 pour Android, il est maintenant possible de créer facilement des comptes de trading auprès d'un courtier. Sélectionner "Ouvrir un compte réel" dans le menu et choisissez votre courtier dans la liste des serveurs. Vous devrez seulement attacher deux documents, incluant un document d'identité et un compte bancaire. Votre requête sera envoyée au courtier, qui pourrait demander des informations supplémentaires requises pour ouvrir un compte.
union LongDouble { long long_value; double double_value; };Contrairement à une structure, différents membres d'une union appartiennent à la même zone mémoire. Dans cet exemple, l'union LongDouble est déclarée avec des valeurs de type long et double partageant la même zone mémoire. Veuillez noter qu'il est impossible de stocker dans l'union une valeur de type long integer et une valeur double réelle simultanément (contrairement à une structure), puisque les variables long_value et double_value se chevauchent (en mémoire). D'un autre côté, un programme MQL5 est capable de traiter des données contenant dans l'union une valeur de type integer (long) ou réelle (double) n'importe quand. L'union permet donc de reçevoir deux (ou plus) options pour représenter la même séquence de données.
union LongDouble { long long_value; double double_value; }; //+------------------------------------------------------------------+ //| Fonction de démarrage du script | //+------------------------------------------------------------------+ void OnStart() { //--- LongDouble lb; //--- récupère et affiche le nombre invalide -nan(ind) lb.double_value=MathArcsin(2.0); printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value); //--- plus grande valeur normalisée (DBL_MAX) lb.long_value=0x7FEFFFFFFFFFFFFF; printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value); //--- plus petite valeur normalisée (DBL_MIN) lb.long_value=0x0010000000000000; printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value); } /* Résultat de l'exécution 1. double=-nan(ind) integer=FFF8000000000000 2. double=1.7976931348623157e+308 integer=7FEFFFFFFFFFFFFF 3. double=2.2250738585072014e-308 integer=0010000000000000 */
class Foo { int value; public: string Description(void){return IntegerToString(value);}; //--- constructeur par défaut Foo(void){value=-1;}; //--- constructeur paramétré Foo(int v){value=v;}; }; //+------------------------------------------------------------------+ //| structure contenant des objets de type Foo | //+------------------------------------------------------------------+ struct MyStruct { string s; Foo foo; }; //+------------------------------------------------------------------+ //| Fonction de démarrage du programme | //+------------------------------------------------------------------+ void OnStart() { //--- MyStruct a,b; Foo an_foo(5); a.s="test"; a.foo=an_foo; Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); //--- Print("b=a"); b=a; //--- Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); /* Résultat de l'exécution; a.s=test a.foo.Description()=5 b.s= b.foo.Description()=-1 b=a a.s=test a.foo.Description()=5 b.s=test b.foo.Description()=5 */ }La copie des membres des objets est effectuée dans l'opérateur implicite.
ENUM_POSITION_REASON | ENUM_DEAL_REASON | ENUM_ORDER_REASON | Description de la raison |
---|---|---|---|
POSITION_REASON_CLIENT | DEAL_REASON_CLIENT | ORDER_REASON_CLIENT | L'opération a été exécutée en raison de l'activation d'un ordre placé depuis un terminal de bureau |
POSITION_REASON_MOBILE | DEAL_REASON_MOBILE | ORDER_REASON_MOBILE | L'opération a été exécutée en raison de l'activation d'un ordre placé depuis une application mobile |
POSITION_REASON_WEB | DEAL_REASON_WEB | ORDER_REASON_WEB | L'opération a été exécutée en raison de l'activation d'un ordre placé depuis une plateforme web |
POSITION_REASON_EXPERT | DEAL_REASON_EXPERT | ORDER_REASON_EXPERT | L'opération a été exécutée en raison de l'activation d'un ordre placé depuis un programme MQL5, c'est à dire par Expert Advisor ou un script |
- | DEAL_REASON_SL | ORDER_REASON_SL | L'opération a été exécutée en raison de l'activation d'un Stop Loss |
- | DEAL_REASON_TP | ORDER_REASON_TP | L'opération a été exécutée en raison de l'activation d'un Take Profit |
- | DEAL_REASON_SO | ORDER_REASON_SO | L'opération a été exécutée en raison d'un évènement Stop Out |
- | DEAL_REASON_ROLLOVER | - | La transaction a été exécutée en raison d'un rollover |
- | DEAL_REASON_VMARGIN | - | La transaction a été exécutée après la facturation de la marge de variation |
- | DEAL_REASON_SPLIT | - | La transaction a été exécutée après le découpage (réduction du prix) d'une action ou d'un autre actif, qui a ouvert une position au moment de l'annonce du découpage |
La nouvelle version MetaTrader 5 pour iOS build 1605 fournit la possibilité d'ouvrir facilement un compte préliminaire de trading. Sélectionnez "Ouvrir un compte réel" depuis le menu et trouvez votre courtier dans la liste des serveurs. Remplissez votre informations personnelles, joignez deux documents pour confirmer votre identité et votre adresse, et envoyez votre demande. Votre courtier ouvrira un compte réel pour vous et vous demandera toute nouvelle information si nécessaire.
La nouvelle version de MetaTrader 5 iOS comprend également l'optimisation et une nouvelle conception de la section des emails :
Mise à jour de la documentation.
L'historique de trading dans MetaTrader 5 Android peut
maintenant être affiché sous la forme des positions. Précédemment,
l'onglet Historique ne contenait que les ordres et les transactions
tandis que maintenant le trading peut maintenant être analysé en terme
de positions. Toutes les transactions liées à une position sont
regroupées en un seul enregistrement et affichent les informations
suivantes :
L'historique de trading peut maintenant être présénté sous la forme des positions. Auparavant, l'onglet Historique ne contenait que les ordres et les transactions. Il présente maintenant également les positions. La plateforme de trading collecte les données des transactions liées à une position et les aggrège ensuite en un seul enregistrement. Cet enregistrement contient :
//+------------------------------------------------------------------+ //| Template de fonction | //+------------------------------------------------------------------+ template<typename T1,typename T2> string Assign(T1 &var1,T2 var2) { var1=(T1)var2; return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Surcharge spéciale pour bool+string | //+------------------------------------------------------------------+ string Assign(bool &var1,string var2) { var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0); return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Fonction de lancement du programme | //+------------------------------------------------------------------+ void OnStart() { int i; bool b; Print(Assign(i,"test")); Print(Assign(b,"test")); }Nous pouvons voir dans le résultat de l'exécution que le template de fonction Assign() a été utilisé pour la paire int+string, tandis que la version surchargée a déjà été utilisée pour la paire bool+string pendant le deuxième appel.
string Assign<int,string>(int&,string) string Assign(bool&,string)
template<typename T> T Func() { return (T)0; } void OnInit() { Func<double>(); // spécialisation explicite du template de fonction }Le changement de type est effectué par la spécification explicite des types plutôt que via les paramètres d'appel.
Mise à jour de la documentation.
Mise à jour de la documentation.
Ajout de la possibilité de s'enregistrer
et de se connecter à votre compte MQL5.com avec Facebook. Si vous avez
un profil sur ce réseau social, vous pouvez accéder aux messageries et
l'ensemble complet des services de MetaTrader 5 en quelques clics.
#resource chemin_vers_le_fichier_de_ressource as type_de_la_variable_de_ressource nom_de_la_variable_de_ressource
#resource "data.bin" as int ExtData[] // déclaration d'un tableau numérique contenant les données du fichier data.bin #resource "data.bin" as MqlRates ExtData[] // déclaration d'un tableau de structures simples contenant les données du fichier data.bin #resource "data.txt" as string ExtCode // déclaration d'une chaîne de caractères contenant les données du fichier data.txt #resource "data.txt" as string ExtCode[] // déclaration d'une chaîne de caractères contenant les données du fichier data.txt #resource "image.bmp" as bitmap ExtBitmap[] // déclaration d'un tableau à 1 dimension contenant un bitmap du fichier BMP, taille du tableau = largeur * hauteur #resource "image.bmp" as bitmap ExtBitmap2[][] // déclaration d'un tableau à 2 dimensions contenant un bitmap du fichier BMP, taille du tableau = [hauteur][largeur]
Documentation mise à jour.
string str; ... if(str) // erreur de compilation "Cannot convert type 'string' to 'bool'" (aucune erreur n'apparaissant dans les versions précédentes) Print("str est true");Il faut utiliser une condition explicite :
string str; ... //--- vérifie si la chaîne est initialisée if(str!=NULL) Print("str est true"); ou //--- vérifie si la chaîne vaut "true" if(StringCompare(str,"true",false)) Print("str est true"); ou //--- vérifie si la chaîne est un entier et n'est pas égal à zéro if((int)str!=0) Print("str est true");
Correction d'erreurs reportées dans les journaux de crash.
void ArrayPrint( const void& array[], // Tableau à imprimer uint digits=_Digits, // Nombre de décimales const string separator=NULL, // Le séparateur entre les valeurs des champs de la structure ulong start=0, // L'indice du premier élément à imprimer ulong count=WHOLE_ARRAY, // Le nombre d'éléments à imprimer ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN );ArrayPrint n'imprime pas tous les champs d'une structure dans les journaux – les champs du tableau et les champs pointeurs vers les objets sont passés. Si vous désirez imprimer tous les champs de la structure, vous devrez utiliser une fonction personnalisée pour imprimer en masse avec le format désiré.
//--- Affiche les valeurs des 10 dernières barres MqlRates rates[]; if(CopyRates(_Symbol,_Period,1,10,rates)) { ArrayPrint(rates); Print("Révision\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]"); for(int i=0;i<10;i++) { PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i, TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS), rates[i].open,rates[i].high,rates[i].low,rates[i].close, rates[i].tick_volume,rates[i].spread,rates[i].real_volume); } } else PrintFormat("CopyRates a échoué, code d'erreur=%d",GetLastError()); //--- Un exemple de journal /* [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 Vérification [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 */
void OnStart() { int arr[]; //--- Quantité de mémoire utilisée initialement Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- Quantité de mémoire utilisée pour le tableau de taille 1 avec une réserve ArrayResize(arr,1,1024*1024); Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- Après l'augmentation du tableau, la quantité de mémoire utilisée ne changera pas grâce à la réserve ArrayResize(arr,1024*512,1024*1024); Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- Après la réduction du tableau, la taille de la mémoire ne changera pas non plus ArrayResize(arr,1); Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- La mémoire non utilisée ne sera pas libérée après la suppression de la réserve ArrayResize(arr,1,-1); Print("Taille du tableau :",ArraySize(arr)," Mémoire utilisée :",MQLInfoInteger(MQL_MEMORY_USED)," MB"); }
#include <Graphics/Graphic.mqh> double Func1(double x) { return MathPow(x,2); } double Func2(double x) { return MathPow(x,3); } double Func3(double x) { return MathPow(x,4); } void OnStart() { GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES); }Le résultat :
#include <Math/Stat/Binomial.mqh> #include <Graphics/Graphic.mqh> void OnStart(void) { double vars[101]; double results[101]; const int N=2000; //--- MathSequence(0,N,20,vars); MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results); ArrayPrint(results,4); GraphPlot(results); //--- }Le résultat :
Mise à jour de la documentation.
Ajout d'infobulles pour les boutons Buy, Sell et Close dans les boîtes de dialogue de trading. Les infobulles contiennent des informations sur l'instrument sur le point d'être acheté ou vendu, pour aider les débutants à comprendre le processus de trading.
Une version MQL5 de la bibliothèque d'analyse numérique ALGLIB a été inclue dans la Bibliothèque Standard.
Fonctions de la Bibliothèque
Comment l'Utiliser
Les fichiers de ALGLIB sont situés dans \MQL5\Include\Math\Alglib. Pour utiliser les fonctions, incluez le fichier principal de la bibliothèques dans votre programme :
#include <Math\Alglib\alglib.mqh>
Des fonctions de statistiques mathématiques ont été inclues dans la Bibliothèque Standard. MQL5 fournit maintenant la fonctionnalité du langage R, qui est l'un des meilleurs outils pour le traitement et l'analyse de données statistiques.
Fonctions de la Bibliothèque
La bilbliothèque statistique contient des fonctions de calcul des caractéristiques statistiques des données, mais aussi des fonctions d'opérations avec les distributions statistiques :
Comment l'Utiliser
Les fichiers de la bilbiothèque statistique sont situés dans \MQL5\Include\Math\Stat. Pour utiliser cette bibliothèque, incluez dans votre programme les fichiers des fonctions désirées, par exemple :
#include <Math\Stat\Binomal.mqh> #include <Math\Stat\Cauchy.mqh>
La description détaillée des fonctions de la bibliothèque est disponible dans l'article Distributions Statistiques en MQL5 - Profiter du Meilleur de R.
La version MQL5 de la bibliothèque Fuzzy a été inclue dans la Bibliothèque Standard. La bibliothèque Fuzzy implémente les systèmes d'inférence floue Mamdani et Sugeno.
Fonctions de la Bibliothèque
Comment l'Utiliser
Les fichiers de la bibliothèque Fuzzy sont situés dans \MQL5\Include\Math\Fuzzy. Pour utiliser cette bibliothèque, incluez dans votre programme les fichiers des fonctions désirées, par exemple :
#include <Math\Fuzzy\mamdanifuzzysystem.mqh> #include <Math\Fuzzy\sugenofuzzysystem.mqh>
Une description détaillée des fonctions de la bibliothèque est disponible dans Code Base : Fuzzy - bibliothèque de développement des modèles flous
long FileLoad( const string filename, // [in] Nom du fichier void &buffer[], // [out] Un tableau qui sera rempli par le fichier lu uint common_flag=0 // [in] 0 - recherche du fichier dans le répertoire Files du terminal, FILE_COMMON - recherche dans le répertoire commun des terminaux ); bool FileSave( const string filename, // [in] Nom du fichier const void &buffer[], // [in] Le tableau à sauvegarder dans un fichier uint common_flag=0 // [in] 0 - crée un fichier dans le répertoire Files du terminal, FILE_COMMON - crée le fichier dans le répertoire commun des terminaux );Exemple d'écriture des ticks dans un fichier et de relecture du fichier :
//--- paramètres d'entrée input int ticks_to_save=1000; // Nombre de ticks //+------------------------------------------------------------------+ //| Fonction de démarrage du programme | //+------------------------------------------------------------------+ void OnStart() { string filename=_Symbol+"_ticks.bin"; MqlTick ticks[]; //--- int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save); if(copied!=-1) { PrintFormat(" CopyTicks(%s) a copié %d ticks",_Symbol,copied); //--- Si l'historique des ticks est synchronisé, le code d'erreur est égal à zéro if(!GetLastError()==0) PrintFormat("%s : les ticks ne sont pas synchronisés. Erreur=",_Symbol,copied,_LastError); //--- Ecriture des ticks dans un fichier if(!FileSave(filename,ticks,FILE_COMMON)) PrintFormat("FileSave() a échoué, erreur=%d",GetLastError()); } else PrintFormat("Echec de CopyTicks(%s), Erreur=",_Symbol,GetLastError()); //--- Relecture des ticks depuis le fichier ArrayFree(ticks); long count=FileLoad(filename,ticks,FILE_COMMON); if(count!=-1) { Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags"); for(int i=0;i<count;i++) { PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x", TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000, ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags); } } }
//--- Bougies dessinées avec la même couleur #property indicator_label1 "Bougies à une couleur" #property indicator_type1 DRAW_CANDLES //--- Une seule couleur est spécifiée, donc toutes les bougies ont la même couleur #property indicator_color1 clrGreenSi deux couleurs sont spécifiées, une couleur est utilisée pour les contours de la bougie, l'autre pour son corps.
//--- La couleur des bougies diffère de la couleur des ombres #property indicator_label1 "Bougies à deux couleurs" #property indicator_type1 DRAW_CANDLES //--- Les contours des bougies et les ombres sont verts, le corps est blanc #property indicator_color1 clrGreen,clrWhiteSi trois couleurs sont spécifiées, une couleur est utilisée pour les contours de la bougie, les deux autres couleurs sont utilisées pour le corps des bougies montantes et descendantes.
//--- La couleur des bougies diffère de la couleur des ombres #property indicator_label1 "Bougies à une couleur" #property indicator_type1 DRAW_CANDLES //--- Les contours des bougies et les ombres sont verts, le corps d'une bougie haussière est blanc, celui d'une bougie baissière est rouge #property indicator_color1 clrGreen,clrWhite,clrRedLe style DRAW_CANDLES permet de définir des couleurs personnalisées pour la bougie. Toutes les couleurs peuvent également être changées dynamiquement lorsque l'indicateur est en cours d'exécution, en utilisant la fonction PlotIndexSetInteger(drawing_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_number, couleur) où modifier_number peut avoir les valeurs suivantes :
//--- Définition de la couleur des bordures et des ombres PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue); //--- Définition de la couleur du corps d'une bougie haussière PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen); //--- Définition de la couleur du corps d'une bougie baissière PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
Documentation mise à jour.