Problème de commandes multiples - page 5

 
RaptorUK:

Lisez les codes d'erreur d'exécution et faites en sorte que votre code soit conforme aux informations qui y sont données, par exemple ... ...

ERR_TRADE_TIMEOUT128Le délai d'exécution de la transaction a été atteint. Avant de réessayer(au moins, en 1 minute), il est nécessaire de s'assurer que l'opération de trading n'a pas vraiment réussi (une nouvelle position n'a pas été ouverte, ou l'ordre existant n'a pas été modifié ou supprimé, ou la position existante n'a pas été fermée).


Salut RaptorUK,

Merci pour cet indice.

Une autre question (plus une.....) ;

Supposons que sur un courtier ECN, une transaction est ouverte et que, conformément aux " Exigences et limitations relatives à la réalisation de transactions ", un ordre de marché ne peut être fermé si le stoploss se trouve à l'intérieur de la distance de gel, dans ce cas, la fonction CloseAll fermera-t-elle même les ordres qui se trouvent à l'intérieur de la distance de gel ?

Meilleures salutations

Luis

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;   
        RefreshRates(); 

   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket>0)                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()-OrderClosePrice())>            
            MathAbs(OrderStopLoss()-OrderClosePrice()))              
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
                  GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 
 
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
}
 
luisneves:


Bonjour RaptorUK,

Merci pour l'indice.

Une autre question (plus une.....) ;

Supposons que sur un courtier ECN, une transaction est ouverte et que, conformément aux " Exigences et limitations relatives à la réalisation de transactions ", un ordre de marché ne peut être fermé si le stoploss se trouve à l'intérieur de la distance de gel. Dans ce cas, la fonction CloseAll fermera-t-elle même les ordres qui se trouvent à l'intérieur de la distance de gel ?

Non, elle échouera, probablement à cause de l'erreur 130.
 

Bonjour RaptorUK,

Si possible, j'aimerais vous demander de l'aide pour ce problème ;

Ce morceau de code trouve le dernier OrderLots() et le multiplie par le facteur multiplicateur, mais parfois il passe ce facteur et j'ai des ordres de cette façon ; 0.01, 196,83, 590,49, etc.

Il faut dire que j'ai une limite pour les ordres ouverts, dans ce cas 5. Maintenant, la façon dont je vois cette logique, même si vient une condition pour ouvrir un ordre au-dessus de 5, il ne sera pas ouvert et puis le nombre d'ordres dans le pool sont limités à 5, donc, si le code ne voit que 5 ordres dans le pool la taille du lot pour ces ordres devrait être ; 0,01, 0,02, 0,04, 0,08, 0,16. Y a-t-il un problème dans ce code dont je ne suis pas au courant ?

(j'espère que l'indentation est correcte...)

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
 if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
   {//12
 if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
   {//13
     LastLot = OrderLots();
   }//13              
     MLots = 0;                       
     MLots = LastLot * Multiplier;        
   }//12
 else MLots = LotSize;
   }//11 
 return(0);
 }//0 

Meilleures salutations

Luis

 
luisneves:

Bonjour RaptorUK,

Si possible, j'aimerais vous demander de l'aide pour ce problème ;

Ce morceau de code trouve le dernier OrderLots() et le multiplie par le facteur multiplicateur, mais parfois il passe ce facteur et j'ai des ordres de cette façon ; 0.01, 196,83, 590,49, etc.

Il faut dire que j'ai une limite pour les ordres ouverts, dans ce cas 5. Maintenant, la façon dont je vois cette logique, même si vient une condition pour ouvrir un ordre au-dessus de 5, il ne sera pas ouvert et puis le nombre d'ordres dans le pool sont limités à 5, donc, si le code ne voit que 5 ordres dans le pool la taille du lot pour ces ordres devrait être ; 0,01, 0,02, 0,04, 0,08, 0,16. Y a-t-il un problème dans ce code dont je ne suis pas au courant ?

(j'espère que l'indentation est correcte...)

Je fais comme ça...

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         }//13              
      MLots = 0;                       
      MLots = LastLot * Multiplier;        
      }//12
   else MLots = LotSize;
   }//11 
return(0);
}//0 

si le OrderSelect() échoue MLots = LotSize ? ? pourquoi ? votre indentation ne vous aide pas à voir ce qui se passe avec vos instructions if et vos accolades . ... est-ce que vous vouliez faire ça ?

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         MLots = 0;                       
         MLots = LastLot * Multiplier; 
         }//13              
      }//12
   }//11 
if(MLots < 0.001) MLots = LotSize;  //  if MLots == 0.0
return(0);
}//0 

Je l'ai fait...

if(MLots < 0.001)

... comme méthode rapide et sale pour éviter les problèmes de double comparaison, avez-vous lu ceci ?price != price ?

 
RaptorUK:

Je fais comme ça...

si le OrderSelect() échoue MLots = LotSize ? ? pourquoi ? votre indentation ne vous aide pas à voir ce qui se passe avec vos instructions if et vos accolades... ... est-ce que vous vouliez faire ça ?

Je l'ai fait...

... comme méthode rapide et sale pour éviter les problèmes de double comparaison, avez-vous lu ceci ?price != price ?


Salut RaptorUk,

Merci pour votre réponse rapide.

Donc, je suppose qu'il vaut mieux ne pas faire usage d'autre chose, car cela ne sert à rien. Et merci pour le lien fourni.

Meilleures salutations

Luis

 

Bonjour RaptorUK,

J'ai un problème (plus un.....)

Certains ordres se ferment avant l'heure, ce que je veux dire ;

Ces ordres ont été ouverts et il y a une limite d'ouverture jusqu'à 6. Tous les ordres devraient se fermer au moyen du TrailingStop, mais les ordres 1. 3 et 5 ont été fermés avant les autres qui ont été fermés après (07:43).

Comme ces 3 ordres ont été fermés avant les autres, cela laisse de la place pour ouvrir les ordres 7, 8 et 9 et ceux-ci s'ouvrent avec un lot basé sur le dernier lot (2.43).

Donc, d'après ce que j'ai compris, la fermeture erratique des ordres à 07:23 ne devrait pas avoir lieu et aucune erreur n'a été trouvée...

1 - 49518192013.01.28 19:51vendre0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04acheter0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12vendre0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20acheter0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27vendre0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48acheter2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23vendre7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40acheter21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40vendre65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Le code pour fermer tous ces ordres au moyen du TrailingStop est celui-ci ;

Ce code peut-il échouer et fermer les ordres à des moments différents ?

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;
        
   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket > 0 )                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()- OrderClosePrice())>            
            MathAbs(OrderStopLoss()- OrderClosePrice()))             
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 

Meilleures salutations

Luis

 
luisneves:


Le code pour les fermer tous au moyen du TrailingStop est celui-ci ;

Ce code pourrait-il échouer et fermer les ordres à des moments différents ?

OK, cela n'a aucun sens... un SL suiveur est défini de telle sorte que si le prix évolue avec un ordre, le SL est déplacé vers le prix, de sorte que si le nouveau SL est atteint, il y aura moins de perte ou même un bénéfice. Pourquoi avoir un SL de suivi si vous allez de toute façon fermer la transaction par OrderClose() ? Pour moi, ce n'est pas un SL de suivi, ce n'est pas un SL d'aucune sorte puisque vous fermez activement la transaction via l'EA et non le SL.

Peut-être que votrefonction CloseAllOnSL() fait quelque chose de différent de ce que je pense qu'elle fait mais, encore une fois, vous n'avez aucun commentaire expliquant ce que votre code essaie de faire. Il n'y a pas de SL suiveur comme il n'y a pas de OrderModify().

 

Read this :Que sont les valeurs de retour des fonctions ? Comment les utiliser ?

if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 {
                 GLError = GetLastError();

                 //  ? ? ? ? ?  why aren't you printing the information about the OrderClose() failure ? ? 
                 Print("OrderClose failed, error# ", GLError);  //<-----  like this  but more info
                 } 
              }//32 

ajoutez plus d'informations à l'instruction Print, ajoutez OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc toute information dont vous avez besoin pour déterminer quel était le problème lorsque l'erreur s'est produite, vous ne pouvez pas facilement revenir en arrière dans le temps et trouver tout cela, donc lorsque cela se produit, imprimez-le dans le journal.

 
luisneves:


Donc, d'après ce que j'ai compris, la fermeture erratique des ordres à 07:23 ne devrait pas avoir lieu et aucune erreur n'a été trouvée...

1 - 49518192013.01.28 19:51vendre0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04acheter0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12vendre0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20acheter0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27vendre0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48acheter2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23vendre7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40acheter21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40vendre65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Montrez la sortie du journal lorsque cela s'est produit . . .
 
RaptorUK:

Read this :Que sont les valeurs de retour des fonctions ? Comment les utiliser ?

ajoutez plus d'informations à l'instruction Print, ajoutez OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc toute information dont vous avez besoin pour déterminer quel était le problème lorsque l'erreur s'est produite, vous ne pouvez pas facilement revenir en arrière dans le temps et trouver tout cela, donc lorsque cela se produit, imprimez-le dans le journal.


Salut RaptorUk,

Merci pour votre temps.

Le code pour le TrailingStop est dans une autre partie, le code envoyé est seulement pour fermer tous les ordres une fois qu'ils ont été fermés au moyen du TrailingStop.

Néanmoins, je vais suivre votre conseil et rechercher toute erreur qui pourrait donner plus d'informations supplémentaires sur la raison pour laquelle les ordres sont fermés avant les autres.

A propos, dans le code suivant, est-il logique de changer la position de MLots = 0 ; de l'endroit actuel à avant la boucle for ?

   MLots = 0; <-----------------------------------------------------------------to here 
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
      {//11
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {//12
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//13
            LastLot = OrderLots();
            }//13            
         MLots = 0;  <-----------------------------------------------------------from here                      
         MLots = LastLot * Multiplier;        
         }//12      
      }//11 
   return(0);
   }//0 

Cordialement

Luis

Raison: