bool CalendarCountryById( const long country_id, // identifiant du pays MqlCalendarCountry& country // description du pays );CalendarEventById — retourne la description d'un évènement par son identifiant.
bool CalendarEventById( const long event_id, // identifiant de l'évènement MqlCalendarEvent& event // description de l'évènement );CalendarValueById — retourne le description de la valeur d'un évènement par son identifiant.
bool CalendarValueById( const long value_id, // identifiant de la valeur MqlCalendarValue& value // description de la valeur );CalendarEventByCountry — retourne le tableau des évènements disponibles pour le pays.
bool CalendarEventByCountry( string country_code, // code du pays MqlCalendarEvent& events[] // tableau d'évènements );CalendarEventByCurrency — retourne le tableau des évènements disponibles pour la devise affectée.
bool CalendarEventByCurrency( string currency, // devise MqlCalendarEvent& events[] // tableau d'évènements );CalendarValueHistoryByEvent — retourne le tableau de valeurs pour la période de temps spécifiée, par identifiant d'évènement.
bool CalendarValueHistoryByEvent( ulong event_id, // identifiant de l'évènement MqlCalendarValue& values[], // tableau de valeurs datetime datetime_from, // date de début de période datetime datetime_to=0 // date de fin de période );CalendarValueHistory — retourne le tableau de valeurs pour la période de temps spécifiée pour tous les évènements, filtrées par pays et/ou devise.
bool CalendarValueHistory( MqlCalendarValue& values[], // tableau de valeurs datetime datetime_from, // début de période datetime datetime_to=0, // fin de période string country_code=NULL, // code du pays string currency=NULL // devise );CalendarValueLastByEvent — retourne le tableau des valeurs des derniers évènements par identifiant. Cette fonction active la requête des valeurs qui sont apparues depuis la dernière requête. Le paramètre d'entrée/sortie "change_id" est en plus utilisé pour cette opération.
bool CalendarValueHistory( ulong event_id, // identifiant de l'évènement ulong& change_id, // dernier change_id du calendrier MqlCalendarValue& values[] // tableau de valeurs );CalendarValueLast — retourne le tableau des dernières valeurs pour tous les évènements, filtrées par pays et/ou devise. Cette fonction active la requête des valeurs qui sont apparues depuis la dernière requête. De façon similaire à CalendarValueLastByEvent, la propriété "change_id" est utilisée pour la requête.
bool CalendarValueHistory( ulong event_id, // identifiant de l'évènement ulong& change_id, // dernier change_id du calendrier MqlCalendarValue& values[], // tableau de valeurs string country_code=NULL, // code du pays string currency=NULL // devise );
struct MqlCalendarCountry { ulong id; // identifiant du pays en ISO 3166-1 string name; // nom du pays string code; // code du pays en ISO 3166-1 alpha-2 string currency; // code de la devise du pays string currency_symbol; // symbole/signe de la devise du pays string url_name; // nom du pays dans les URL sur mql5.com };MqlCalendarEvent — description de l'évènement.
struct MqlCalendarEvent { ulong id; // identifiant de l'évènement ENUM_CALENDAR_EVENT_TYPE type; // type de l'évènement ENUM_CALENDAR_EVENT_SECTOR sector; // secteur auquel appartient l'évènement ENUM_CALENDAR_EVENT_FREQUENCY frequency; // fréquence de publication de l'évènement ENUM_CALENDAR_EVENT_TIMEMODE time_mode; // mode d'heure de publication de l'évènement ulong country_id; // identifiant du pays ENUM_CALENDAR_EVENT_UNIT unit; // unité pour les valeurs de l'évènement ENUM_CALENDAR_EVENT_IMPORTANCE importance; // importance de l'évènement ENUM_CALENDAR_EVENT_MULTIPLIER multiplier; // multiplicateur de l'importance de l'évènement uint digits; // nombre de décimales dans la valeur de l'évènement string source_url; // URL source string event_code; // code de l'évènement string name; // texte de l'évènement dans la langue du terminal };MqlCalendarValue — description de la valeur de l'évènement.
struct MqlCalendarValue { ulong id; // identifiant de la valeur ulong event_id; // identifiant de l'évènement datetime time; // date et heure de l'évènement datetime period; // période pour laquelle l'évènement est publié int revision; // révision de l'indicateur publié en rapport avec la période de publication long actual_value; // valeur de l'évènement courant long prev_value; // valeur précédente de l'évènement long revised_prev_value; // valeur précédente révisée de l'évènement long forecast_value; // valeur prévue de l'évènement ENUM_CALENDAR_EVENT_IMPACRT impact_type; // impact potentiel sur le taux de devise };
enum ENUM_CALENDAR_EVENT_FREQUENCY { CALENDAR_FREQUENCY_NONE =0, // non utilisé CALENDAR_FREQUENCY_WEEK =1, // hebdomadaire CALENDAR_FREQUENCY_MONTH =2, // mensuel CALENDAR_FREQUENCY_QUARTER =3, // trimestriel CALENDAR_FREQUENCY_YEAR =4, // annuel CALENDAR_FREQUENCY_DAY =5, // quotidien }; enum ENUM_CALENDAR_EVENT_TYPE { CALENDAR_TYPE_EVENT =0, // évènement (réunion, discours, etc.) CALENDAR_TYPE_INDICATOR =1, // indicateur CALENDAR_TYPE_HOLIDAY =2, // vacances }; enum ENUM_CALENDAR_EVENT_SECTOR { CALENDAR_SECTOR_NONE =0, // aucun CALENDAR_SECTOR_MARKET =1, // marché CALENDAR_SECTOR_GDP =2, // PIB CALENDAR_SECTOR_JOBS =3, // emplois CALENDAR_SECTOR_PRICES =4, // prix CALENDAR_SECTOR_MONEY =5, // monnaie CALENDAR_SECTOR_TRADE =6, // commerce CALENDAR_SECTOR_GOVERNMENT =7, // gouvernement CALENDAR_SECTOR_BUSINESS =8, // affaires CALENDAR_SECTOR_CONSUMER =9, // consommateur CALENDAR_SECTOR_HOUSING =10, // logements CALENDAR_SECTOR_TAXES =11, // taxes CALENDAR_SECTOR_HOLIDAYS =12, // vacances }; enum ENUM_CALENDAR_EVENT_IMPORTANCE { CALENDAR_IMPORTANCE_LOW =0, // aucune CALENDAR_IMPORTANCE_NONE =1, // basse CALENDAR_IMPORTANCE_MODERATE =2, // modérée CALENDAR_IMPORTANCE_HIGH =3, // haute }; enum ENUM_CALENDAR_EVENT_UNIT { CALENDAR_UNIT_NONE =0, // aucune CALENDAR_UNIT_PERCENT =1, // pourcentage CALENDAR_UNIT_CURRENCY =2, // devise nationale CALENDAR_UNIT_HOUR =3, // nombre d'heures CALENDAR_UNIT_JOB =4, // nombre d'emplois CALENDAR_UNIT_RIG =5, // nombre de plateformes CALENDAR_UNIT_USD =6, // dollar US CALENDAR_UNIT_PEOPLE =7, // nombre de personnes CALENDAR_UNIT_MORTGAGE =8, // nombre d'hypothèques CALENDAR_UNIT_VOTE =9, // nombre de votes CALENDAR_UNIT_BARREL =10, // nombre de barils CALENDAR_UNIT_CUBICFEET =11, // volume en pieds cubes CALENDAR_UNIT_POSITION =12, // nombre d'offres d'emplois CALENDAR_UNIT_BUILDING =13 // nombre d'immeubles }; enum ENUM_CALENDAR_EVENT_MULTIPLIER { CALENDAR_MULTIPLIER_NONE =0, // aucun CALENDAR_MULTIPLIER_THOUSANDS =1, // milliers CALENDAR_MULTIPLIER_MILLIONS =2, // millions CALENDAR_MULTIPLIER_BILLIONS =3, // milliards CALENDAR_MULTIPLIER_TRILLIONS =4, // milliards }; enum ENUM_CALENDAR_EVENT_IMPACRT { CALENDAR_IMPACT_NA =0, // non disponible CALENDAR_IMPACT_POSITIVE =1, // positif CALENDAR_IMPACT_NEGATIVE =2, // négatif }; enum ENUM_CALENDAR_EVENT_TIMEMODE { CALENDAR_TIMEMODE_DATETIME =0, // la source publie l'heure exacte CALENDAR_TIMEMODE_DATE =1, // l'évènement est sur la journée entière CALENDAR_TIMEMODE_NOTIME =2, // la source ne publie pas l'heure de l'évènement CALENDAR_TIMEMODE_TENTATIVE =3, // la source ne fournit que la date, et pas l'heure exacte en avance, l'heure exacte n'est ajoutée qu'après la survenue de l'évènement };
ERR_CALENDAR_MORE_DATA =5400, // le tableau est trop petit pour le résultat entier (les valeurs qui tiennent dans le tableau sont passées) ERR_CALENDAR_TIMEOUT =5401, // time out suite à l'attente d'une réponse à la requête des données du calendrier ERR_CALENDAR_NO_DATA =5402, // données non trouvées
bool CharArrayToStruct( void& struct_object, // structure const uchar& char_array[], // tableau uint start_pos=0 // position de départ dans le tableau );StructToCharArray copie une structure POD dans un tableau de uchar.
bool StructToCharArray( const void& struct_object, // structure uchar& char_array[], // tableau uint start_pos=0 // position de départ dans le tableau );
ushort MathSwap(ushort value); uint MathSwap(uint value); ulong MathSwap(ulong value);
bool StringReserve( string& string_var, // string uint new_capacity // taille de buffer pour la string );StringSetLength définit la longueur de chaîne spécifiée en caractères.
bool StringSetLength( string& string_var, // string uint new_length // nouvelle longueur de la chaîne );
bool ArrayRemove( void& array[], // tableau de n'importe quel type uint start, // indice de départ de la suppression uint count=WHOLE_ARRAY // nombre d'éléments );ArrayInsert insère dans un tableau destination le nombre spécifié d'éléments du tableau source, en commencant à l'indice spécifié.
bool ArrayInsert( void& dst_array[], // tableau destination const void& src_array[], // tableau source uint dst_start, // indice dans le tableau destination où commencer l'insertion uint src_start=0, // indice dans le tableau source pour commencer la copie uint count=WHOLE_ARRAY // nombre d'éléments insérés );ArrayReverse inverse dans un tableau le nombre spécifié d'éléments en commencant à l'indice spécifié.
bool ArrayReverse( void& array[], // tableau de n'importe quel type uint start=0, // indice de début d'inversion uint count=WHOLE_ARRAY // nombre d'éléments );
int CustomBookAdd( const string symbol, // symbol name const MqlBookInfo& books[] // an array with the DOM elements descriptions uint count=WHOLE_ARRAY // nombre d'éléments to be used );
bool CustomSymbolCreate( const string symbol_name, // nom du symbole personnalisé const string symbol_path="", // nom du groupe dans lequel le symbole sera créé const string symbol_origin=NULL // nom du symbole à partir duquel le symbole personnalisé sera créé );Le nom du symbole, à partir duquel les propriétés du symbole personnalisé seront copiées, sera spécifié dans le paramètre "symbol_origin".
Ajout de la traduction de l'interface utilisateurs en croate.
La documentation a été mise à jour.
#import "TestLib.dll" //+------------------------------------------------------------------+ //| Fonction de lancement du programme | //+------------------------------------------------------------------+ void OnStart() { int x=41; TestClass::Inc(x); Print(x); }Le code C# de la fonction Inc de TestClass ressemble à :
public class TestClass { public static void Inc(ref int x) { x++; } }Le script retourne la valeur 42 comme résultat de l'exécution.
struct MqlTick { datetime time; // Heure de mise à jour du prix Last double bid; // Prix Bid actuel double ask; // Prix Ask actuel double last; // Prix actuel de la dernière transaction ulong volume; // Volume du prix Last actuel long time_msc; // Heure de mise à jour du prix Last en millisecondes uint flags; // Flags du tick double volume_real; // Volume du prix Last actuel avec une précision étendue };
struct MqlBookInfo { ENUM_BOOK_TYPE type; // type d'ordre de l'énumération ENUM_BOOK_TYPE double price; // prix long volume; // volume double volume_real; // volume avec précision étendue };
//+------------------------------------------------------------------+ //| Alignement par défaut | //+------------------------------------------------------------------+ struct A { char a; int b; }; //+------------------------------------------------------------------+ //| Alignement spécifié | //+------------------------------------------------------------------+ struct B pack(4) { char a; int b; }; //+------------------------------------------------------------------+ //| Fonction de lancement du programme | //+------------------------------------------------------------------+ void OnStart() { Print("sizeof(A)=",sizeof(A)); Print("sizeof(B)=",sizeof(B)); } //+------------------------------------------------------------------+Conclusion :
sizeof(A)=5 sizeof(B)=8Obtenez plus d'informations sur l'alignement dans les structures dans MSDN.
enum Main { PRICE_CLOSE_, PRICE_OPEN_ }; input Main Inp=PRICE_CLOSE; //+------------------------------------------------------------------+ //| Fonction de lancement | //+------------------------------------------------------------------+ void OnStart() { }Le compilateur affiche l'avertissement suivant :
class X { }; void f(int) { } template<typename T> void a(T*) { new T(2); } // le compilateur générait l'erreur ici auparavant template<typename T> void a() { f(0); } void OnInit() { a<X>(); }
Mise à jour de la documentation.
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.