English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
preview
Utilisation des ressources en MQL5

Utilisation des ressources en MQL5

MetaTrader 5Exemples | 22 décembre 2021, 16:49
296 0
MetaQuotes
MetaQuotes


L'importance de l'interface dans les programmes modernes

Il y a longtemps, le but principal des programmes informatiques était de faire des calculs mathématiques lourds et de traiter de grandes quantités de données. Mais avec la puissance accrue des ordinateurs, les priorités ont changé. Désormais, entre deux programmes aux fonctionnalités identiques, un utilisateur choisit celui avec lequel le travail est le plus aisé.

De nos jours, il ne suffit pas d'écrire un programme selon l'algorithme de calcul requis, mais il faut aussi fournir une interface graphique conviviale. Même l'analyse technique est née du désir des traders d'avoir une représentation visuelle de l'état actuel du marché : lignes de tendance, niveaux de support et de résistance, divers canaux et indicateurs techniques ont été développés pour montrer une image objective de ce qui se passe.

Le nouveau langage MQL5 a donné des outils encore plus puissants pour créer des applications entièrement fonctionnelles, qui ne nécessitent rien d'autre que le terminal client de MetaTrader 5. Dans cet article, nous montrerons comment utiliser les Resources pour créer un fichier exécutable EX5 avec une interface conviviale, et ce fichier ne nécessitera aucune opération de routine comme l'installation ou le démarrage.


Les possibilités de MQL5

Tout d'abord, bien sûr, la possibilité de travailler avec des graphiques est très importante. Des exemples peuvent être trouvés dans les articles, en voici quelques-uns :

C'est l'utilisation d'éléments graphiques qui rend un programme plus intéressant et plus facile à contrôler du point de vue de l'utilisateur. En plus des outils classiques d'analyse technique, le terminal MetaTrader 5 propose une large gamme de objets graphiques, qui peuvent être utilisés comme des briques pour construire votre propre interface graphique.


Utilisation de fichiers image pour créer une interface

Pour créer une interface spéciale, le plus souvent, des images de fichiers graphiques sont utilisées. Cela permet d'obtenir une conception unique et reconnaissable de divers éléments de contrôle. Le langage MQL5 propose deux objets graphiques utilisant des graphiques :

  • OBJ_BITMAP - - l'objet Bitmap permet de télécharger une image à partir d'un fichier BMP et de l'afficher sur un graphique ;
  • OBJ_BITMAP_LABEL - l'étiquette graphique est en fait un bouton dont l'image change en fonction de son statut (appuyé/enfoncé).

Ces deux objets permettent de créer une grande variété de champs et de les comparer aux gestionnaires d'événements « Clic de souris » (CHARTEVENT_OBJECT_CLICK). Afin configurer l'image souhaitée pour OBJ_BITMAP or OBJ_BITMAP_LABEL,, spécifiez le fichier BMP souhaité dans la propriété OBJPROP_BMPFILE. Cela peut être fait manuellement sur l'onglet « Paramètres » de l'objet graphique.


La seconde et la principale façon pour un programmeur MQL5 est de spécifier un nom de fichier pour la propriété OBJPROP_BMPFILE à l'aide de la fonction ObjectSetString(). Par exemple :

   //--- Load an image for the "Pressed" button state
   bool set=ObjectSetString(0,object_name,OBJPROP_BMPFILE,0,bmp_file_name);

Un algorithme standard d'utilisation de OBJ_BITMAP ou OBJ_BITMAP_LABEL: :

  1. Créez un objet à l'aide de la fonction ObjectCreate().
  2. À l'aide de la fonction ObjectSetInteger(), ancrez l'objet au coin du graphique souhaité, si nécessaire. Les coordonnées X et Y du point d'ancrage en pixels seront configurées par rapport à ce coin.
  3. Dans ObjectSetInteger(), configurez les valeurs des coordonnées X et Y (OBJPROP_XDISTANCE et OBJPROP_YDISTANCE).
  4. À l'ObjectSetString(), configurez sur l'objet graphique la valeur de la propriété OBJPROP_BMPFILE (une pour BITMAP ou deux pour OBJ_BITMAP_LABEL).
  5. Pour l'objet OBJ_BITMAP_LABEL, en utilisant ObjectSetInteger() , vous pouvez configurer l'état initial du bouton - enfoncé ou enfoncé (OBJPROP_STATE est true ou false).

Après avoir créé et configuré l'objet, pendant l'exécution du programme MQL5, vous pouvez modifier dynamiquement non seulement la position et l'état de l'objet graphique, mais également modifier la valeur de la propriété OBJ_BITMAP_LABEL pour afficher des images. Ainsi, l'interface peut être très flexible et reconfigurable.


Lecture sonore

La possibilité de demander à l'utilisateur une action dans le cas d'une certaine situation est une fonctionnalité supplémentaire demandée dans les programmes. Pour mettre en œuvre cette interaction inverse, la lecture de différents sons est souvent utilisée, en fonction de l'événement. Cela soulagera le trader d'une observation continue des graphiques de prix, en n'attirant son attention que dans les cas nécessaires. Pour la lecture de fichiers audio, la fonction PlaySound() est utilisée dans MQL5.

PlaySound() est très facile à utiliser et ne nécessite que la spécification d'un chemin vers un fichier son :

//--- The path to a sound file  
string wav_file_name="Ok.wav";
...
//--- Play a sound from the file terminal_directory\Sounds\Ok.wav
bool played=PlaySound(wav_file_name);
if(!played)
  //--- Failed to play the sound, notify of this
  {
   PrintFormat("Failed to play file %s. Error code=%d", wav_file_name, GetLastError());
  }


Où trouver les fichiers son et image

Les fonctions ObjectSetString() et PlaySound() nécessitent la spécification d'un chemin d'accès à un fichier. Pour des raisons de sécurité, tous les fichiers utilisés dans les programmes MQL5 se trouvent dans le bac à sable de fichiers. Cela signifie que les fichiers ne peuvent être stockés que dans certains répertoires, le travail avec des fichiers d'autres répertoires n'est pas autorisé. Tout d'abord, vous devez savoir quels répertoires sont disponibles pour les opérations et fonctions de fichiers, et comment ils sont nommés.

Il existe trois répertoires différents :

  • Terminal directory - le répertoire d'installation du terminal client. MetaTrader 5 est démarré à partir de ce répertoire, pour afficher le dossier, sélectionnez « Fichier »-« Open terminal data » dans le menu du terminal.
  • Terminal data directory - le dossier qui stocke les données d'un certain utilisateur de Windows. Les mécanismes de protection intégrés du système d'exploitation différencient l'accès des utilisateurs, de sorte que les données de chaque utilisateur peuvent être stockées séparément de celles des autres utilisateurs. Ainsi, dans ce répertoire, dans le sous-dossier MQL5, tous les indicateurs, Expert Advisors et script affichés dans la fenêtre Navigateur sont stockés.
  • The shared folder of all the terminals (de tous les terminaux clients MetaTrader 5 installés sur l'ordinateur) - un dossier pour effectuer des opérations sur les fichiers à l'aide du drapeau FILE_COMMON.

Pour déterminer l'emplacement de ces répertoires, vous pouvez utiliser le script WhereMyFolders.mq5 :

//+------------------------------------------------------------------+
//|                                               WhereMyFolders.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- The folder from which the terminal is started - terminal_directory
   string terminal_path=TerminalInfoString(TERMINAL_PATH);
//--- The folder that stores the terminal data - terminal_data_directory
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
//--- The shared folder of all client terminals - common_terminal_folder
   string common_data_path=TerminalInfoString(TERMINAL_COMMONDATA_PATH);   
   //--- Show all the paths 
   Print("TERMINAL_PATH(terminal_directory) = ",TerminalInfoString(TERMINAL_PATH));
   Print("TERMINAL_DATA_PATH(terminal_data_directory) = ",TerminalInfoString(TERMINAL_DATA_PATH));
   Print("TERMINAL_COMMONDATA_PATH(comon_terminal_folder) = ",TerminalInfoString(TERMINAL_COMMONDATA_PATH));   
  }

Important : Dans certains cas, l'emplacement de terminal_directory et terminal_data_directory peut coïncider, mais il vaut mieux ne jamais s'y fier et donc ne pas confondre ces concepts.

Les fichiers image et son sont recherchés par le système d'exécution du terminal dans l'ordre suivant :

  • si le séparateur antislash "\" (écrit au format "\\") est placé au début du chemin, il recherche la ressource relative au répertoire terminal_data_directory\MQL5\ ;
  • s'il n'y a pas de barre oblique inverse au début du chemin, le fichier est recherché par rapport à l'emplacement du fichier EX5, à partir duquel la fonction ObjectSetString(... , OBJPROP_BMPFILE, ...) ou PlaySound() est appelée ;
Pour la fonction PlaySound(), il y a un ajout : si le fichier n'a pas été trouvé en utilisant les deux méthodes ci-dessus, ce fichier son est recherché par rapport à terminal_directory\Sounds\.


Exemples de fichiers audio :

  • Le fichier one.wav sera recherché dans terminal_data_directory\MQL5\
    PlaySound("\\one.wav");
  • Le fichier two.wav sera recherché dans terminal_data_directory\MQL5\Files\
    PlaySound("\\Files\\two.wav");
  • Le fichier three.wav sera recherché dans terminal_data_directory\MQL5\MySounds\
    PlaySound("\\MySounds\\three.wav");
  • Le fichier four.wav sera recherché dans le dossier à partir duquel l'exécutable EX5 s'exécute. Si ce fichier n'est pas trouvé dans ce dossier, il tentera de trouver le fichier dans le dossier terminal_directory\Sounds\.
    PlaySound("four.wav");


Exemples de fichiers images :

  • Le fichier bird.bmp sera recherché dans terminal_data_directory\MQL5\
    //--- Setting an image for the OBJ_BITMAP_LABEL object
    bool res=ObjectSetString(0,object_name,OBJPROP_BMPFILE,0,"bird.bmp");// Modifier 0 is specified
  • swan.bmp sera recherché dans terminal_data_directory\MQL5\Files\
    //--- Setting an image for the OBJ_BITMAP object
    bool set=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"\\Files\\swan.bmp");// No modifier
  • dog.bmp sera recherché dans terminal_data_directory\MQL5\MyPictures\
    //--- Setting an image for OBJ_BITMAP
    bool done=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"\\MyPictures\\dog.bmp");// No modifier
  • cat.bmp sera recherché dans le dossier à partir duquel le fichier exécutable EX5 s'exécute
    //--- Setting an image for OBJ_BITMAP
    bool result=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"cat.bmp");// No modifier

Notez que la double barre oblique inverse « \\ » est utilisée comme séparateur lors de l'écriture du chemin.

Important : Lorsque vous spécifiez le chemin, utilisez toujours une double barre oblique inverse comme séparateur, car une seule barre oblique inverse est un caractère de contrôle pour le compilateur lors de l'analyse des lignes constantes et des constantes de caractère dans le code source d'un programme.


Nouvelles possibilités - Ressources

Pour utiliser des images et des sons dans votre programme MQL5, assurez-vous que tous les fichiers multimédias qu'il utilise se trouvent dans les dossiers appropriés. Cela impose un inconvénient certain lors du transfert d'un fichier EX5 compilé d'un terminal à un autre. Mais il est possible de résoudre ce problème au stade de l'écriture du code. Dans de tels cas, utilisez les ressources.

Pour utiliser une ressource dans un programme, elle doit être déclarée à l'aide de la directive du compilateur #resource

 #resource path_to_resource_file

Désormais, cette ressource peut être utilisée à la place d'un chemin de fichier. La commande #resource indique au compilateur que la ressource au chemin spécifié path_to_resource_file doit être incluse dans le fichier exécutable EX5. Ainsi, toutes les images et tous les sons nécessaires peuvent être localisés directement dans un fichier EX5. Maintenant, pour démarrer un programme MQL5 dans un autre terminal, vous n'aurez pas besoin de transmettre tous les fichiers utilisés.

Tout fichier EX5 peut contenir des ressources et tout programme EX5 peut utiliser des ressources d'un autre programme EX5. C'est-à-dire qu'un Expert Advisor peut utiliser les ressources qui se trouvent dans un indicateur ou une bibliothèque EX5. C'est une fonctionnalité supplémentaire de l'utilisation des ressources.

L'utilisation des ressources vous permet d'obtenir tout en un - le fichier exécutable lui-même et toutes les ressources qu'il utilise sont packagés dans un fichier EX5 lors de la compilation d'un code source.


Recherche de ressources par un compilateur

Une ressource est spécifiée à l'aide de la directive #resource « <chemin vers le fichier de ressources> »

 #resource "<path_to_resource_file>"
La longueur de la chaîne constante ><path_to_resource_file> ne doit pas dépasser 63 caractères. Le compilateur recherche une ressource au chemin spécifié dans l'ordre suivant :1
  • Si la barre oblique inverse « \ » est placée au début du chemin, la ressource est recherchée par rapport au dossier terminal_data_directory\MQL5\,
  • S'il n'y a pas de barre oblique inverse, la ressource est recherchée par rapport à la position du fichier source , dans lequel cette ressource est écrite.

Important : Dans le chemin de ressource, il est inacceptable d'utiliser les sous-chaînes "..\\" et ":\\".

Exemples de ressources provenant de la rubrique d'aide Resources:

//--- Correct specification of a resource
#resource "\\Images\\euro.bmp" // euro.bmp is located in terminal_data_directory\MQL5\Images\
#resource "picture.bmp"        // picture.bmp is locate in the same directory with the source file
#resource "Resource\\map.bmp"  // The resource is located in the folder source_file_directory\Resource\map.bmp
 
//--- incorrect specification of resources
#resource ":picture_2.bmp"     // Use of ":" is not allowed
#resource "..\\picture_3.bmp"  // Use of ".." is not allowed
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" //More than 63 characters


Noms des ressources

Après la déclaration d'une ressource à l'aide de la directive #resource, elle peut être utilisée dans n'importe quelle partie d'un programme. Pour le nom de la ressource, son chemin sans barre oblique au début de la chaîne qui définit le chemin d'accès à la ressource sera utilisé.

Exemples :

//---Examples of specifying resources and their names in the comments
#resource "\\Images\\cat.bmp"           // Resource name - Images\cat.bmp
#resource "dog.bmp"                     // Resource name - dog.bmp
#resource "Resource\\map.bmp"           // Resource name - Resource\map.bmp
#resource "\\Files\\Pictures\\bird.bmp" // Resource name - Files\Pictures\bird.bmp
#resource "\\Files\\good.wav"           // Resource name - Files\good.wav"
#resource "\\Sounds\\thrill.wav"        // Resource name - Sounds\thrill.wav"

Les noms de ressources ne respectent pas la casse - pour le compilateur, les noms dog.bmp et DOG.bmp auront la même signification.


Utilisation de ressources propres et tierces

Pour utiliser une ressource, vous devez spécifier son nom. Le nom de la ressource est son chemin sans barre oblique inverse au début de la ligne. Lorsque vous utilisez votre propre ressource, l'attribut spécial " ::" devrait être ajouté avant le nom de la ressource.

//--- Use of resources
ObjectSetString(0,bitmap_name,OBJPROP_BMPFILE,0,"::Images\\cat.bmp");
...
ObjectSetString(0,my_bitmap,OBJPROP_BMPFILE,0,"::dog.bmp");
...
set=ObjectSetString(0,bitmap_label,OBJPROP_BMPFILE,1,"::Files\\Pictures\\bird.bmp");
...
PlaySound("::Files\\good.wav");
...
PlaySound("::Sounds\\thrill.wav");

Vous pouvez utiliser non seulement vos propres ressources (à partir de votre fichier EX5), mais également à partir de toutes les bibliothèques et modules EX5. Ainsi, vous pouvez créer un référentiel de ressources et les utiliser dans de nombreux autres programmes mql5.

Pour utiliser des ressources d'un autre fichier EX5, le nom de la ressource doit être spécifié sous la forme <EX5_file_name_path>::<resource_name>. Supposons que le script Draw_Triangles_Script.mq5 contienne une ressource vers une image dans le fichier triangle.bmp :

 #resource "\\Files\\triangle.bmp"

Ensuite, son nom, à utiliser dans le script lui-même, ressemblera à "Files\triangle.bmp", et pour l'utiliser, "::" doit être ajouté au nom de la ressource - "::Files\triangle.bmp". Afin d'utiliser la même ressource d'un autre programme, par exemple d'un Expert Advisor, nous devons ajouter au nom de la ressource le chemin du fichier EX5 relatif à terminal_data_directory\MQL5\ et the name of the script's EX5 file - Draw_Triangles_Script.ex5. Supposons que le script se trouve dans le dossier standard terminal_data_directory\MQL5\Scripts\, alors l'appel doit être écrit de la manière suivante :

//--- Use of a script resource in an Expert Advisor
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\triangle_1.bmp");

Si le chemin d'accès au fichier exécutable n'est pas spécifié lors de l'appel de la ressource à partir d'un autre EX5, le fichier exécutable est recherché dans le même dossier qui contient le programme qui appelle la ressource. Cela signifie ce qui suit : Si un Expert Advisor se trouve dans terminal_data_directory\MQL5\Experts\ et qu'une ressource du fichier Draw_Triangles_Script.ex5 nous y est demandée sans indication de chemin, le fichier sera recherché dans terminal_data_directory\MQL5\Experts\.

//--- Request for a resource from a script in an Expert Advisor without path specification
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle_1.bmp");


Compression des ressources dans les fichiers EX5 - Comment ça marche

Les fichiers au format BMP et WAV sont automatiquement compressés avant d'être inclus dans un fichier EX5 exécutable. Cela signifie que l'utilisation des ressources vous permet non seulement de créer des programmes MQL5 complets, mais réduit également la taille globale des fichiers requis par le terminal lors de l'utilisation d'images et de sons, par rapport à la manière conventionnelle d'écrire des programmes MQL5.

La taille du fichier de ressources ne peut pas dépasser 16 Mo.

Important : L'avantage supplémentaire de l'utilisation des ressources est la compression automatique des fichiers WAV et BMP lors de l'emballage dans un fichier EX5 exécutable. Cela réduit non seulement la quantité mais aussi la taille des fichiers utilisés par le programme.

Par exemple, considérons un petit programme Animals_EA.mq5. Un petit bloc de code pour l'utilisation des ressources est donné ci-dessous :

//+------------------------------------------------------------------+
//|                                                   Animals_EA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- Declare image resources
#resource "\\Images\\cat.bmp"
#resource "\\Images\\dog.bmp"
#resource "\\Images\\cow.bmp"
#resource "\\Images\\bird.bmp"
//--- Declare sound resources
#resource "\\Files\\MySounds\\cat.wav"
#resource "\\Files\\MySounds\\dog.wav"
#resource "\\Files\\MySounds\\cow.wav"
#resource "\\Files\\MySounds\\bird.wav"
//--- Object names
string cat_dog="cat_dog";
string cow_bird="cow_bird";
string canvas="canvas";
string text="text";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Create a substrate
   CreateCanvas(canvas,50,50,500,500);
//--- Create buttons
   CreateObjectBITMAP_LABEL(cat_dog,110,120,"::Images\\cat.bmp","::Images\\dog.bmp");
   CreateObjectBITMAP_LABEL(cow_bird,110,330,"::Images\\cow.bmp","::Images\\bird.bmp");
   CreateText(text,"Click on any graphical object",200,90,clrTan);
//--- Give a command for an immediate refresh to see the object
   ChartRedraw();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|  Creating OBJ_BITMAP_LABEL with the specified images          |
//+------------------------------------------------------------------+
bool CreateObjectBITMAP_LABEL(string obj_name,int X,int Y,string res_name1,string res_name2)
  {
//--- If there is no such an object on the chart
   if(ObjectFind(0,obj_name)==-1)
     {
      //--- Create it
      bool res=ObjectCreate(0,obj_name,OBJ_BITMAP_LABEL,0,0,0);
      //--- Check the result
      if(!res)
        {
         PrintFormat("%s: Failed to create OBJ_BITMAP_LABEL with the name %s. Error code=%d",
                     __FUNCTION__,
                     GetLastError());
         return false;
        }
     }

//--- Set the coordinates
   ObjectSetInteger(0,obj_name,OBJPROP_XDISTANCE,X);
   ObjectSetInteger(0,obj_name,OBJPROP_YDISTANCE,Y);
//--- Disable display on the background
   ObjectSetInteger(0,obj_name,OBJPROP_BACK,false);
//--- Reset the error code
   ResetLastError();
//--- Set an image for the pressed condition
   bool res=ObjectSetString(0,obj_name,OBJPROP_BMPFILE,0,res_name1);
//--- Check the operation result
   if(!res)
     {
      PrintFormat("%s: Failed to upload an image from the resource %s. Error code=%d",
                  __FUNCTION__,
                  res_name1,
                  GetLastError());
      return false;
     }
//--- Set an image for the depressed state
   res=ObjectSetString(0,obj_name,OBJPROP_BMPFILE,1,res_name2);
//--- Check the operation result
   if(!res)
     {
      PrintFormat("%s: Failed to upload an image from the resource %s. Error code=%d",
                  __FUNCTION__,
                  res_name2,
                  GetLastError());
      return false;
     }
//--- Set the button pressed
   ObjectSetInteger(0,obj_name,OBJPROP_STATE,true);
   return true;
  }
//+------------------------------------------------------------------+

La tâche du programme est de dessiner sur un fond bleu (substrat), deux boutons graphiques qui changent d'apparence par un clic de souris. Lorsque vous cliquez sur le substrat, sa couleur passe du bleu au beige, et vice versa. A chaque changement, un son est joué, l'événement du clic de souris est géré dans la fonction OnChartEvent(). Un graphique immédiatement après le démarrage de l’Expert Advisor Animals_EA.mq5 est présenté dans la figure.



Jetez un œil aux propriétés de l'objet OBJ_BITMAP_LABEL, par exemple, cat_dog. La modification des propriétés du fichier Bitmap (Activé) et du Fichier Bitmap (Désactivé) est désormais impossible via une boîte de dialogue, ces champs ne sont pas disponibles et sont grisés.


Important : Dans les objets graphiques, les images chargées à partir des ressources ne peuvent être modifiées que par programmation. La modification manuelle de ces propriétés via la fenêtre Propriétés de l'objet devient indisponible.

Le volume total d'images utilisées par l'Expert Advisor Animals_EA.mq5, est de 430 ko.


Mais la taille du fichier exécutable qui en résulte, Animals_EA.ex5 et qui contient toutes ces images, est de 339 ko. Ainsi, au lieu de 9 fichiers (un fichier MQ5, quatre fichiers BMP et quatre fichiers WAV), nous avons maintenant un fichier EX5 qui contient toutes les ressources nécessaires au programme.

Seules les images au format BMP 24 ou 32 bits peuvent être utilisées dans les ressources. Les BMP 32 bits peuvent contenir une composition alpha - dans ce cas, ils seront appliqués à un graphique avec transparence.

Le fichier de l'Expert Advisor Animals_EA.mq5, les images et les sons sont joints à l'article :

  • Les images doivent être décompressées de архива images.zip vers terminal_data_directory\MQL5\Images\
  • Les sons de MySounds.zip doivent être décompressés dans terminal_data_directory\MQL5\Files\MySounds\

Si vous souhaitez tester ce programme dans votre terminal, téléchargez simplement l'Expert Advisor compilé Animals_EA.ex5 ci-joint, qui contient toutes les ressources nécessaires. Dans ce cas, vous n'avez pas besoin de télécharger et d'installer les fichiers image et son.


Travailler avec des indicateurs personnalisés inclus sous forme de ressources

Un ou plusieurs indicateurs personnalisés peuvent être nécessaires au fonctionnement des applications MQL5. Tous peuvent être inclus dans le code d'un programme MQL5 exécutable. L'inclusion d'indicateurs en tant que ressources simplifie la distribution des applications.

Vous trouverez ci-dessous un exemple d'inclusion et d'utilisation de l'indicateur personnalisé SampleIndicator.ex5 situé dans terminal_data_folder\MQL5\Indicators\ :

//+------------------------------------------------------------------+
//|                                                     SampleEA.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex5"
int handle_ind;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   handle_ind=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex5");
   if(handle_ind==INVALID_HANDLE)
     {
      Print("Expert: iCustom call: Error code=",GetLastError());
      return(INIT_FAILED);
     }
//--- ...
   return(INIT_SUCCEEDED);
  }

Le cas où un indicateur personnalisé dans la fonction OnInit() crée une ou plusieurs copies de lui-même nécessite une attention particulière. N'oubliez pas que la ressource doit être spécifiée de la manière suivante : <path_EX5_file_name>::<resource_name>.

Par exemple, si l'indicateur SampleIndicator.ex5 est inclus dans l'Expert Advisor SampleEA.ex5 en tant que ressource, le chemin d'accès à lui-même spécifié lors de l'appel de iCustom() dans la fonction d'initialisation de l'indicateur personnalisé se présente comme suit : "\\Experts\\SampleEA.ex5 ::Indicateurs\\SampleIndicator.ex5". Lorsque ce chemin est défini explicitement, l'indicateur personnalisé SampleIndicator.ex5 est strictement connecté à l'Expert Advisor SampleEA.ex5 et perd sa capacité à travailler de manière indépendante.

Le chemin dans sa propre direction peut être reçu à l'aide de la fonction GetRelativeProgramPath(). L'exemple de son utilisation est fourni ci-dessous :

//+------------------------------------------------------------------+
//|                                              SampleIndicator.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_plots 0
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- the wrong way to provide a link to itself
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";  
//--- the right way to receive a link to itself
  string path=GetRelativeProgramPath();
//--- indicator buffers mapping
   handle=iCustom(_Symbol,_Period,path,0,0);
   if(handle==INVALID_HANDLE)
     {
      Print("Indicator: iCustom call: Error code=",GetLastError());
      return(INIT_FAILED);
     }
   else Print("Indicator handle=",handle);
//---
   return(INIT_SUCCEEDED);
  }
///....
//+------------------------------------------------------------------+
//| GetRelativeProgramPath                                           |
//+------------------------------------------------------------------+
string GetRelativeProgramPath()
  {
   int pos2;
//--- get the absolute path to the application
   string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- find the position of "\MQL5\" substring
   int    pos =StringFind(path,"\\MQL5\\");
//--- substring not found - error
   if(pos<0)
      return(NULL);
//--- skip "\MQL5" directory
   pos+=5;
//--- skip extra '\' symbols
   while(StringGetCharacter(path,pos+1)=='\\')
      pos++;
//--- if this is a resource, return the path relative to MQL5 directory
   if(StringFind(path,"::",pos)>=0)
      return(StringSubstr(path,pos));
//--- find a separator for the first MQL5 subdirectory (for example, MQL5\Indicators)
//--- if not found, return the path relative to MQL5 directory
   if((pos2=StringFind(path,"\\",pos+1))<0)
      return(StringSubstr(path,pos));
//--- return the path relative to the subdirectory (for example, MQL5\Indicators)
   return(StringSubstr(path,pos2+1));
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,        
                const double& price[])
  {
//--- return value of prev_calculated for next call
   return(rates_total);
  }


Enregistrement de la mémoire du terminal

Chaque ressource est chargée une seule fois dans la mémoire du terminal. En utilisation normale, chaque accès au fichier entraîne une charge supplémentaire du fichier dans la mémoire. Par exemple, supposons que nous ayons 50 objets OBJ_BITMAP, chacun d'eux contient la même image de 100 ko. Ensuite, lors d'une utilisation normale, ces 50 objets nécessiteraient la mémoire 50*100kb=5Mb.

Si nous déclarons une ressource pour l'image téléchargée, alors cette image ne sera chargée en mémoire qu'une seule fois, quel que soit le nombre d'objets dans lesquels elle est utilisée.

Important : Les ressources ne sont chargées dans la mémoire qu'une seule fois et peuvent économiser de la mémoire si elles sont utilisées plusieurs fois.


Conclusion

L'utilisation des ressources facilite l'utilisation et la distribution des programmes MQL5. La création d'outils de trading confortables et modernes nécessite l'utilisation de fichiers d'images et de sons multimédias. Le concept de ressource dans MQL5 est simple et facile à comprendre, alors essayez de le vérifier.

Les images au format BMP 32 bits peuvent contenir une composition alpha - dans ce cas, elles seront appliquées à un graphique avec transparence.

Les ressources offrent les avantages suivants :

  • Compacité - tous les fichiers sont regroupés dans un seul fichier EX5 exécutable, de sorte que le programme est facile à transmettre et à lancer ;
  • Économie de mémoire - la mémoire du terminal ne contient toujours qu'une seule instance de chaque ressource, quelle que soit la fréquence de son utilisation dans un programme ;
  • Stockage pratique - un fichier EX5 avec toutes les ressources est inférieur à la somme des fichiers image et son d'origine.

Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/261

Fichiers joints |
mysounds.zip (65.89 KB)
images.zip (214.29 KB)
wheremyfolders.mq5 (1.46 KB)
animals_ea.mq5 (18 KB)
animals_ea.ex5 (393.38 KB)
Assistant MQL5 : Nouvelle version Assistant MQL5 : Nouvelle version
L'article contient des descriptions des nouvelles fonctionnalités disponibles dans l'assistant MQL5 mis à jour. L'architecture modifiée des signaux permet de créer des robots de trading basés sur la combinaison de divers modèles de marché. L'exemple contenu dans l'article explique la procédure de création interactive d'un Expert Advisor.
Les principes fondamentaux de tests dans MetaTrader 5 Les principes fondamentaux de tests dans MetaTrader 5
Quelles sont les différences entre les trois modes de test dans MetaTrader 5, et que faut-il particulièrement rechercher ? Comment se déroule le test d'un EA, tradant simultanément sur plusieurs instruments ? Quand et comment les valeurs des indicateurs sont-elles calculées lors des tests, et comment les événements sont-ils gérés ? Comment synchroniser les barres de différents instruments lors des tests en mode « prix d’ouverture uniquement » ? Cet article vise à apporter des réponses à ces questions et à bien d'autres.
Contrôles graphiques personnalisés. Partie 1 : Création d'un contrôle simple Contrôles graphiques personnalisés. Partie 1 : Création d'un contrôle simple
Cet article couvre les principes généraux de développement des contrôles graphiques. Nous allons préparer des outils pour un travail rapide et pratique avec des objets graphiques, analyser un exemple de création d'un champ simple de saisie de texte ou de données numériques ainsi que les manières de l'utiliser.
Événements de trade dans MetaTrader 5 Événements de trade dans MetaTrader 5
Un suivi de l'état actuel d'un compte de trade implique le contrôle des positions ouvertes et des ordres. Avant qu'un signal de trade ne devienne une transaction, il doit être envoyé depuis le terminal client en tant que demande au serveur de trade, où il sera placé dans la file d'attente des ordres en attente de traitement. Accepter une demande via le serveur de trade, la supprimer à son expiration ou conclure une transaction sur sa base - toutes ces actions sont suivies d'événements de trade ; et le serveur de trade en informe le terminal.