English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
MQL5 Cookbook : Obtention des propriétés de la position

MQL5 Cookbook : Obtention des propriétés de la position

MetaTrader 5Exemples | 13 janvier 2022, 09:41
124 0
Anatoli Kazharski
Anatoli Kazharski

Introduction

L'article précédent intitulé "MQL5 Cookbook : Utilisation des différents modes d'impression" nous a montré comment écrire rapidement un script et imprimer les informations requises en utilisant trois modes différents. Créons maintenant un script qui obtiendra et affichera toutes les propriétés de position à l'utilisateur.

Nous devons l'implémenter de manière à permettre à l'utilisateur de sélectionner l'option appropriée dans les paramètres externes du script, comme suit : pour obtenir uniquement les propriétés de position sur un symbole (actuel) ou pour parcourir toutes les positions ouvertes (le cas échéant) un par un sur tous les symboles. Cette fois, nous afficherons les informations requises directement dans la boîte de dialogue, ce qui est très pratique et certains d'entre vous pourraient trouver cette méthode plus utile.


Écrire un Script

Le début du programme est plus ou moins le même que dans l'article précédent (voir le code ci-dessous). Commençons par les propriétés du programme. Ils sont suivis de la ligne avec la directive #define et nous attribuons ensuite le nom du programme à la variable SCRIPT_NAME à l'aide de la fonction MQLInfoString() et la MQL5_PROGRAM_NAME qu'elle spécifie. Vous trouverez plus d'informations sur toutes les valeurs possibles de la fonction MQLInfoString() dans Référence MQL5.

On continue avec l'énumération des modes. Si vous écrivez un commentaire pour chaque identifiant, le texte de ce commentaire sera affiché dans la liste déroulante des paramètres externes. Nous mettrons en œuvre deux options :

  • Symbole actuel - pour afficher les propriétés de position sur le symbole actuel uniquement, et
  • Tous les symboles - pour afficher les propriétés de position sur tous les symboles.

Il n'y aura qu'un seul paramètre externe (mode) à utiliser pour sélectionner le mode approprié. Le commentaire suivant le paramètre externe sera également affiché dans la fenêtre des paramètres externes. Cela nous permettra de créer des noms de paramètres plus significatifs. En même temps, des noms de variables plus courts seraient plus pratiques en termes de code.

#property copyright   "Copyright 2012, http://tol64.blogspot.com"
#property link        "http://tol64.blogspot.com"
#property description "email: hello.tol64@gmail.com"
#property version     "1.0"
#property script_show_inputs
//---
#define SCRIPT_NAME MQLInfoString(MQL_PROGRAM_NAME) // Script name
//---
// ENUMERATION OF MODES
enum ENUM_SYMBOLS_MODE
  {
   CURRENT_SYMBOL =0,                     // Current symbol
   ALL_SYMBOLS    =1                      // All symbols
  };
//---
// INPUT PARAMETERS
input ENUM_SYMBOLS_MODE mode=CURRENT_SYMBOL;     // Mode

Le code continue avec les variables globales. Pour que les variables globales soient accessibles depuis n'importe quelle partie du script, elles doivent être placées en dehors des fonctions (généralement au tout début du programme).

// GLOBAL VARIABLES
long                 pos_magic=0;         // Magic number
string               pos_symbol="";       // Symbol
string               pos_comment="";      // Comment
double               pos_swap=0.0;        // Swap
double               pos_commission=0.0;  // Commission
double               pos_price=0.0;       // Current price of the position
double               pos_cprice=0.0;      // Current price of the position
double               pos_profit=0.0;      // Profit/Loss of the position
double               pos_volume=0.0;      // Position volume
double               pos_sl=0.0;          // Stop Loss of the position
double               pos_tp=0.0;          // Take Profit of the position
datetime             pos_time=NULL;       // Position opening time
long                 pos_id=0;            // Position identifier
ENUM_POSITION_TYPE   pos_type=NULL;       // Position type
//---

Dans la fonction principale du programme, nous appellerons une seule fonction définie par l'utilisateur, PrintPositionProperties(), qui effectuera toutes les opérations requises :

//+------------------------------------------------------------------+
//| MAIN FUNCTION                                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   PrintPositionProperties();
  }

Examinons maintenant pas à pas la structure de la fonction PrintPositionProperties() définie par l'utilisateur. Nous allons d'abord former la base de nos travaux futurs. C'est très simple et lorsqu'il est mis en œuvre, il ressemble à ceci :

//+------------------------------------------------------------------+
//| OPENING A DIALOG BOX WITH SYMBOL DATA                            |
//+------------------------------------------------------------------+
void PrintPositionProperties()
  {
   int err=0; // Variable for handling errors
//---
// If you need to get position properties on the current symbol only
   if(mode==CURRENT_SYMBOL)
     {
 
     }
//---
// If you need to get position properties on all symbols
   if(mode==ALL_SYMBOLS)
     {
 
     }
  }

Nous n'avons que deux branches et une variable locale err qui est responsable de la gestion des erreurs et est déclarée au début de la fonction. Nous devons maintenant écrire des scénarios de cas d'utilisation pour chacune des options. Commençons par le premier, c'est-à-dire "Si vous avez besoin d'obtenir les propriétés de position sur le symbole actuel uniquement".

C'est très simple. Tout d'abord, nous devons vérifier s'il existe une position sur le symbole actuel. Cela peut être fait par la fonction PositionSelect() disponible dans MQL5 qui prend le nom du symbole comme seul paramètre. Pour transmettre le nom du symbole actuel, nous devons soit utiliser la fonction Symbol(), soit la variable prédéfinie _Symbol qui contient déjà le nom du symbole actuel. La fonction PositionSelect() renverra un résultat positif, si une position sur ce symbole existe, ou un résultat négatif, s'il n'y a pas de position ou si une erreur s'est produite.

Le code avec des commentaires détaillés pour la première option est fourni ci-dessous :

//---
      // If a position exists, then...
      if(PositionSelect(_Symbol))
        {
         // ...get its properties
         GetPositionProperties();
         //---
         // Open a dialog box to display all the data we obtained
         MessageBox("Symbol        : "+pos_symbol+"\n"+
                    "Comment       : "+pos_comment+"\n"+
                    "Magic Number  : "+IntegerToString(pos_magic)+"\n"+
                    "Price Open    : "+DoubleToString(pos_price,_Digits)+"\n"+
                    "Current Price : "+DoubleToString(pos_cprice,_Digits)+"\n"+
                    "Stop Loss     : "+DoubleToString(pos_sl,_Digits)+"\n"+
                    "Take Profit   : "+DoubleToString(pos_tp,_Digits)+"\n"+
                    "Type          : "+PositionTypeToString(pos_type)+"\n"+
                    "Volume        : "+DoubleToString(pos_volume,2)+"\n"+
                    "Commission    : "+DoubleToString(pos_commission,2)+"\n"+
                    "Swap          : "+DoubleToString(pos_swap,2)+"\n"+
                    "Profit        : "+DoubleToString(pos_profit,2)+"\n"+
                    "Time          : "+TimeToString(pos_time)+"\n"+
                    "Identifier    : "+IntegerToString(pos_id)+"",
                    //---
                    "Message Box",MB_ICONASTERISK);
         //---
         return;
        }
      // If there is no position or an error has occurred, report it
      else
        {
         err=GetLastError(); // Get the code of the last registered error
         //---
         if(err>0) // If there is an error
           {
            // Print the relevant message
            MessageBox("Error ("+IntegerToString(err)+") when selecting a position ("+_Symbol+") !\n\n"+
                       "It is possible that there is no position on this symbol. If this is not the case, please try again.",
                       "Error",
                       MB_ICONWARNING);
            //---
            return; // Exit the function
           }
        }
      //---

Dans le code ci-dessus, nous pouvons voir deux autres fonctions définies par l'utilisateur - GetPositionProperties() et PositionTypeToString(). Comme nous devrons obtenir des propriétés de position à différents endroits du programme, il sera bon de créer une fonction distincte afin de réduire la quantité de code et ainsi la rendre plus lisible. Ci-dessous le code de cette fonction. Assurez-vous de consulter la référence MQL5 pour plus d'informations sur les fonctions et les identificateurs MQL5 utilisés dans GetPositionProperties().

//+------------------------------------------------------------------+
//| GETTING SYMBOL PROPERTIES                                        |
//+------------------------------------------------------------------+
void GetPositionProperties()
  {
   pos_symbol     =PositionGetString(POSITION_SYMBOL);
   pos_comment    =PositionGetString(POSITION_COMMENT);
   pos_magic      =PositionGetInteger(POSITION_MAGIC);
   pos_price      =PositionGetDouble(POSITION_PRICE_OPEN);
   pos_cprice     =PositionGetDouble(POSITION_PRICE_CURRENT);
   pos_sl         =PositionGetDouble(POSITION_SL);
   pos_tp         =PositionGetDouble(POSITION_TP);
   pos_type       =(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
   pos_volume     =PositionGetDouble(POSITION_VOLUME);
   pos_commission =PositionGetDouble(POSITION_COMMISSION);
   pos_swap       =PositionGetDouble(POSITION_SWAP);
   pos_profit     =PositionGetDouble(POSITION_PROFIT);
   pos_time       =(datetime)PositionGetInteger(POSITION_TIME);
   pos_id         =PositionGetInteger(POSITION_IDENTIFIER);
  }

La fonction PositionTypeToString() définie par l'utilisateur convertit le type de position renvoyé sous forme d'entier en une chaîne au format de lecture, comme indiqué dans le code ci-dessous :

//+------------------------------------------------------------------+
//| CONVERTING POSITION TYPE TO A STRING                             |
//+------------------------------------------------------------------+
string PositionTypeToString(int position_type)
  {
   string str="";
//---
   if(position_type==0) { str="buy";  }
   if(position_type==1) { str="sell"; }
//---
   return(str);
  }

Ainsi, le code de la première option permettant d'afficher les propriétés de position uniquement sur le symbole actuel est prêt. Il peut même être testé dès maintenant si vous avez suivi toutes les étapes décrites dans l'article. Ouvrez une position dans MetaTrader 5 à l'aide d'outils standard. À cette fin, appuyez sur F9 et la fenêtre Commander (Order) s'ouvrira où vous pourrez trouver toutes les options nécessaires pour définir les propriétés de position avant qu'elle ne s'ouvre :

Fig. 1. La fenêtre Commander dans le terminal client MetaTrader 5.

Fig. 1. La fenêtre Commander dans le terminal client MetaTrader 5.

Lorsque toutes les propriétés ont été définies, sélectionnez Vendre ou Acheter et exécutez le script en double-cliquant ou en le faisant glisser sur le graphique. Une fenêtre de script s'ouvrira. La valeur requise (symbole actuel) du paramètre Mode a déjà été définie par défaut. Un clic sur le bouton OK ouvrira une boîte de dialogue affichant toutes les propriétés de position sur le symbole actuel :

Fig. 2. Boîte de dialogue avec les propriétés de position sur le symbole actuel.

Fig. 2. Boîte de dialogue avec propriétés de position sur le symbole courant.

Sinon, s'il n'y a pas de position sur le symbole courant, une boîte d'alerte apparaîtra :

Fig. 3. Boîte d'alerte.

Fig. 3. Boîte d'alerte.

Tout semble fonctionner comme prévu et comme implémenté dans le code.

Passons maintenant en revue le code du programme qui va être utilisé si vous choisissez d'afficher toutes les propriétés des positions ouvertes. Le code avec des commentaires détaillés est présenté ci-dessous :

//---
      int digits=0; // Number of decimal places
      int mb_res=-1; // Variable with the option selected in the dialog box
      int pos_total=PositionsTotal(); // Number of open positions in the terminal
      //---
      // View properties of all positions in a loop one by one
      for(int i=0; i<pos_total; i++)
        {
         ResetLastError(); // Reset the last error
         //---
         pos_symbol=PositionGetSymbol(i); // Get the symbol name
         digits=(int)SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS); // Get the number of digits in the price
         //---
         // If a position on this symbol exists, then...
         if(PositionSelect(pos_symbol))
           {
            // ...get its properties
            GetPositionProperties();
            //---
            // Open a dialog box to display all position properties obtained
            mb_res=MessageBox("Total Positions/Current: "+IntegerToString(pos_total)+"/"+IntegerToString(i+1)+"\n"+
                              "---------------------------------\n"+
                              "Symbol: "        +pos_symbol+"\n"+
                              "Comment: "       +pos_comment+"\n"+
                              "Magic Number: "  +IntegerToString(pos_magic)+"\n"+
                              "Price Open: "    +DoubleToString(pos_price,digits)+"\n"+
                              "Current Price: " +DoubleToString(pos_cprice,digits)+"\n"+
                              "Stop Loss: "     +DoubleToString(pos_sl,digits)+"\n"+
                              "Take Profit: "   +DoubleToString(pos_tp,digits)+"\n"+
                              "Type: "          +PositionTypeToString(pos_type)+"\n"+
                              "Volume: "        +DoubleToString(pos_volume,2)+"\n"+
                              "Commission: "    +DoubleToString(pos_commission,2)+"\n"+
                              "Swap: "          +DoubleToString(pos_swap,2)+"\n"+
                              "Profit: "        +DoubleToString(pos_profit,2)+"\n"+
                              "Time: "          +TimeToString(pos_time)+"\n"+
                              "Identifier: "    +IntegerToString(pos_id)+"",
                              //---
                              "Message Box",MB_CANCELTRYCONTINUE|MB_ICONASTERISK);
            //---
            if(mb_res==IDCANCEL) // If you have clicked Cancel or Close
              { Print("The program ("+SCRIPT_NAME+") has been terminated by the user!"); return; } // Exit the function
            //---
            // If you have clicked Retry   
            if(mb_res==IDTRYAGAIN) { i--; } // Reset the counter to retry
           }
         else // If there is no position or an error has occurred, report it
           {
            err=GetLastError(); // Get the code of the last registered error
            //---
            if(err>0) // If there is an error
              {
               // Print the relevant message
               MessageBox("Error ("+IntegerToString(err)+") when selecting a position ("+pos_symbol+") !\n\n"+
                          "It is possible that there is no position on this symbol. If this is not the case, please try again.",
                          "Error",
                          MB_ICONWARNING);
              }
           }
        }
      //---

Il ne nous reste plus qu'à tester cette option. Ouvrons par exemple des positions sur deux symboles (AUDUSD et EURUSD). Une fois le script exécuté, sélectionnez le mode Tous les symboles dans la liste déroulante des paramètres externes et cliquez sur OK, une boîte de dialogue s'ouvrira comme indiqué ci-dessous :

Fig. 4. Boîte de dialogue avec propriétés de position pour la deuxième option.

Fig. 4. Boîte de dialogue avec propriétés de position pour la deuxième option.


Conclusion

Comme vous pouvez le voir dans la figure ci-dessus, il y a trois boutons dans la boîte de dialogue. Si vous cliquez sur Réessayer, le compteur de boucle sera réinitialisé et les propriétés de position du symbole actuellement affiché dans la boîte de dialogue seront actualisées. Si vous cliquez sur Continuer, le programme passera au symbole suivant. Le bouton Annuler sert à terminer le programme.

Il convient également de noter que la première ligne au-dessus de la liste des propriétés de position contient des informations sur le nombre total de positions ouvertes (Total Positions) et le numéro actuel du compteur de positions (Current).

C'est à peu près ça. N'hésitez pas à télécharger le fichier de code source ci-joint qui devra être compilé dans MetaEditor.

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

MQL5 Cookbook : Propriétés de position dans le panneau d'informations personnalisé MQL5 Cookbook : Propriétés de position dans le panneau d'informations personnalisé
Cette fois, nous allons créer un simple Expert Advisor qui obtiendra les propriétés de position sur le symbole actuel et les affichera sur le panneau d'informations personnalisé pendant le trading manuel. Le panneau d'informations sera créé à l'aide d'objets graphiques et les informations affichées seront actualisées à chaque tick. Cela va être beaucoup plus pratique que d'avoir tout le temps à exécuter manuellement le script décrit dans l'article précédent de la série intitulé "MQL5 Cookbook : Getting Position Properties".
MQL5 Cookbook : Utilisation de différents modes d'impression MQL5 Cookbook : Utilisation de différents modes d'impression
Ceci est le premier article de la série MQL5 Cookbook. Je commencerai par des exemples simples pour permettre à ceux qui font leurs premiers pas en programmation de se familiariser petit à petit avec le nouveau langage. Je me souviens de mes premiers efforts pour concevoir et programmer des systèmes de trading qui, je peux le dire, étaient assez difficiles, étant donné que c'était le premier langage de programmation de ma vie. Cependant, cela s'est avéré plus facile que je ne le pensais et il ne m'a fallu que quelques mois avant de pouvoir développer un programme assez complexe.
MQL5 Cookbook : Analyse des propriétés de position dans le testeur de stratégie MetaTrader 5 MQL5 Cookbook : Analyse des propriétés de position dans le testeur de stratégie MetaTrader 5
Nous vous présenterons une version modifiée de l'Expert Advisor de l'article précédent "MQL5 Cookbook : Propriétés de la position dans le panneau d'informations personnalisé". Certains des problèmes que nous aborderons incluent l'obtention de données à partir de barres, la vérification de nouveaux événements de barre sur le symbole actuel, y compris une classe de trade de la bibliothèque standard dans un fichier, la création d'une fonction pour rechercher des signaux de trading et une fonction pour exécuter des opérations de trading , ainsi que la détermination des événements de trade dans la fonction OnTrade().
Le MQL5 Market fête ses un an Le MQL5 Market fête ses un an
Une année s'est écoulée depuis le lancement des ventes sur le MQL5 Market. Ce fut une année de travail acharné, qui a transformé le nouveau service en le plus grand magasin de robots de trading et d’indicateurs techniques pour la plate-forme MetaTrader 5.