Discussion de l'article "Guide étape par étape pour rédiger un conseiller expert en MQL5 pour les débutants" - page 22

 
Bonjour, Si quelqu'un peut m'aider s'il vous plaît. A ma connaissance, j'ai fait tout ce qui est indiqué dans l'article. Mais je n'arrive pas à avoir deux opérations ouvertes simultanées, au delà de ce que j'ai compris que l'auteur voulait faire pour ne pas placer d' achat s'il y avait déjà achat ou de vente s'il y avait déjà vente. Ma stratégie, par exemple, envoie un signal de vente alors que j'ai un ordre d'achat ouvert, et au lieu d'ouvrir une vente, le code ferme l'opération d'achat sans qu'elle puisse toucher le tp/sl. Je me retrouve donc sans achat ni vente. La vente ferme l'achat et l'achat ferme la vente. Je n'utilise qu'une seule paire, qu'un seul cadre temporel et qu'une seule taille de lot dans ma stratégie. Pouvez-vous me dire comment je peux avoir un achat et une vente ouverts en même temps si cela déclenche la stratégie ? C'est à dire que les ordres ne sont fermés QUE par tp/sl. Merci beaucoup d'avance.
 
Excellent article !
 
Sella170:
Quelqu'un sait-il si je peux utiliser cet EA pour les mini-index ou les mini-dollars ?
Oui, vous pouvez utiliser l'EA en faisant glisser la souris sur le graphique ou dans le menu > Insérer > Conseiller expert > {nomedoseurobo}.

J'espère avoir répondu à votre question.

 
Merci beaucoup pour cet excellent article. Où et comment implémenter le module Intraday Time Filter dans votre code ?
 

Bonjour à tous.

Je suis dans le"Strategy Tester" avec ce fichier de la fin du Guide et il affiche l'erreur suivante :

*L'erreur a déjà été discutée dans cet article, mais aucune solution écrite n'a fonctionné pour moi et j'ai besoin de votre aide.


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


Le fichier se trouve à la fin du guide.

Comment puis-je résoudre ce problème ?

 
surfdoode2:


J'ai toujours cette erreur après avoir effectué les deux corrections suggérées :

ZeroMemory(mrequest) ;

et aussi

if(Achat_ouvert || Vente_ouverte)

Quelqu'un peut-il m'aider à résoudre l'erreur 4756 ? Il semble qu'il soit impossible de placer un ordre d'achat.

Vérifiez si vous avez utilisé la fonction SymbolInfoTick et écrit cette partie du code :

//--- Obtenir la dernière cotation en utilisant la structure MQL5 MqlTick
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Il y a ici une erreur dans la logique de l'algorithme :
 //--- Avons-nous déjà des postes ouverts ?
     bool Buy_opened= false ;   // variable contenant le résultat de la position ouverte de Buy
     bool Sell_opened= false ; // variable contenant le résultat de la position ouverte de Sell
    
     if ( PositionSelect ( _Symbol ) == true )   // nous avons une position ouverte
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //Il s'agit d'un achat
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Il s'agit d'une vente
         }
    }

Puisque PositionSelect sélectionne la première position pour _Symbol, si l'EA ouvre une position d'achat, la variable Sell_opened sera toujours fausse tant que la position d'achat est ouverte, ce qui entraînera la réalisation de plusieurs positions de vente chaque fois qu'il y a un signal de vente.

Pour corriger cela et savoir s'il y a des positions d'achat et de vente ouvertes simultanément, la logique suivante peut être utilisée :

 //--- Avons-nous déjà des postes ouverts ?
   bool Buy_opened = false ;   // variable contenant le résultat de la position ouverte de Buy
   bool Sell_opened = false ; // variables pour contenir le résultat de la position ouverte de Sell

   if ( PositionSelect ( _Symbol ) == true ) // nous avons une position ouverte
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Il s'agit d'une vente
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //Il s'agit d'un achat
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

Bonjour à tous, bonjour.

Je suis dans le"Strategy Tester" avec ce fichier de la fin du Guide et il affiche l'erreur suivante :

*L'erreur a déjà été discutée ici dans cet article, mais aucune solution écrite n'a fonctionné pour moi et j'ai besoin de votre aide.



Le fichier se trouve à la fin du guide.

Comment puis-je résoudre ce problème ?

Vérifiez le prix de vente que vous demandez. Pour ce faire, utilisez un point d'arrêt pour déboguer les variables mrequest.price, mrequest.sl et mrequest.tp.

Essayez de changer

mrequest.type_filling = ORDER_FILLING_FOK;                               // Type d'exécution de l'ordre

à :

mrequest.type_filling = ORDER_FILLING_IOC;                               // Type d'exécution de l'ordre


Certains papiers ont des règles de stop loss minimum, lisez-en plus ici :https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

Bonjour,

Merci beaucoup pour l'article Samuel, tu es un crack !

J'ai eu un peu de mal à le faire fonctionner avec mon broker car l'article est en mode "net" et j'ai dû chercher des informations pour le mettre en mode "hedging". Le premier problème que j'ai rencontré est celui du mrequest.type_filling .

Pour le broker XM, celui qui fonctionne est :

mrequest.type_filling = ORDER_FILLING_IOC;                                          // Type d'exécution de l'ordre

Si vous ne savez pas quel type est autorisé par votre MT5, je vous recommande d'utiliser la fonction TypeFilling() dans un Print(TypeFilling()) ou un Comment( TypeFilling()) et elle renvoie le type ; si elle vous dit que c'est 1 (ORDER_FILLING_FOK) ou 2 (ORDER_FILLING_IOC), vous savez lequel vous devez mettre(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) carORDER_FILLING_FOK (1) ne fonctionne pas pour moi avec ce courtier.


Une fois cela corrigé, le problème est que PositionSelect ouvre beaucoup de positions. Bien que Samuel ne le dise pas dans sa stratégie, je comprends que l'objectif est d'ouvrir une seule position d'achat ou de vente (selon ce qui vient en premier) avec les critères établis (les 4 étapes booléennes) et que tant que cette position n'est pas fermée, on ne peut pas en ouvrir une autre.

Ce que j'ai fait, c'est de changer ce code...

//--- nous n'avons pas d'erreur, donc nous continuons.
//--- Avons-nous des postes à pourvoir ?
    bool Buy_opened=false;  // variable stockant le résultat de la position ouverte Achat
    bool Sell_opened=false; // variable stockant le résultat de la position ouverte Vente
    
    if (PositionSelect(_Symbol) ==true)  // nous avons un poste à pourvoir
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // C'est un achat
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // C'est une vente
         }
    }

Pour celui-ci...

//--- Nous n'avons pas d'erreur, nous continuons donc.
//--- Avons-nous des postes à pourvoir ?
   bool Buy_opened = false;               // Variable stockant le résultat de l'ouverture de la position d'achat
   bool Sell_opened = false;              // Variable stockant le résultat de la position de vente ouverte
   
   // Passons en revue toutes les commandes pour voir s'il y a des commandes en cours.
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // est un achat
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // est une vente
         }
   }

// s'il y a une position ouverte, nous attendons que la transaction active soit clôturée (en touchant le SL ou leTP).
   if (Buy_opened || Sell_opened) return; 

Note : Juste après vient la ligne...

//--- Copier le prix de clôture de la barre précédente dans la barre actuelle, qui est bar1.
   p_close=mrate[1].close;

De cette façon, cela a bien fonctionné pour moi. J'espère que cela vous sera utile.

Je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées.

 
surfdoode2:


J'ai toujours cette erreur après avoir effectué les deux corrections suggérées :

ZeroMemory(mrequest) ;

et aussi

if(Achat_ouvert || Vente_ouverte)

Quelqu'un peut-il m'aider à résoudre l'erreur 4756 ? Il semble qu'il soit impossible de placer un ordre d'achat.


Peut-être que le type de remplissage de votre courtier est ORDER_FILLING_IOC, vous pouvez essayer d'éditer le code à partir de :

mrequest.type_filling = ORDER_FILLING_FOK;

A :

mrequest.type_filling = ORDER_FILLING_IOC;

J'ai eu le même problème et je l'ai résolu avec succès.