
MQL5 Cookbook : Obtention des propriétés de la position
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.
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 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.
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.
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





- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation