Mon EA fait une double entrée - page 9

 

Bonjour

Cette approche ne fonctionne que si la taille de la position actuelle est nulle et que la nouvelle transaction est exécutée avec succès avec la taille de position souhaitée.

Voir le code :

#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if(conditions_to_open && !position_opened) //-- Or position_opened==false
     {
      if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
         && 
         (trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened=true;
         Print("Success!");
        }
      else
        {
         Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return;
        }

     }
//--- 
  }


Mais que se passe-t-il si votre EA retourne la position : d'une position LONG à une position SHORT ou vice versa et que cette action est exécutée dans 2 trades différents ?

Après le premier trade, le booléen "position_opened" est mis à "TRUE" et l'EA ne peut pas ouvrir le 2e trade car la condition vérifie"if(conditions_to_open && !position_opened)", donc le deuxième trade sera bloqué.

Et que se passe-t-il si la taille de la position n'est que partiellement ouverte ? Vous avez besoin d'une deuxième transaction pour que la taille de votre position soit correcte.


En fin de compte, pour faire "une longue histoire courte", vous avez toujours besoin de la fonction PositionSelect(Symbol()) pour calculer la taille de la position ACTUELLE et c'est là que le problème a commencé (et ce fil du forum).

Au moment critique, lorsque l'EA appelle la fonction PositionSelect(Symbol()), le terminal n'a pas encore mis à jour la taille de la position ACTUELLE et l'EA travaille avec la mauvaise taille de position et envoie un nouvel ordre double au serveur de négociation.


Je pense que l'approche de(figurelli) est meilleure car vous êtes obligé d'attendre que l'EA ait mis à jour la fonction PositionSelect(Symbol()) à la bonne taille de position.


bool fatalError=false; // atention: declare this as global

....

if(fatalError == false) 
      {
      if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) 
            {
            Print("Position opened in ", Symbol());
            int maxTimeout=0;
            while(!PositionSelect(Symbol())) 
                     {
                     Sleep(100);
                     maxTimeout++;
                     if(maxTimeout > 100) 
                           {
                           Print("### PositionSelect fatal error!");
                           fatalError = true;
                           break;
                           }
                     }
            Print("--> PositionSelect delay=",maxTimeout * 100);
            break;
            }
      }
 
snelle_moda:

Bonjour

Cette approche ne fonctionne que si la taille de la position actuelle est nulle et que la nouvelle transaction est exécutée avec succès avec la taille de position souhaitée.

Voir le code :


Mais que se passe-t-il si votre EA retourne la position : d'une position LONG à une position SHORT ou vice versa et que cette action est exécutée dans 2 trades différents ?

Après le premier trade, le booléen "position_opened" est mis à "TRUE" et l'EA ne peut pas ouvrir le 2e trade car la condition vérifie"if(conditions_to_open && !position_opened)", donc le deuxième trade sera bloqué.

Et que se passe-t-il si la taille de la position n'est que partiellement ouverte ? Vous avez besoin d'une deuxième transaction pour que la taille de votre position soit correcte.


En fin de compte, pour faire "une longue histoire courte", vous avez toujours besoin de la fonction PositionSelect(Symbol()) pour calculer la taille de la position ACTUELLE et c'est là que le problème a commencé (et ce fil du forum).

Au moment critique, lorsque l'EA appelle la fonction PositionSelect(Symbol()), le terminal n'a pas encore mis à jour la taille de la position ACTUELLE et l'EA travaille avec la mauvaise taille de position et envoie un nouvel ordre double au serveur de négociation.


Je pense que l'approche de(figurelli) est meilleure car vous êtes obligé d'attendre que l'EA ait mis à jour la fonction PositionSelect(Symbol()).


Vous avez raison, les deux approches ont des limites.

L'origine de ce problème est maintenant clairement identifiée. Chacun doit adapter son code en fonction de sa stratégie. Je ne pense pas qu'il existe une méthode générale qui puisse s'appliquer à tous les cas.

 
Avons-nous besoin d'une bibliothèque OrderSendReliable() pour le grand et puissant mql5 ?
 
Ubzen:
Avons-nous besoin d'une bibliothèque OrderSendReliable() pour le grand et puissant mql5 ?
Je ne pense pas que le sarcasme puisse être d'une quelconque utilité. Bien que ce soit clairement une mauvaise conception qui mène à une telle complexité.
 
angevoyageur:

Vous avez raison, les deux approches ont des limites.

L'origine de ce problème est maintenant clairement identifiée. Chacun doit adapter son code en fonction de sa stratégie. Je ne pense pas qu'il existe une méthode générale qui puisse s'appliquer à tous les cas.


Ou bien nous devons attendre une "déclaration officielle" des gars de Metaquotes eux-mêmes.

Y a-t-il déjà une réponse du service d'assistance ?

 
angevoyageur: Je ne pense pas que le sarcasme puisse être d'une quelconque aide. Bien que ce soit clairement une mauvaise conception qui mène à une telle complexité.

Si je suis d'accord avec vous, considérez-vous que cela n'aide pas ? .

J'ai simplement enseigné que la solution consistant à dormir jusqu'à la fin de la négociation me faisait penser à OrderSendReliable(). J'ai enseigné que ces solutions auraient été traitées de manière plus élégante.

Cela me rappelle également le traitement des anciens documents ... où il y a {et toutes les transactions doivent être arrêtées}.

Quoi qu'il en soit, mes excuses, je ne voulais pas m'en prendre à mql5.

 
snelle_moda:


Ou nous devons attendre une "déclaration officielle" des gars de Metaquotes eux-mêmes.

Y a-t-il déjà une réponse du service desk ?

Non, je pensais justement à cela... Il serait probablement utile que toutes les personnes concernées écrivent un ticket au ServiceDesk à propos de ce problème. Cependant, je suis très sceptique quant à la volonté de MQ de changer cette conception. Mais nous pouvons essayer.

Les gens peuvent écrire au ServiceDesk et rapporter le numéro de ticket ici. Le mien est

Erreurs, MetaTrader 5 MQL, Ouvrir, Démarrer : 2013.12.23 19:08, #916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen:

Si j'étais d'accord avec vous, considéreriez-vous que cela n'aide pas ? .

J'ai simplement enseigné que la solution consistant à dormir jusqu'à la fin de la négociation me faisait penser à OrderSendReliable(). J'ai enseigné que ces solutions auraient été traitées de manière plus élégante.

Cela me rappelle également le traitement des anciens documents ... où il va {et toutes les transactions doivent être arrêtées}.

Quoi qu'il en soit, mes excuses, je ne voulais pas m'en prendre à mql5.

Je me demande si un problème similaire n'existe pas aussi dans mql4, j'ai lu au moins 2 sujets ces derniers mois sur le forum mql4 d'utilisateurs qui se plaignent de doubles trades. Je ne suis pas sûr que ce soit lié, mais il peut être intéressant de vérifier ces sujets. Lisez-vous aussi ces sujets ?
 
angevoyageur: Je me demande si un problème similaire n'existe pas aussi dans mql4, j'ai lu au moins 2 sujets au cours des derniers mois sur le forum mql4 d'utilisateurs qui se plaignent des doubles trades. Je ne suis pas sûr que ce soit lié, mais il peut être intéressant de vérifier ces sujets. Lisez-vous aussi ces sujets ?

Oui, mais il est difficile de dire si c'est à cause d'un mauvais codage. Le double échange était un problème même avant le fil de discussion sur les échanges multiples. La façon dont il est traditionnellement géré est la façon dont snelle_moda le gère.

 
Ubzen:

Oui, mais il est difficile de dire si c'est à cause d'un mauvais codage. Le double échange était un problème même avant le fil de discussion sur les échanges multiples. La façon dont il est traditionnellement géré est la façon dont snelle_moda le gère.

Je ne suis pas sûr de comprendre ce que vous voulez dire. Le problème dont nous parlons dans ce sujet n'est pas causé par un mauvais codage mais par une mauvaise conception de mql5 (c'est mon opinion, ou peut-être est-ce simplement un bug?). Qu'entendez-vous par "fil d'échange multiple" ?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.