La documentation a été mise à jour.
datetime iTime( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
double iOpen( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
double iHigh( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
double iLow( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
double iClose( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
long iVolume( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
int iBars( string symbol, // Symbole ENUM_TIMEFRAMES timeframe // Période );
int iBarShift( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période datetime time, // Heure bool exact=false // Mode );
int iLowest( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int type, // Identifiant de la timeserie int count, // Nombre d'éléments int start // Indice );
int iHighest( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int type, // Identifiant de la timeserie int count, // Nombre d'éléments int start // Indice );
long iRealVolume( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
long iTickVolume( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
long iSpread( string symbol, // Symbole ENUM_TIMEFRAMES timeframe, // Période int shift // Décalage );
void TesterHideIndicators( bool hide // Flag );
La documentation a été mise à jour.
Correction d'erreurs reportées dans les journaux de crash.
MetaTrader 5 build 1745 sera la dernière version de la plateforme supportant Microsoft Windows XP/2003/Vista.
Nous avons annoncé il y a quelques mois la prochaine fin du support des anciennes versions des systèmes d'exploitation. Windows 2003, Windows Vista et spécialement Microsoft Windows XP sont des systèmes d'exploitation dépassés. Microsoft a mis fin au support de Windows XP il y a 3 ans, car des possibilités matérielles potentielles ne pouvaient plus être réalisées sur ce système en raison de limitations techniques.
MetaTrader 5 build 1745 et les versions précédentes continueront de fonctionner sur les systèmes d'exploitations mentionnés ci-dessus, mais ne seront plus mis à jour. Les installateurs ne s'exécuteront pas non plus sur ces systèmes d'exploitation.
Le système d'exploitation minimum requis pour faire fonctionner MetaTrader 5 est Windows 7. Nous recommandons cependant fortement d'utiliser les versions 64 bits de Windows 10.
Le support des anciennes versions des terminaux de bureau et mobile prendre fin avec la publication de la nouvelle version de la plateforme :
Les versions non supportées du terminal ne pourront plus se connecter aux nouvelles versions du serveur. Nous vous recommandons fortement de mettre à jour vos terminaux en avance.
Pour supporter les nouveaux projets partagés, nous avons mis à jour le protocole des opérations du MQL5 Storage. Vous devrez donc effectuer un checkout de toutes les données du dépôt après la mise à jour de la plateforme. Les données stockées sur le MQL5 Storage ne seront pas perdues ou modifiées pendant la mise à jour.
Avant de mettre à jour la plateforme vers la nouvelle version, nous vous recommandons d'effectuer une opération de Commit pour envoyer tous les changements locaux vers le MQL5 Storage.
Comment Cela Fonctionne
Par exemple, vous pouvez créer un instrument affichant l'indice du dollar (USDX). Il utilise la formule suivante :
50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)
Note : les paires USDEUR et USDGBP sont utilisées dans la formule source de l'indice du dollar. Puisque seules les paires inverses sont disponibles dans la plateforme, une puissance négatique et Ask au lieu de Bid sont utilisés dans la formule du symbole synthétique.
La plateforme calculera en temps réel le prix du nouvel instrument sur la base des cotations des six autres symboles fournis par votre courtier. Les changements de prix seront visualisés dans la fenêtre du Market Watch et sur le graphique :
int CustomTicksAdd( const string symbol, // Nom du symbole const MqlTick& ticks[] // Le tableau contenant les ticks devant être appliqués au symbole personnalisé );La fonction CustomTicksAdd permet de fournir les cotations comme si elles étaient reçues du serveur du courtier. Les données sont envoyées dans la fenêtre du Market Watch au lieu d'être directement écrites dans la base de données des ticks. Le terminal sauvegarde ensuite les ticks depuis le Market Watch vers la base de données. Si un gros volume de données est passé dans un appel, le comportement de la fonction est adapté afin d'économiser des ressources. Si plus de 256 ticks sont transmis, les données sont divisées en 2 parties. Une grande partie est directement enregistrée dans la base de données des ticks (de façon similaire à CustomTicksReplace). La seconde partie correspondant aux 128 derniers ticks est envoyée au Market Watch, d'où le terminal sauvegarde les ticks dans une base de données.
Les projets complets sont maintenant disponibles dans MetaEditor. Le processus de développement d'un programme est maintenant plus pratique.
Le fichier MQ5 principal du programme n'apparaît plus comme un projet. Le projet est un fichier "MQPROJ" séparé, qui stocke les paramètres du programme, les paramètres de compilation et toutes les informations des fichiers utilisés. Les principaux paramètres du projet sont accessibles depuis une boîte de dialogue séparée, il n'est donc plus besoin de les spécifier dans le code source via #property.
Un onglet séparé dans le Navigateur est fourni pour travailler de façon plus pratique dans le projet. Tous les fichiers, tels que les fichiers include, les ressources, les headers et les autres fichiers sont ordonnés par catégories dans cet onglet. Tous les fichiers sont automatiquement ajoutés dans le navigateur du projet. Par exemple, si vous incluez un nouveau fichier MQH, il apparaîtra automatiquement dans la section "Dépendences" du navigateur.
Le support des nouveaux projets a également été implémenté dans le dépôt MQL5 Storage mis à jour en ligne. Il est maintenant devenu plus pratique de développer de gros projets en collaboration avec d'autres membres de la MQL5.community.
La nouvelle section Projets Partagés est fournie pour les projets de groupe. Un projet créé dans cette section est immédiatement envoyé dans le dépôt : vous pouvez donner des permissions à d'autres utilisateurs et démarrer votre collaboration immédiatement.
Lorsque vous compilez un projet dans les Projets Partagés, un fichier EX5 exécutable est automatiquement copié dans le répertoire Experts, Indicators ou Scripts suivant le type du programme. Vous pouvez facilement lancer le programme sur un graphique sans avoir à copier les fichiers manuellement.
Quelles sont les nouveautés dans les Opérations du MQL5 Storage
Pour implémenter le support des nouveaux projets partagés, nous avons modifié le protocole des opérations avec le MQL5 Storage. Vous devrez donc effectuer un checkout de toutes les données du dépôt après la mise à jour de la plateforme. Les données stockées sur le dépôt MQL5 ne seront pas perdues ou modifiées pendant la mise à jour.
La commande 'Checkout depuis le Dépôt' n'est pas disponible. Au lieu de cela, les commandes 'Activer le MQL5 Storage' et 'Mettre à Jour depuis le Storage' sont utilisées pour récupérer les données :
Nouveaux Projets : Exemples des Détails de Création et d'Opération
Une nouvelle entité projet a été ajoutée dans MetaEditor. Un projet est un fichier mqproj qui stocke les propriétés communes du programme et les informations sur les fichiers utilisés. Les propriétés du programme peuvent maintenant être gérées depuis une boîte de dialogue séparée de MetaEditor au lieu de modifier manuellement les propriétés dans le code source (en utilisant la directive #property).
Si vous du code disponible, vous pouvez facilement tester de nouveaux projets en utilisant la commande 'Nouveau Projet depuis une Source'.
Dans le répertoire où est situé le fichier sélectionné, un nouveau fichier projet sera créé avec le même nom et l'extension mqproj. Les principales propriétés du programme spécifiées dans le code source via #property seront automatiquement ajoutées au projet, incluant le nom, le copyright, la version, le lien vers le site web du développeur et la description du programme.
Deux nouvelles options de compilation des programmes MQL5 ont été ajoutées aux propriétés du projet :
Pour utiliser les projets, utilisez un onglet Projet séparé dans la fenêtre du Navigateur. Tous les fichiers utilisés dans un projet sont affichés dans cet onglet sous une forme pratique. Lorsqu'un projet est généré depuis un fichier sources, tous les fichiers include utilisés (spécifiés avec la directive #include dans le principal fichier MQ5 et dans ses fichiers include) sont automatiquement ajoutés dans la section Dépendences.
Lorsqu'un nouveau fichier include est ajouté dans le code source, il apparaît également dans le Navigateur du projet. Les fichiers header utilisés sont ajoutés dans la section Headers ; les images, les sons et les autres programmes MQL5 utilisés dans la section Ressources. Les fichiers MQ5 avec le code source sont affichés dans la section Sources. Dans la section 'Paramètres et fichiers', vous pouvez ajouter d'autres fichiers, tels que les fichiers set pour les tests et les modèles de graphique.
Utilisez les commandes du menu contextuel pour ajouter les fichiers existants dans un projet ou pour y supprimer des fichiers. Faites attention lors de la suppression de fichiers, car vous pouvez effacer un fichier du projet (enlever le lien) ou le supprimer complètement du disque dur :
La création d'un nouveau projet est aussi facile que la création d'un programme MQL5 normal. Cliquez sur 'Nouveau Projet', sélectionnez le type du nouveau programme et spécifiez les propriétés (telles que le nom, les gestionnaires d'évènements, etc.) dans le MQL5 Wizard.
Pour obtenir un fichier EX5 exécutable, vous pouvez ouvrir le projet et appuyer sur la touche F7 (la commande de compilation) ou ouvrir le principal fichier MQ5 du programme et le compiler.
Projets Partagés dans le MQL5 Storage : Détails des Opérations
Les projets partagés sont gérés dans une section Projets Partagés séparée. Si vous ne vous êtes pas encore connecté au dépôt, exécutez la commande 'Activer le MQL5 Storage' depuis le mneu contextuel du dossier désiré. MetaEditor vérifiera si votre dépôt contient des données sauvegardées et si des projets partagés sont disponibles pour vous. Toutes les données disponibles seront récupérées depuis le dépôt et téléchargées sur votre ordinateur (opération de checkout). Les projets de groupe disponibles apparaissent dans la section Projets Partagés. Pour récupérer les projets, exécutez "Checkout depuis le Storage" dans le menu contextuel.
Pour créer un nouveau projet de groupe, sélectionnez le dossier Projets Partagés et cliquez sur "Nouveau Projet" :
Complétez ensuite les étapes MQL5 classiques : définissez le type, le nom et les propriétés du programme désiré. Pour les projets de groupe, vous devriez utiliser des noms clairs et compréhensibles afin que les participants les retrouvent facilement. Seuls les caractères latins et les chiffres, sans espace, peuvent être utilisés dans les noms des projets.
Un objet créé est immédiatement ajouté au MQL5 Storage. Les fichiers de la Bibliothèque Standard utilisés dans le projet ne sont pas ajoutés au dépôt, et vous pouvez les ajouter manuellement.
Pour permettre aux autres participants de travailler avec le projet, ouvrez ses propriétés. Vous pouvez à partir de là donner les permissions aux utilisateurs sélectionnés en spécifiant leurs identifiants MQL5.community, mais aussi définir les paramètres communs pour le travail du groupe :
Lorsque vous compilez un projet de groupe, le fichier exécutable EX5 est automatiquement copié dans le répertoire Experts, Indicators ou Scripts suivant le type du programme. Cela vous permet d'exécuter instantanément le programme dans le terminal sans avoir à le copier manuellement dans le répertoire correspondant.
Projets Publics dans le MQL5 Storage : Participation au Développement
Comme mentionné ci-dessus, chaque projet de groupe du MQL5 Storage a des paramètres de publication : le projet peut être privé ou ouvert à d'autres utilisateurs. Maintenant, tous les projets que vous pouvez rejoindre librement sont affichés dans l'onglet "Projets Publics" séparé.
Chacun peut trouver un projet excitant et prendre part à son développement. Cliquez simplement sur Rejoindre et récupérez le projet depuis le dépôt.
//+------------------------------------------------------------------+ //| Fonction de démarrage du script | //+------------------------------------------------------------------+ void OnStart() { //--- Fichier du modèle sous la forme d'un tableau binaire unsigned char my_template[]= { 0xFF,0xFE,0x3C, ... ,0x00 // Le tableau des données est raccourci ici }; //--- Sauvegarde et applique le modèle if(FileSave("my_template.tpl",my_template)) { Print("Modèle personnalisé sauvegardé dans \\MQL5\\Files"); if(ChartApplyTemplate(0,"\\Files\\my_template.tpl")) Print("Modèle personnalisé appliqué au graphique courant"); else Print("Echec de l'application du modèle personnalisé"); } else Print("Echec de la sauvegarde du modèle personnalisé"); }
Fonction | Action |
---|---|
CustomSymbolCreate | Crée un symbole personnalisé avec le nom spécifié dans le groupe spécifié |
CustomSymbolDelete | Supprime le symbole personnalisé ayant le nom spécifié |
CustomSymbolSetInteger | Définit la valeur de la propriété de type integer pour un symbole personnalisé |
CustomSymbolSetDouble | Définit la valeur de la propriété de type real pour un symbole personnalisé |
CustomSymbolSetString | Définit la valeur de la propriété de type string pour un symbole personnalisé |
CustomSymbolSetMarginRate | Définit les taux de marge suivant le type de l'ordre et sa direction pour un symbole personnalisé |
CustomSymbolSetSessionQuote | Définit l'heure de début et de fin de la session de cotation spécifiée pour le symbole et le jour de la semaine spécifiés |
CustomSymbolSetSessionTrade | Définit l'heure de début et de fin de la session de trading spécifiée pour le symbole et le jour de la semaine spécifiés |
CustomRatesDelete | Supprime toutes les barres de l'historique des prix du symbole personnalisé dans l'intervalle de temps spécifié |
CustomRatesReplace | Remplace entièrement l'historique des prix du symbole personnalisé dans l'intervalle de temps spécifié avec les données du tableau de données du type MqlRates |
CustomRatesUpdate | Ajoute les barres manquantes dans l'historique du symbole personnalisé et remplace les données existantes avec celles du tableau de données de type MqlRates |
CustomTicksAdd | Ajoute les données d'un tableau de données de type MqlTick à l'historique des prix d'un symbole personnalisé. Le symbole personnalisé doit être sélectionné dans la fenêtre du Market Watch. |
CustomTicksDelete | Supprimer tous les ticks de l'historique des prix du symbole personnalisé dans l'intervalle de temps spécifié |
CustomTicksReplace | Remplace entièrement l'historique des prix du symbole personnalisé dans l'intervalle de temps spécifié et avec les données du tableau de données de type MqlTick |
La bibliothèque est placée dans le répertoire Include\Generic du répertoire de travail du terminal.
bool ArraySwap( void& array1[], // Le premier tableau void& array2[] // Le deuxième tableau );La fonction accepte des tableaux dynamiques du même type et de même dimension. Pour les tableaux à plusieurs dimensions, le nombre d'éléments doit correspondre dans toutes les dimensions exceptée la première.
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 |
Mise à jour de la documentation.
//+------------------------------------------------------------------+ //| 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.
#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.
class CFoo final { //--- corps de la classe }; class CBar : public CFoo { //--- corps de la classe };Lors de la tentative d'héritage d'une classe ayant le modificateur 'final' comme ci-dessus, le compilateur affiche une erreur :
class CFoo { void virtual func(int x) const { } };La méthode est surchargée dans la classe héritée :
class CBar : public CFoo { void func(short x) { } };Mais le type de l'argument est changé par erreur de 'int' en 'short'. En fait, la surcharge de la méthode au lieu de sa spécialisation est effectuée dans ce cas. Tout en se conformant à l'algorithme de surcharge de la définition d'une fonction, le compilateur peut dans certains cas sélectionner une méthode définie dans la classe de base au lieu de celle spécialisée.
class CBar : public CFoo { void func(short x) override { } };Si la signature de la méthode est changée pendant la spécialisation, le compilateur ne peut pas trouver la méthode de la classe parent ayant la même signature, provoquant l'erreur de compilation :
class CFoo { void virtual func(int x) final { } }; class CBar : public CFoo { void func(int) { } };Lors de la tentative de spécialisation d'une méthode ayant le modificateur 'final' comme ci-dessus, le compilateur affiche une erreur :
Documentation mise à jour.
class CFoo { }; class CBar { }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { void *vptr[2]; vptr[0]=new CFoo(); vptr[1]=new CBar(); //--- for(int i=0;i<ArraySize(vptr);i++) { if(dynamic_cast<CFoo *>(vptr[i])!=NULL) Print("CFoo * object at index ",i); if(dynamic_cast<CBar *>(vptr[i])!=NULL) Print("CBar * object at index ",i); } CFoo *fptr=vptr[1]; // Will return an error while casting pointers, vptr[1] is not an object of CFoo } //+------------------------------------------------------------------+
String text="Bonjour"; ushort symb=texte[0];// retournera le code de symbole 'H'
Mise à jour de la documentation.
Tester : Correction du calcul des commissions comme un pourcentage annuel pendant le test.
Après deux mois de test public, la version web de la plateforme multi-actifs MetaTrader 5 a été publiée officiellement. Elle permet de trader le Forex et les bourses depuis n'importe quel navigateur et n'importe quel système d'exploitation. Seule une connexion Internet est nécessaire, aucune installation de logiciel n'est demandée.
L'application combine les principaux avantages des versions de bureau (haute vitesse, support de plusieurs marchés et fonctions étendues de trading) avec l'aspect pratique de la nature multi-plateformes du terminal web. La fonctionnalité principale de la nouvelle version est le Depth of Market, qui n'était pas présent dans la version beta.
La plateforme web permet aux traders d'effectuer des analyses
techniques et des opérations de trading comme dans la version de bureau.
La plateforme web fournit les fonctionnalités suivantes :
Avant |
Après |
|
---|---|---|
Déclencheur | Bid/Ask pour tous les types d'Ordres en Attente et SL/TP |
Bid/Ask pour les Ordres Limit Last pour les ordres Stop, Stop-Limit et SL/TP |
Exécution | Le prix spécifié dans l'ordre pour tous les types d'Ordres en Attente et les SL/TP |
Bid/Ask au moment du déclenchement de l'ordre pour tous les types d'Ordres en Attente et les SL/TP |
Considérons l'exemple sur le symbole Si-6.16. Un nouvel ordre Buy Stop au prix de déclenchement = 72580 est défini alors que les prix actuels sont : Bid=72570, Ask=72572, Last=72552. De nouveaux prix courants sont reçus dans un flux de prix :
Le déclencheur pour les Ordres Stops des instruments échangés est le prix Last. Donc le prix Last=72580 reçu dans le flux active l'ordre Buy Stop. Dans les versions précédentes, le même prix était utilisé pour exécuter cet ordre. Ce comportement est incorrect car il n'y a plus de prix Ask=72580 sur la marché pour exécuter la transaction Buy.
Correction d'erreurs reportées dans les journaux des crash.