Alerte : Le terminal MT4 duplique des ordres envoyés par des experts - page 5

 

Salut les amis :

Je suis désolé de ne pas avoir répondu avant : Je n'étais pas au courant de vos messages car je n'ai reçu aucune notification de Metaquotes. J'ai bien ouvert un ticked, comme RaptorUK l'a recommandé, mais ils n'ont jamais répondu. Je fais la même chose que JamesMadden quand c'est nécessaire : Je ferme simplement l'ordre et je perds le spread. Si ce n'est pas si risqué, je le laisse simplement là ! (si mon EA est rentable, il gagnera plus que perdre à long terme) Cependant, bien sûr, je n'aime pas le bug.

J'ai maintenant de nouveaux problèmes avec le build 600 et j'aimerais savoir, si quelqu'un le sait, comment faire pour qu'il réponde :)

PD : Comment puis-je obtenir cette application Web pour m'envoyer un e-mail lorsque ce poste est mis à jour ? Je suis déjà abonné au sujet.

 
Ricardo1:

Salut les amis :

Je suis désolé de ne pas avoir répondu avant : Je n'étais pas au courant de vos posts car je n'ai reçu aucune notification de Metaquotes. J'ai bien ouvert un ticked, comme RaptorUK l'a recommandé, mais ils n'ont jamais répondu. Je fais la même chose que JamesMadden quand c'est nécessaire : Je ferme simplement l'ordre et je perds le spread. Si ce n'est pas si risqué, je le laisse simplement là ! (si mon EA est rentable, il gagnera plus qu'il ne perdra à long terme) Cependant, bien sûr, je n'aime pas le bug.

J'ai maintenant de nouveaux problèmes avec le build 600 et j'aimerais savoir, si quelqu'un le sait, comment le faire répondre :)

Quand vous le découvrirez, faites-le moi savoir.... J'ai un ticket ouvert depuis mars 2013 qui n'a jamais eu de réponse. Tout ce que je peux suggérer, c'est de continuer à ajouter de nouveaux commentaires à chaque fois pour demander des nouvelles ou une réponse.


PD : Comment puis-je obtenir cette application web pour m'envoyer un e-mail lorsque ce poste est mis à jour ? Je suis déjà abonné à la rubrique.

Les notifications par e-mail ne fonctionnent plus depuis quelques années... Vous pourriez peut-être le signaler au Service Desk.
 
RaptorUK:
Quand vous le saurez, faites-le moi savoir... J'ai un ticket ouvert depuis mars 2013 qui n'a jamais eu de réponse. Tout ce que je peux suggérer, c'est de continuer à ajouter de nouveaux commentaires à chaque fois pour demander des nouvelles ou une réponse. Les notifications par e-mail de

ne fonctionnent plus depuis quelques années... peut-être pourriez-vous le signaler au Service Desk


.


Bonjour,

Je viens de trouver ce sujet parce que j'ai cherché exactement ce problème. Je n'avais pas remarqué le problème auparavant mais il s'est produit pour moi aujourd'hui.

Indépendamment du journal des experts, qui, comme mentionné précédemment, enregistre les transactions, il y a le journal MetaTrader qui enregistre toutes les transactions effectuées, par l'EA ou par une personne. Aujourd'hui, j'ai trouvé une transaction dans mon portefeuille qui était un doublon d'une transaction effectuée quelques secondes plus tôt, mais la deuxième transaction n'est pas apparue dans le journal des experts ou le journal MetaTrader.

J'ai demandé à mon courtier de comparer ses journaux de demandes entrantes avec les transactions exécutées, mais je soupçonne qu'il ne tient pas de journaux ou qu'il ne veut pas enquêter.

Si l'EA a placé deux ordres, je m'attendrais à voir les deux dans le journal. Même si l'application de bureau a, pour une raison quelconque, dupliqué la demande, je m'attendrais à ce que le serveur réponde et enregistre la deuxième transaction. Il semble plutôt que la transaction soit exécutée par le serveur et non par le client.

C'est la première fois que je remarque ce problème et je ne trouve aucun moyen de le reproduire. Les montants avec lesquels je travaille actuellement sont très faibles, donc la valeur n'est pas importante, mais cela soulève des inquiétudes quant à la viabilité de MetaTrader.

J'ai juste pensé que je pourrais apporter ma contribution à un sujet qui traîne depuis un certain temps.

Edit :

J'ai vérifié davantage et j'ai trouvé un autre exemple. L'ordre avait déjà été fermé par le stop loss donc je ne l'ai pas remarqué. Dans les deux cas, l'EA a placé un ordre attendu. Cela apparaît dans le journal immédiatement suivi d'un message de connexion qui correspond à l'ordre fantôme placé.

Si quelqu'un d'autre pense qu'un ordre fantôme s'est produit, veuillez vérifier le message de connexion dans le journal. Il peut être significatif.

 

Il semble que je ne sois pas le seul à être affecté par ce problème ennuyeux. Comme Spikedog, mon EA a demandé un ordre de marché qui a entraîné une autre entrée dupliquée de la même taille de lot en quelques millisecondes, le journal des ordres dupliqués s'est affiché dans le Journal mais pas dans l'onglet Experts ; j'ai depuis légèrement modifié mes codes pour espérer mieux me prémunir contre ce problème en filtrant les transactions doubles dans la même barre (négociation à l'ouverture de la barre uniquement) juste avant OrderSend().

C'est la première fois que j'ai eu ce problème de double transaction ; j'ai ouvert plus de 500 transactions avec 3 courtiers depuis et aucun problème jusqu'à maintenant. Par ailleurs, les transactions suivantes fonctionnent à nouveau correctement.

Vous trouverez ci-joint mon code pour traiter OrderSend() lorsque le problème de duplication se produit. Je ne vois pas comment mon EA peut être la cause de la duplication de l'ordre. La seule raison possible à laquelle je peux penser pour le moment est peut-être qu'en de très rares occasions, le serveur a traité mon OrderSend mais a retourné "-1" d'une manière ou d'une autre et mon EA a procédé à une autre requête en traitant la première comme une requote. Ce n'est qu'une simple spéculation.


            bool Buy_Ticket = false;
            while(Buy_Ticket==false){     //Loop to solve Requote issues
               for(int BT_count=0; BT_count < RequoteTries; BT_count++){
                  if (!IsTradeAllowed()) Sleep(RequoteTries_WaitingTime);
                  RefreshRates();

                  int B_Spread = MarketInfo(Symbol(), MODE_SPREAD);  //TO CAPTURE EXACT SPREAD UPON BUY ORDER FOR SL
                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
                     for(int buyMod=0; buyMod < OrdersTotal(); buyMod++){
                        if (OrderSelect(buyMod,SELECT_BY_POS,MODE_TRADES)){
                           if ((OrderSymbol()!=Symbol()) || (OrderType()!=OP_BUY)) continue;
                           if ((OrderStopLoss()==0) && (OrderTakeProfit()==0)){
                              double B_SL = NormalizeDouble((OrderOpenPrice()-((B_Spread*Point)+stoploss)),Digits);
                              double B_TP = NormalizeDouble((OrderOpenPrice()+takeprofit),Digits);

                              bool buy_ModSL_succeed = false;
                              while(buy_ModSL_succeed==false){     //Loop to solve SL+TP modify Requote issues   
                                 for(int buyMod_count=0; buyMod_count < RequoteTries; buyMod_count++){
                                    if (!IsTradeAllowed()) Sleep(5000);
                                    RefreshRates();                                 
                                    if (OrderModify(OrderTicket(), OrderOpenPrice(), B_SL, B_TP, 0, Red)==false) continue;
                                    buy_ModSL_succeed = true;
                                    Print(entrycode_txt," initiated Long trade successfully modified SL & TP.");
                                    break;                        
                                 }  //End FOR loop for requote handling
                                 if (buy_ModSL_succeed == false){
                                    getError = GetLastError();
                                    Alert("Error: ",getError," in Buy order#:",OrderTicket()," modify for SL:",B_SL," & TP:",B_TP," after ",RequoteTries," attempts.");
                                    break;
                                 }
                              }  //End WHILE loop for SL+TP modify requote handling
                           }  //End IF statement to select new orders without SL & TP
                        }  //End IF orderselect
                     }  //End FOR loop to modify new orders without SL & TP 
                  }  //End IF statement when buy order accepted & need SL+TP modify

                  if (Buy_Ticket==false) continue;
                  else break;
               }  //----------------------------//End FOR loop to carry out ordersend for buy trade when requote
               if (Buy_Ticket==false) break;    //Exit WHILE loop to handle Requote issues, fail to buy
            }  //-------------------------------//End WHILE loop to solve Requote issues
 
BigFisherman:

Je ne vois pas en quoi mon EA est la cause de la duplication de l'ordre.

Cela pourrait être lié à cette erreur dans votre code, vous devriez la corriger et tester à nouveau ....

                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed

OrderSend() retourne un int et non un bool, donc vérifier si la valeur de retour est "true" est incorrect.

 

@BigFisherman

B.T.W., qu'est-ce qui se passe avec votre code ?

if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
if (Buy_Ticket==false) continue;

et encore ?

else break;
 
RaptorUK:

Cela pourrait être lié à cette erreur dans votre code, vous devriez la corriger et tester à nouveau ... .

OrderSend() retourne un int et non un bool, donc vérifier si la valeur de retour est "true" est incorrect.


Merci raptoruk pour la suggestion. Vous avez raison :)
 
BigFisherman:

Merci raptoruk pour la suggestion. J'en suis conscient. Cependant, je ne pense pas que ce soit la cause du double emploi car le code présenté est valide, bien qu'un peu confus.
Comment le code est-il valide ? si l'OrderSend() fonctionne, vous obtenez une valeur supérieure à 0, c'est-à-dire le numéro du ticket, s'il échoue, vous obtenez -1, vous testez pour vrai ou faux... corrigez votre code et supprimez l 'incertitude.
 
RaptorUK:
Comment le code est-il valide ? si l'OrderSend() fonctionne, vous obtenez une valeur supérieure à 0, c'est-à-dire le numéro du ticket, si cela échoue, vous obtenez -1 vous testez pour vrai ou faux ... corrigez votre code et supprimez l'incertitude.



Merci encore.

A la vôtre !

 
RaptorUK:
Comment le code est-il valide ? si l'OrderSend() fonctionne, vous obtenez une valeur supérieure à 0, c'est-à-dire le numéro du ticket, s'il échoue, vous obtenez -1, vous testez pour vrai ou faux... corrigez votre code et supprimez l'incertitude.


Bonjour RaptorUK,



J'ai une question qui ne concerne pas exactement le sujet de ce fil de discussion, mais j'espère utiliser mon message précédent comme un exemple pour approfondir ma compréhension du codage mql4 et peut-être aussi aider d'autres débutants comme moi (si vous pensez que c'est hors sujet et a besoin d'un nouveau fil de discussion, s'il vous plaît supprimer ce et me le faire savoir).

J'étais légèrement confus au début de ma façon initiale de déclarer Buy_Ticket comme bool plutôt que int, donc j'ai fait des tests supplémentaires sur elle. Bien que je sois d'accord que ma façon originale de lire OrderSend() comme bool n'est pas une bonne façon de coder (confus), mais mon test montre que c'est valide. Pour simplifier la lecture, j'ai codé ce qui suit, merci pour vos conseils et votre temps.


P.S. : Comme conseillé, j'ai déjà modifié mon EA pour lire OrderSend() comme int.



//+------------------------------------------------------------------+
//|                                                    Test_Bool.mq4 |
//|                                     Copyright 2014, BigFisherman |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, BigFisherman"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
//---
   
   for (int SimRun=0; SimRun<3; SimRun++){
      bool Buy_Ticket = 0;
      int Ordersend = 0;            //AS AN EXAMPLE TO SIMULATE OrderSend() RETURNED CODE

      switch (SimRun)
      {
         case 0: break;             //FOR Ordersend==0
         case 1:
         {
            Ordersend = 1;          //SIMULATE SUCCESSFUL ORDERSEND() RETURNING TICKET NO. > 0
            break;
         }
         case 2:
         {
            Ordersend = -1;         //SIMULATE FAILED ORDERSEND() RETURNING "-1"
            break;
         }
      }
      
      
      // (MY ORIGINAL WAY OF CODING)   Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;
      Buy_Ticket = Ordersend > 0;   //SIMPLIFIED CODE FOR EASIER READING
      
      
      if (Buy_Ticket==true){
         Print("** Buy_Ticket returns true  **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
      else{                         //if (Buy_Ticket==false)
         Print("** Buy_Ticket returns false **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
   }
   return(0);
}
//+------------------------------------------------------------------+


Journal

2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 0  Ordersend: 0  Buy_Ticket: 0
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns true  **  SimRun: 1  Ordersend: 1  Buy_Ticket: 1
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 2  Ordersend: -1  Buy_Ticket: 0