Discussion de l'article "Assistant MQL5 : Comment Créer un Module de Suivi des Positions Ouvertes" - page 2

 

Je vous remercie pour votre article très intéressant et utile,

Puis-je avoir l'amabilité de vous demander un exemple d'utilisation de cette classe dans l'écriture d'un conseiller expert, je veux dire que l'utilisation de cette classe dans un modèle d'EA ne génère pas d'EA...

Merci encore.

 

Bonjour. Le module ne fonctionne pas.

Le log montre que le niveau de seuil de profit doit être supérieur au niveau de fixation des ordres.

Dans le constructeur, j'initialise des variables non vides et non égales à zéro. Pourquoi est-ce que j'obtiens une erreur ?

 //+------------------------------------------------------------------+
//|TrailingFixedPips.mqh |
//| Copyright 2009-2013, MetaQuotes Software Corp.
//| http ://www.mql5.com
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// description de l'assistant début
//+----------------------------------------------------------------------+
//| Description de la classe|
//| Titre=Trailing avec Stop Loss flottant (Fox104) | | |
//| Type=Trailing|
//| Nom=FixedPips|
//| Class=CTrailingFixedPips|
//| Page=|
//| Paramètre=StopLevel,int,30,Niveau de suivi du Stop Loss (en points).
//| Paramètre=ProfitLevel,int,50,Niveau de suivi du Take Profit (en points).
//+----------------------------------------------------------------------+
// description de l'assistant end
//+------------------------------------------------------------------+
//| Classe CTrailingFixedPips.|
//| Objet : Classe de stops suiveurs avec un niveau de stop fixe en pips.
//| Dérive de la classe CExpertTrailing.|
//+------------------------------------------------------------------+
class CTrailingFixedPips : public CExpertTrailing
  {
protected:
   //--- paramètres d'entrée
   int               m_stop_level;
   int               m_profit_level;

public:
                     CTrailingFixedPips(void);
                    ~CTrailingFixedPips(void);
   //--- méthodes d'initialisation des données protégées
   void              StopLevel(int stop_level)     { m_stop_level=stop_level;     }
   void              ProfitLevel(int profit_level) { m_profit_level=profit_level; }
   virtual bool      ValidationSettings(void);
   //---
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp);
  };
//+------------------------------------------------------------------+
//| Constructeur|
//+------------------------------------------------------------------+
void CTrailingFixedPips::CTrailingFixedPips(void)
  {
            m_stop_level = 30;
            m_profit_level = 50;
  }
//+------------------------------------------------------------------+
//| Destructeur|
//+------------------------------------------------------------------+
CTrailingFixedPips::~CTrailingFixedPips(void)
  {
  }
//+------------------------------------------------------------------+
//|| Paramètres de validation des données protégées.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::ValidationSettings(void)
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- vérification des données initiales
   if((m_profit_level-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit_level!=0.0)
     {
      printf(__FUNCTION__+"Le seuil de profit doit être supérieur au niveau de réglage de la commande.);
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Vérification du trailing stop et/ou du profit pour une position longue.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
//--- vérifier
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- vérification des paramètres 
   if(m_profit_level==0.0)  return(false);
//--- déjà au seuil de rentabilité ?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- contrôle des bénéfices
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Vérification du trailing stop et/ou du profit pour une position courte. ||
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
  {
//--- vérifier
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- vérification des paramètres
   if(m_profit_level==0.0)  return(false);
//--- déjà au seuil de rentabilité ?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- contrôle des bénéfices
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Fox104:

Bonjour. Le module ne fonctionne pas.

Le log montre que le niveau de seuil de profit doit être supérieur au niveau de fixation des ordres.

Dans le constructeur, j'initialise des variables non vides et non égales à zéro. Pourquoi est-ce que j'obtiens une erreur ?

Veuillez formater correctement le code dans votre message : Insérez le code correctement dans le forum. (Votre message a déjà été corrigé).
 
Andy:

Lors de l'utilisation du module spécifié dans l'article, des erreurs sont générées dans le journal de l'Expert Advisor lors du chargement de l'Expert Advisor sur le graphique :

2017.09.06 00:28:29.873 1 (EURUSD,M5) OnInit : erreur d'initialisation des indicateurs

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetPriceSeries : la modification des séries temporelles est interdite

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetOtherSeries : la modification des séries temporelles est interdite

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::InitIndicators : les paramètres de réglage ne sont pas vérifiés

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpert::InitIndicators : erreur d'initialisation des indicateurs de l'objet de suivi

2017.09.06 00:31:20.256 1 (EURUSD,M5) OnInit : erreur d'initialisation des indicateurs

Peut-être qu'il n'est plus à jour, où en trouver un nouveau ou que corriger dans ce cas ?

Faites un changement dans le module de suivi "sampleTrailing.mqh" :

//+------------------------------------------------------------------+
//| Vérifier les paramètres de réglage.|
//| INPUT : non.|
//| OUTPUT : true si les paramètres sont corrects, sinon false. || OUTPUT : true si les paramètres sont corrects, sinon false.
//| REMARQUE : Non.|
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- dans le cas où la méthode Init n'a pas été appelée
   if(m_symbol==NULL) return(false);
//--- vérification des paramètres
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+"Le seuil de profit doit être supérieur au niveau de réglage de la commande.);
      return(false);
     }
//--- ok
   return(true);
  }
 
Andy:

Lors de l'utilisation du module spécifié dans l'article, des erreurs sont générées dans le journal de l'Expert Advisor lors du chargement de l'Expert Advisor sur un graphique :


Peut-être est-il obsolète, où en trouver un nouveau ou que corriger dans ce cas ?

Merci pour le message, l'article a été corrigé.

 
Andy:

Lorsque l'on ouvre une position courte et que l'on fixe le stop loss habituel (non trailing) à 0 dans les paramètres, le stop trailing n'est pas fixé au seuil de rentabilité, mais si l'on déplace légèrement le stop habituel et qu'on le fixe à au moins -1 pip, tout fonctionne. En ce qui concerne le longing, tout fonctionne normalement. En vérifiant la condition qu'il y a déjà un breakeven (le stop est inférieur au prix), initialement 0 dans la valeur du stop et il ne le laisse pas aller plus loin.


C'est exact. C'est le Stop Loss spécifié qui déclenche le fonctionnement de CE module suiveur au seuil de rentabilité. En d'autres termes, il est supposé que la position DOIT avoir un stop loss au départ.


Ajouté :

L'objectif de tout article est de montrer et de familiariser avec les approches permettant de résoudre un problème. L'utilisateur doit ensuite développer son propre code sur la base des connaissances acquises.

 
Andy:

Il devrait être complété de sorte que s'il n'y a pas de stop, le trailing est également - remplir la variable avec au moins la valeur d'ouverture.

(J'ai reçu une notification push pour 2 de vos messages, mais l'un d'entre eux est manquant - supprimé) ?


Si vous devez changer quelque chose, ce n'est pas le problème de cet article. Ici, vous pouvez le faire vous-même, en vous basant sur les connaissances que vous avez acquises. En d'autres termes, si vous souhaitez rédiger une mission technique et pensez que l'article sera réécrit dans ce cadre, ce n'est pas le cas.

Comme je vois vos actions : réécrire le module (un petit changement) et l'utiliser.


Ajouté : Pour la dernière fois, veuillez utiliser le bouton "répondre". Sinon, je ne répondrai pas.

 
Andy:

D'accord, je vais l'écrire moi-même. Avez-vous supprimé l'un de vos messages (dites-moi si c'est le cas, pour que je n'aie pas à le rechercher) ?


Vous pouvez ouvrir un nouveau sujet, quelque chose comme"Module de maintien des positions ouvertes au seuil de rentabilité" - je pense qu'un tel sujet sera utile.

Alors oui, j'étais en train d'éditer mon message et j'ai cliqué sur "supprimer" par erreur - en fait, j'ai écrit DEUX messages et j'en ai supprimé un. Par conséquent, le push est arrivé correctement.