
Assistant MQL5 : Comment Créer un Module de Suivi des Positions Ouvertes
Introduction
MetaTrader 5 dispose d'un outil puissant pour une vérification rapide des idées du trade. C'est le générateur de stratégies du trade MQL5 Wizard. L'utilisation de l'assistant MQL5 pour la création automatique du code source des Experts Advisors est décrite dans l'"Assistant MQL5 : Article ".Création des Expert Advisors sans Programmation". L'ouverture du système de génération de code permet de compléter les classesstandard avec des classes personnalisées de signaux de trade, des systèmes de gestion de fonds et des modules de suivi.
Cet article décrit les principes d'écriture des modules de position ouverte de suivi pour leur utilisation ultérieure dans l'assistant MQL5.
Un Expert Advisor créé à l'aide de l'assistantMQL5 Wizardest basé sur quatre classes de base:
Figure 1. Structure de la classe de base CExpert.
La classe CExpert (ou sa sous-classe) est le "moteur" principal du robot de trade. L'instance de la classe CExpert comporte des instances deCExpertSignal, CExpertMoney and CExpertTrailing classes (ou leur sous-classes):
- CExpertSignal- est le principal générateur de signaux de trade. L'instance de la sous-classe CExpertSignal comprise dans la classeCExpert fournit à l'Expert Advisor les informations sur les possibilités d'entrée sur le marché, les niveaux d'entrée et l’implémentation d'ordonnances conservatoires sur la base d'algorithmes internes. La décision finale sur laréalisation des opérations de tradeest prise par l'Expert Advisor. Vous pouvez lire comment écrire un module de signaux de trade dans l"Assistant MQL5 : Article Comment créer un module de signaux de trading".
- CExpertMoney est le principal système de gestion de fonds et des risques. L'instance de la sous-classe CExpertMoney calcule les volumes de position à ouvrir et les commandes en cours à émettre La décision finale sur les volumes est prise par l'Expert Advisor. Les principes d’élaboration des modules de fonds et de gestion des risques sont décrits dans le "MQL5 Wizard : Comment Créer un Module de Gestion de Fonds et des Risques". article.
- CExpertTrailingest le module principal de suivi des positions ouvertes. L'instance de la sous-classe CExpertTrailing indique à l'Expert Advisor s'il est nécessaire de modifier les ordonnances conservatoires d'une position. La décision finale sur la modification de la commande est prise par l'Expert Advisor.
En plus de cela, les instances de classe suivantes sont les membres de la classeCExpert :
- CExpertTrade (pour effectuer des opérations de trade)
- CIndicators (pour la gestion des indicateurs et des séries chronologiques utilisés dans le travail de l'Expert Advisor)
- CSymbolInfo (pour obtenir les informations sur un symbole)
- CAccountInfo (pour obtenir des informations sur l'état du compte de trade)
- CPositionInfo (pour obtenir des informations sur les positions)
- COrderInfo(pour obtenir des informations sur les commandes en cours)
Plus loin dans ce texte, en parlant d’ "Expert Advisor", nous entendrons une instance de la classeCExpert de sa sous-classe.
Une description plus détaillée de la classe CExpert et du processus de travail avec elle sera fournie dans un article séparé.
1. Classe de base CExpertTrailing
LeCExpertTrailing est la base du module des positions ouvertes suivantes. Pour interagir avec "l'espace extra-atmosphérique", la classe CExpertTrailingdispose d'un ensemble de méthodes virtuelles publiques :
Initialisation | Description |
virtual Init | L'initialisation de l'instance de classe permet la synchronisation des données du module avec les données de l' EA |
Paramètres de validation virtuels | Validation des paramètres réglés |
virtual InitIndicators | Création et initialisation de tous les indicateurs et séries chronologiques nécessaires au fonctionnement du générateur de signaux de trade |
Signaux de Modification de Positions |
|
virtual CheckTrailingStopLong | Génération d'un signal de modification d'une longue position avec détermination du nouveau prix pour la commande Stop |
virtual CheckTrailingStopShort | Génération d'un signal de modification d'une courte position avec détermination du nouveau prix pour la commande Stop |
Description des Méthodes
1.1. Méthodes d'initialisation
1.1.1 Init
La méthode Init() est automatiquement appelée juste après l'ajout de l'instance de classe à l'Expert Advisor. Il n'est pas nécessaire de remplacer la méthode.
virtual bool Init(CSymbolInfo* symbol, ENUM_TIMEFRAMES period, double adjusted_point);
1.1.2 ValidationSettings
La méthode ValidationSettings() est appelée depuis l'Expert Advisor après la configuration de tous les paramètres. Il est nécessaire de surcharger la méthode s'il existe des paramètres de configuration.
virtual bool ValidationSettings();
La méthode surchargée doit renvoyer true si tous les paramètres sont corrects (prêts à l’emploi). Si l'un des paramètres n'est pas valide, le paramètre doit retourner false (la poursuite de l'opération est impossible).
1.1.3 InitIndicators
La méthodeInitIndicators()crée et initialise tous les indicateurs et séries chronologiques nécessaires. Il est appelé depuis l'Expert Advisor une fois tous les paramètres définis et validés. La méthode doit être surchargée si le générateur de signaux de trade utilise au moins un indicateur ou une série chronologique.
virtual bool InitIndicators(CIndicators* indicators);
Les indicateurs et/ou les séries chronologiques doivent être utilisés via le correspondant de laBibliothèque Standard. Les pointeurs de tous les indicateurs et/ou séries chronologiques doivent être ajoutés à la collection d'indicateurs de l'Expert Advisor (pointeur vers lequel est transmis en paramètre).
La méthode surchargée doit retourner true, si toutes les manipulations avec les indicateurs et/ou les séries chronologiques ont abouti (ils peuvent être utilisés). Si au moins une opération avec les indicateurs et/ou les séries chronologiques a échoué, la méthode doit renvoyer false (la poursuite de l'opération est impossible).
1.2. Méthodes de Vérification du Signal de Modification de Position
1.2.1 CheckTrailingStopLong
La méthodeCheckTrailingStopLong() génère un signal de modification d'une longue position , définissant un nouveau prix de la commande Stop Loss (ainsi que pour la commande Take Profit si nécessaire). Il est appelé par l'Expert Advisor pour déterminer s'il est nécessaire de modifier une longue position . Il doit être remplacé si vous souhaitez générer un signal de modification de longue position
virtual bool CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp)
Le procédé doit mettre en œuvre l'algorithme de vérification de la condition de modification de la position longue. Si la condition est satisfaite, la variable sl (ainsi que tp, si nécessaire) doit recevoir la valeur appropriée et la méthode doit renvoyer true. Les liens vers les variables sl et tp doivent être transmis en paramètres. Si la condition n'est pas satisfaite, la méthode doit renvoyer false.
1.2.2 CheckTrailingStopShort
La méthode CheckTrailingStopShort() génère un signal de modification de courte position , déterminant un nouveau prix de la commande Stop Loss (ainsi que la commande Take Profit, si nécessaire). Il est appelé par l'Expert Advisor pour déterminer s'il est nécessaire de modifier une courte position . La méthode doit être remplacée si vous souhaitez générer un signal de modification d’une courte position.
virtual bool CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp)
La méthode doit implémenter l'algorithme de vérification de la condition de modification d'une courte position. Si la condition est satisfaite, la variable sl (ainsi que tp, si nécessaire) doit recevoir la valeur appropriée et la méthode doit renvoyer true. Les liens vers les variables sl et tp doivent être transmis en paramètres. Si la condition n'est pas satisfaite, la méthode doit renvoyer false.
2. Écrire Votre Propre Module pour le Suivi des Positions Ouvertes
Maintenant, après avoir passé en revue la structure de la classe de baseCExpertTrailing , vous pouvez commencer à créer votre propre module pour le suivi des positions ouvertes.
Comme mentionné ci-dessus, la classe est CExpertTrailingun ensemble de "cordes" virtuelles publiques - méthodes, à l'aide desquelles l'Expert Advisor peut connaître l'opinion du module de suivi des positions ouvertes sur la nécessité de modifier les ordonnances conservatoires.
Par conséquent, notre objectif principal est de créer notre propre classe pour suivre les positions ouvertes, en la dérivant de la classeCExpertTrailing et en surchargeant les méthodes virtuelles appropriées, en implémentant les algorithmes nécessaires.
Notre deuxième objectif (qui n'est pas moins important) -est de rendre notre classe "visible" àMQL5 Wizard Mais, tout d'abord.
2.1. Création de la Classe de Générateur de signaux de trading
Commençons.
Tout d'abord, nous créons (par exemple, en utilisant le même)MQL5 Wizard un fichier d'inclusion avec l'extension mqh.
Dans le menu Fichier sélectionnez "Créer" (ou appuyez sur la combinaison de touches Ctrl+N) et indiquez la création d'un fichier inclus :
.
Figure 2. Créez un fichier d'inclusion à l'aide de l'assistant MQL5.
Il convient de noter que pour que le fichier soit ensuite "détecté" parMQL5 Wizard en tant que module de positions ouvertes suiveuses, il doit être créé dans le dossier Include\Expert\.
Afin de supprimer laBibliothèque Standard , créez notre propre dossier Include\Expert\Trailing\MyTrailing, dans lequel nous créons le fichier SampleTrailing.mqh, en indiquant ces paramètres dans МQL5 Wizard :
.
Figure 3. Définition de l'emplacement du fichier d'inclusion.
À la suite deMQL5, nous obtenons le modèle suivant :
//+------------------------------------------------------------------+ //| SampleTrailing.mqh | //| Copyright 2010, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| defines | //+------------------------------------------------------------------+ // #define MacrosHello "Hello, world!" // #define MacrosYear 2010 //+------------------------------------------------------------------+ //| DLL imports | //+------------------------------------------------------------------+ // #import "user32.dll" // int SendMessageA(int hWnd,int Msg,int wParam,int lParam); // #import "my_expert.dll" // int ExpertRecalculate(int wParam,int lParam); // #import //+------------------------------------------------------------------+ //| EX5 imports | //+------------------------------------------------------------------+ // #import "stdlib.ex5" // string ErrorDescription(int error_code); // #import //+------------------------------------------------------------------+
Ce qui suit n'est qu'un travail "manuel". Supprimez les parties inutiles et ajoutez ce qui est nécessaire (incluez le fichier ExpertTrailing.mqh de la Bibliothèque Standard et une description de classe qui est maintenant vide).
//+------------------------------------------------------------------+ //| SampleTrailing.mqh | //| Copyright 2010, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| include files | //+------------------------------------------------------------------+ #include <Expert\ExpertTrailing.mqh> //+------------------------------------------------------------------+ //| Class CSampleTrailing. | //| Purpose: Class for trailing of open positions. | //| Is derived from the CExpertTrailing class. | //+------------------------------------------------------------------+ class CSampleTrailing : public CExpertTrailing { }; //+------------------------------------------------------------------+
Maintenant, il faut choisir les algorithmes.
Prenons l'algorithme suivant comme base de notre module de positions ouvertes suiveuses : déplacez la commande Stop à un niveau sans perte, si le prix va dans une direction requise sur une distance indiquée. Reflétez cela dans notre fichier.
//+------------------------------------------------------------------+ //| SampleTrailing.mqh | //| Copyright 2010, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| include files | //+------------------------------------------------------------------+ #include <Expert\ExpertTrailing.mqh> //+------------------------------------------------------------------+ //| Class CSampleTrailing. | //| Purpose: Class for trailing of open positions by | //| moving the Stop order "to the loseless level". | //| Is derived from the CExpertTrailingclass. | //+------------------------------------------------------------------+ class CSampleTrailing : public CExpertTrailing { }; //+------------------------------------------------------------------+
Non, définissons quelles données sont nécessaires pour prendre des décisions concernant la modification des ordonnances conservatoires Dans notre cas - c'est le bénéfice d'une position modifiée en points.
Définissez la liste des paramètres d’implémentation de notre module pour le suivi des postes ouverts. Nous avons besoin de deux paramètres :
- Nombre de points de bénéfice de position nécessaire pour suggérer de déplacer la commande Stop à un niveau sans perte.
- Le niveau sans perte, c'est-à-dire le nombre de points de bénéfice que nous fixons par la commande déplacée Stop
Les paramètres du module seront stockés sur les membres de classe dont les données sont protégées. L'accès aux paramètres sera implémenté par des méthodes publiques appropriées.
Incluons ces changements dans notre fichier :
//+------------------------------------------------------------------+ //| SampleTrailing.mqh | //| Copyright 2010, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| include files | //+------------------------------------------------------------------+ #include <Expert\ExpertTrailing.mqh> //+------------------------------------------------------------------+ //| Class CSampleTrailing. | //| Purpose: Class for trailing of open positions | //| by moving Stop order to a lossless level. | //| Is derived from the CExpertTrailing class. | //+------------------------------------------------------------------+ class CSampleTrailing : public CExpertTrailing { protected: int m_profit; //threshold level of profit int m_stop_level; // lossless level public: //--- methods of setting adjustable parameters void Profit(int value) { m_profit=value; } void StopLevel(int value) { m_stop_level=value; } }; //+------------------------------------------------------------------+
Pour initialiser les paramètres ajustables avec les valeurs par défaut, nous devons ajouter le constructeur de classe.
Pour valider les paramètres, remplacez la méthode virtuelleValidationSettings(selon la description de la classe de base).
Descriptif de la classe :
//+------------------------------------------------------------------+ //| SampleTrailing.mqh | //| Copyright 2010, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| include files | //+------------------------------------------------------------------+ #include <Expert\ExpertTrailing.mqh> //+------------------------------------------------------------------+ //| Class CSampleTrailing. | //| Purpose: Class for trailing of open positions | //| by moving Stop order to a lossless level. | //| Is derived from the CExpertTrailing class. | //+------------------------------------------------------------------+ class CSampleTrailing : public CExpertTrailing { protected: int m_profit; // threshold level of profit int m_stop_level; // lossless level public: CSampleTrailing(); //--- methods of setting adjustable parameters void Profit(int value) { m_profit=value; } void StopLevel(int value) { m_stop_level=value; } //--- method of validating the adjustable parameters virtual bool ValidationSettings(); }; //+------------------------------------------------------------------+
Implémentation de la méthode ValidationSettings() :
//+------------------------------------------------------------------+ //| Validation of adjustable parameters. | //| INPUT: no. | //| OUTPUT: true if parameter are correct, false - if not. | //| REMARK: no. | //+------------------------------------------------------------------+ bool CSampleTrailing::ValidationSettings() { if(!CExpertTrailing::ValidationSettings()) return(false); //--- check wheter the Init method is called if(m_symbol==NULL) return(false); //--- check parameters if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0) { printf(__FUNCTION__+": threshold level of profit must be greater than the level of setting of orders"); return(false); } //--- ok return(true); }
Tous les travaux préparatoires sont achevés.
Examinons à nouveau nos algorithmes plus en détail.
1. Un signal de modification d'une longue position apparaît lorsque les conditions suivantes sont remplies :
- Les paramètres des réglages du module impliquent que la position doit être modifiée (si vous définissez Bénéfice=0, la modification ne sera pas effectuée) ;
- La position n'a pas encore été modifiée (la commande Stop n'est pas déplacée à un niveau sans perte) ;
- Le bénéfice de la position a dépassé un seuil défini dans les paramètres.
Dans ce cas, suggérez de modifier la commande Stop en fonction des paramètres. Pour cela, redéfinissez la méthode virtuelle CheckTrailingStopLong et remplissez-la avec la fonctionnalité correspondante.
2. Un signal de modification de courte position apparaît lorsque les conditions suivantes sont remplies :
- Les paramètres des réglages du module impliquent que la position doit être modifiée (si vous définissez Bénéfice=0, la modification ne sera pas effectuée) ;
- La position n'a pas encore été modifiée (la commande Stop n'est pas déplacée à un niveau sans perte) ;
- Le bénéfice de la position a dépassé un seuil défini dans les paramètres.
Dans ce cas, suggérez de modifier la commande Stop en fonction des paramètres. Pour cela, redéfinissez la méthode virtuelleCheckTrailingStopShortet remplissez-la avec la fonctionnalité correspondante.
Descriptif de la classe :
class CSampleTrailing : public CExpertTrailing { protected: int m_profit; // threshold level of profit int m_stop_level; // lossless level public: CSampleTrailing(); //--- methods of setting adjustable parameters void Profit(int value) { m_profit=value; } void StopLevel(int value) { m_stop_level=value; } //--- method of validation of adjustable parameters virtual bool ValidationSettings(); //--- methods of generation of position modification signals virtual bool CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp); virtual bool CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp); };
Implémentation des méthodes CheckTrailingStopLong et CheckTrailingStopShort :
//+------------------------------------------------------------------+ //| Check for modification of stop orders of a long position. | //| INPUT: position - pointer to a position object, | //| sl - link for a new price of stop loss order, | //| tp - link for a new price of take profit order. | //| OUTPUT: true if condition is satisfied, false - if not. | //| REMARK: no. | //+------------------------------------------------------------------+ bool CSampleTrailing::CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp) { //--- check of pointer if(position==NULL) return(false); //--- check of parameter if(m_profit==0.0) return(false); //--- already in a lossless zone? double open=position.PriceOpen(); if(position.StopLoss()>=open) return(false); //--- check of profit sl=EMPTY_VALUE; tp=EMPTY_VALUE; if(m_symbol.Bid()-open>m_profit*m_adjusted_point) sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point); //--- return(sl!=EMPTY_VALUE); } //+------------------------------------------------------------------+ //| Check for modification of stop orders of a short position. | //| INPUT: position - pointer to a position object, | //| sl - link to a new price of stop loss order, | //| tp - link to a new price of take profit order. | //| OUTPUT: true if condition is satisfied, false - if not. | //| REMARK: нет. | //+------------------------------------------------------------------+ bool CSampleTrailing::CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp) { //--- check of pointer if(position==NULL) return(false); //--- check of parameter if(m_profit==0.0) return(false); //--- already in a lossless zone? double open=position.PriceOpen(); if(position.StopLoss()<=open) return(false); //--- check of profit sl=EMPTY_VALUE; tp=EMPTY_VALUE; if(open-m_symbol.Ask()>m_profit*m_adjusted_point) sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point); //--- return(sl!=EMPTY_VALUE); }
2.2. Rédaction d'une description de la classe créée des signaux de trading pour MQL5 Wizard
Passons maintenant à la résolution du deuxième problème. Notre module de suivi des positions ouvertes doit être "reconnu" par le générateur de stratégies de trading MQL5 Wizard.
Nous avons accompli la première condition nécessaire : nous avons placé le fichier là où il sera « trouvé » par l'assistant MQL5. Mais ce n'est pas assez. L'assistant MQL5 doit non seulement "trouver" le fichier, mais aussi le "reconnaître". Pour le faire, nous devons ajouter au texte original le descripteur de classe pour le MQL5 Wizard.
Examinons ces règles.
1. Le bloc de commentaires doit commencer par les lignes suivantes :
// wizard description start //+------------------------------------------------------------------+ //| Description of the class |
2. La ligne suivante est un descripteur de texte (ce que nous verrons dans l'assistant MQL5 lors du choix du signal) au format "//| Title=<Text> |". Si le texte est volumineux pour une ligne, vous pouvez en ajouter une ligne (mais pas plus) après. </p>
Dans notre cas, nous disposons des éléments suivants :
//| Title=Signal on the crossing of a price and the MA | //| entering on its back movement |
3. Vient ensuite une ligne avec le type de classe indiqué au format "//| Type=<Type> |". Le champ <Type> doit disposer de la valeur Signal (en plus des signaux, l'assistant MQL5 connaît d'autres types de classes).
Écrivez:
//| Type=Trailing |
4. La ligne suivante au format "//| Name=<Name> |" est le nom bref du signal (il est utilisé par l'assistant MQL5 pour générer les noms des variables globales de l'expert).
Nous obtenons ce qui suit :
//| Name=BreakEven |
5. Le nom d'une classe est un élément important de la description. Dans la ligne au format "//| Class=<ClassNameа> |", le paramètre <ClassName> doit correspondre au nom de notre classe :
//| Class=CSampleTrailing |
6. Nous ne remplissons pas cette ligne, mais elle doit être présente (il s'agit d'un lien vers la section deréférence de langue ) :
//| Page= |
7. En outre, il existe des descriptions des paramètres des réglages du module.
Il s'agit d'un ensemble de lignes (le nombre de lignes est égal au nombre de paramètres).
Le format de chaque ligne est "//| Parameter=<NameOfMethod>,<TypeOfParameter>,<DefaultValue> |".
Voici notre ensemble de paramètres :
//| Parameter=Profit,int,20 | //| Parameter=StopLevel,int,0 |
8. Le bloc de commentaire doit se terminer par les lignes suivantes :
//+------------------------------------------------------------------+ // wizard description end
Ajoutons le descripteur au code source.
//+------------------------------------------------------------------+ //| SampleTrailing.mqh | //| Copyright 2010, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| include files | //+------------------------------------------------------------------+ #include <Expert\ExpertTrailing.mqh> // wizard description start //+------------------------------------------------------------------+ //| Description of the class | //| Title=Moving a position to a lossless level | //| Type=Trailing | //| Name=BreakEven | //| Class=CSampleTrailing | //| Page= | //| Parameter=Profit,int,20 | //| Parameter=StopLevel,int,0 | //+------------------------------------------------------------------+ // wizard description end //+------------------------------------------------------------------+ //| Class CSampleTrailing. | //| Purpose: Class for trailing of open positions | //| by moving Stop order to a lossless level. | //| Is derived from the CExpertTrailing class. | //+------------------------------------------------------------------+ class CSampleTrailing : public CExpertTrailing { protected: int m_profit; // threshold level of profit int m_stop_level; // lossless level public: CSampleTrailing(); //--- method of setting adjustable parameters void Profit(int value) { m_profit=value; } void StopLevel(int value) { m_stop_level=value; } //--- method of validation of adjustable settings virtual bool ValidationSettings(); //--- methods of generation of position modification signals virtual bool CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp); virtual bool CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp); }; //+------------------------------------------------------------------+ //| Constructor CSampleTrailing. | //| INPUT: no. | //| OUTPUT: no. | //| REMARK: no. | //+------------------------------------------------------------------+ void CSampleTrailing::CSampleTrailing() { //--- setting default values m_profit =20; m_stop_level=0; } //+------------------------------------------------------------------+ //| Check of adjustable parameters. | //| INPUT: no. | //| OUTPUT: true if the parameters are correct, false if not. | //| REMARK: no. | //+------------------------------------------------------------------+ bool CSampleTrailing::ValidationSettings() { //--- what if the Init has not been called? if(m_symbol==NULL) return(false); //--- check of parameters if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0) { printf(__FUNCTION__+": threshold level of profit must be greater than the level of setting stop orders"); return(false); } //--- ok return(true); } //+------------------------------------------------------------------+ //| Check for modification of stop orders of a long position. | //| INPUT: position - pointer to a position object, | //| sl - link for a new price of stop loss order, | //| tp - link for a new price of take profit order. | //| OUTPUT: true if condition is satisfied, false if not. | //| REMARK: no. | //+------------------------------------------------------------------+ bool CSampleTrailing::CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp) { //--- check of pointer if(position==NULL) return(false); //--- check of parameters if(m_profit==0.0) return(false); //--- already in a lossless zone? double open=position.PriceOpen(); if(position.StopLoss()>=open) return(false); //--- check of profit sl=EMPTY_VALUE; tp=EMPTY_VALUE; if(m_symbol.Bid()-open>m_profit*m_adjusted_point) sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point); //--- return(sl!=EMPTY_VALUE); } //+------------------------------------------------------------------+ //| Check for modification of stop orders of a short position. | //| INPUT: position - pointer to a position object, | //| sl - link for a new price of stop loss order, | //| tp - link for a new take profit order. | //| OUTPUT: true if condition is satisfied, false if not. | //| REMARK: no. | //+------------------------------------------------------------------+ bool CSampleTrailing::CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp) { //--- check of pointer if(position==NULL) return(false); //--- check of parameters if(m_profit==0.0) return(false); //--- already in a lossless zone? double open=position.PriceOpen(); if(position.StopLoss()<=open) return(false); //--- check of profit sl=EMPTY_VALUE; tp=EMPTY_VALUE; if(open-m_symbol.Ask()>m_profit*m_adjusted_point) sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point); //--- return(sl!=EMPTY_VALUE); } //+------------------------------------------------------------------+
Eh bien voilà tout. Le module de trailing est prêt à l'emploi.
Pour que legenerator of trade strategies MQL5 Wizard puisse utiliser notre module, nous devons redémarrer MetaEditor (l'assistant MQL5 analyse le dossier Include\Expert uniquement au démarrage).
Après avoir redémarréMetaEditor, le module créé de gestion des positions ouvertes peut être utilisé dans l'assistant MQL5 :
Figure 5. Le module créé de gestion des positions ouvertes sur l'assistant MQL5.
Les paramètres d'entrée précisés dans la section de description des paramètres du module de gestion des positions ouvertes sont désormais disponibles :
Figure 6. Les paramètres d'entrée du module créé de gestion des positions ouvertes dans l'assistant MQL5.
Les meilleures valeurs des paramètres d'entrée de la stratégie de trading mise en œuvre peuvent être trouvées à l'aide duStrategy Tester duMetaTrader 5 terminal.
Conclusion
Le générateur de stratégies de trading du MQL5 Wizard simplifie considérablement le test des idées de trading. Le code de l'expert généré est basé sur les classes de stratégies de trading de la bibliothèque standard, qui sont utilisées pour créer certaines implémentations de classes de signaux de trading, de classes de gestion des fonds et des risques et de classes de support de position.
L'article explique comment écrire et se connecter au générateur de stratégies de tradeMQL5 Assistant votre propre classe de gestion des positions ouvertes en déplaçant le niveau Stop Loss vers une zone sans perte lorsque le prix va dans le sens de la position, permettant de diminuer les prélèvements lors de l’activité de trading. Il indique également la structure et le format de la description de la classe créée pour l'assistant MQL5.
Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/231





- 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