Fermeture des demi-lots. - page 3

 
DomGilberto:

MathFloor arrondit-il les décimales au nombre entier le plus proche ?

MathFloor() fait ce qui est indiqué dans la documentation... "La fonction MathFloor renvoie une valeur numérique représentant le plus grand nombre entier inférieur ou égal à x".

DomGilberto:


Est-ce que FirstTarget a un sens en tant que paramètre personnalisé dans "OrderClose()" - en supposant que "sizeClose" était correct ? (voir le code cité)

Non... vous avez ceci :

FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();

// meaning this

FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();

alors que vous voulez probablement dire ceci...

FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;

Utilisez des parenthèses (et des espaces) pour rendre les choses claires et sans ambiguïté.

DomGilberto:


Votre code n'a pas aidé - désolé.

Pourquoi ? C'est une erreur ?

DomGilberto:


Pouvez-vous imprimer des variables personnalisées ? Si c'est le cas, je dois m'y prendre mal car elles n'apparaissent pas dans le journal.

Oui, vous pouvez imprimer toutes les variables . ... que faites-vous ? Montrez votre code.

 
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }
   } 
     
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP)
    {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
      
      double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
       
       if (half < minLot) half = Lots;
       half=Lots/2;
       OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); 
       }
    } 


En ce qui concerne l'impression des variables personnalisées, comment dois-je procéder pour "FirstTarget_Buy" ?

Je vais passer du temps à parcourir tout mon code et à imprimer beaucoup de choses - je comprends comment le faire avec les bools et les ints (integer -1 échoue et bool est une déclaration vraie ou fausse - facile.) mais je ne comprends pas comment le faire lorsque vous assignez des fonctions à une variable personnalisée ?

Merci de m'avoir éclairé sur la formule "FirsTarget" ci-dessus ! Désolé, je voulais dire que votre code n'a pas aidé dans le sens où je ne comprends pas comment assembler la formule... Je trouve que c'est vraiment contre intuitif - On aurait pu penser que l'appel à "OrderSelect" vous permettrait de voir simplement quelle était la taille du lot sur ce tickorder... et ensuite simplement le diviser...

Désolé de passer pour un crétin complet !

 
DomGilberto:

Désolé d'être passé pour un crétin complet !

Pas du tout, vous devez juste trouver votre point aveugle et l'éclairer, une fois que vous l'aurez fait vous vous demanderez pourquoi vous avez trouvé cela si difficile, tout est facile quand vous savez comment faire.

DomGilberto:

En ce qui concerne l'impression de variables personnalisées, comment dois-je m'y prendre pour "FirstTarget_Buy" ?

Je vais passer du temps à parcourir tout mon code et à en imprimer beaucoup - je comprends comment le faire avec les bools et les ints (integer -1 échoue et bool est une déclaration vraie ou fausse - facile.) mais je ne comprends pas comment le faire lorsque vous assignez des fonctions à une variable personnalisée ?

Comme ceci ... notez aussi le commentaire sur les accolades
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );

      Print("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy, Digits) );   // prints FirstTarget_Buy with the same number of digits as the current symbol
         {                                                                                        // why this brace ?   
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }                                                               // why this brace ?  
   } 

DomGilberto:

Je voulais dire que votre code n'a pas aidé dans le sens où je ne comprends pas comment assembler la formule... Je trouve que c'est vraiment contre intuitif - On aurait pu penser que l'appel à "OrderSelect" vous permettrait de voir simplement quelle était la taille du lot sur ce tickorder... et ensuite de le diviser simplement...

Vous pouvez simplement sélectionner l'ordre, puis utiliser OrderLots() et diviser par deux... vous pouvez le faire, et dans de nombreuses situations, cela fonctionnera. J'écris du code pour tous les cas que je peux prévoir afin de ne pas avoir à le réparer continuellement quand il casse....

Si la taille de votre position est de 2.0 lots, divisée par deux, cela fait 1.0 lot et cela fonctionnera...

Si la taille de votre position est de 0,3 lot, ceci divisé par deux est 0,15 lot et ce sera une taille de position invalide si MODE_LOTSTEP est 0,1... vous pouvez utiliser 0,1 ou 0,2 PAS 0,15 donc vous devez coder cette vérification et cet ajustement.


Ce que vous avez ici ne fonctionnera pas dans tous les cas....

double Lots = OrderLots(); 
      

         
         half = Lots / 2; 
 

Ahhhh ! Je viens de passer les 15-20 dernières minutes à faire des impressions un peu partout - je commence à comprendre où je me trompe. Je suis en train de sélectionner l'ordre PENDING... CEPENDANT, parce que c'est un ordre en attente, au moment où je le sélectionne, il y a de fortes chances que les lots d'ordre, le stop et les cibles aient changé, donc je dois le mettre dans une boucle pour le synchroniser avec la façon dont mes ordres en attente sont constamment calculés avant qu'ils ne se déclenchent.

Ce satané doubletostr :P - Spot on RaptorUK ! Je peux maintenant voir que cela est calculé correctement, grâce à votre ajustement :)

Je pense que je sais comment faire la plupart des choses maintenant - Juste par curiosité, quelle instruction "if" fonctionnerait pour appeler SEULEMENT l'ordre qui a été déclenché. Pour le moment, je l'ai fait appeler lorsque j'ai un ordre au marché ouvert, mais j'essaie de comprendre comment appeler lorsque l'ordre en attente a été déclenché ?

Le code ci-dessous et l'instruction "if" correspondante semblent juste appeler les ordres en attente ouverts. Je veux juste un moyen d'accéder à une fonction personnalisée spécifique (void par exemple) lorsqu'un ordre a été déclenché ? (si cela a un sens !)

Merci d'avoir éclairci tant de choses pour moi :)

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
}         

if(OpenOrdersThisPair(Symbol())>0)
 
DomGilberto:

Ahhhh ! Je viens de passer les 15-20 dernières minutes à effacer des empreintes un peu partout - je commence à comprendre où je me trompe.

Facile quand on sait comment

DomGilberto:


Je pense que je sais comment faire la plupart des choses maintenant - Juste par curiosité, quelle instruction "si" fonctionnerait pour appeler UNIQUEMENT l'ordre qui a été déclenché. Pour l'instant, je l'ai fait appeler lorsque j'ai un ordre au marché ouvert, mais j'essaie de comprendre comment appeler lorsque l'ordre en attente a été déclenché ?

Quand un Pending Order a été déclenché, il devient un OP_BUY ou un OP_SELL, donc....

if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   { 
   
   }

Un conseil, utilisez plus d'espaces ... lorsque vous obtenez une erreur de division par zéro et que vous voulez trouver où cela se produit, il est facile de rechercher l'espace/espace et de trouver vos divisions au lieu de tous vos commentaires ... donc j'utilise des espaces autour de = + - / %, etc.

 
Ah bien sûr (facepalm !)

Bon conseil - je vais le faire ! Merci pour votre aide :) Je posterai un message si je réussis à le faire !
 
Ok, je suis de retour ! ... Pas de bonnes nouvelles cependant - j'ai essayé et testé de multiples variations de code sans succès. Voici où j'en suis actuellement.

Je ne reçois aucune information concernant les empreintes ? Absolument rien ne s'affiche dans le Journal. Je suppose que c'est parce que rien n'est sélectionné en ce qui concerne le type d'ordre dès la première instruction "if" ? D'après ce que je peux voir ici dans le code, j'aurais pensé que je ne suis pas loin du compte, du moins... ?
if(OrderType() == OP_BUY ){
   
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy)            
         
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
            Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
            }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
 
DomGilberto:
Ok, je suis de retour ! ... Les nouvelles ne sont pas très bonnes - j'ai essayé et testé de multiples variations de code sans succès. Voici où j'en suis actuellement.

Je ne reçois aucune information concernant les empreintes ? Absolument rien ne s'affiche dans le Journal. Je suppose que c'est parce que rien n'est sélectionné en ce qui concerne le type d'ordre dès la première instruction "if" ? D'après ce que je peux voir ici dans le code, j'aurais pensé que je ne suis pas loin du compte, du moins... ?

Comment sélectionnez-vous l'ordre avant de faire cela ?

if(OrderType() == OP_BUY ){

Vous avez toujours des problèmes ici

      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());  //  OrderSelect has failed,  why do you continue . . . 
            }
            if(OrderMagicNumber()==MagicNumber)                            //  . . . to this line ?
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy) 
 

Pourquoi pas...

for( int c = OrdersTotal()-1; c >= 0; c-- )
   {
   if( OrderSelect(c, SELECT_BY_TICKET, MODE_TRADES) )
      {
      Print("Order Ticker Number = ",OrderTicket());
      Print("Order Lots Open = ", OrderLots());
      } 
   else 
      {
      Print("Order Select returned the error of ", GetLastError()); 
      continue;                                                        // try next order position in the loop
      }
   if(OrderMagicNumber() == MagicNumber)    
      if(OrderSymbol() == Symbol())
         if(OrderType() == OP_BUY)
            if(OpenOrdersThisPair(Symbol()) == 1) 
 
Je ne peux pas croire que je fais ces erreurs de débutants... Ça m'énerve ! Oui, j'ai réussi à l'imprimer maintenant et à sélectionner l'ordre. C'est le code qui fonctionne en termes d'impression - les lots ne sont toujours pas fermés cependant ? J'ai également collé les messages du journal ci-dessous.
  if(OrderSelect(OrdersTotal(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1){
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
           Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
         }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else{
           Print("Order Select returned the error of ", GetLastError()); // Order Select does not seem to want to work?
            continue;
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0    // Not sure what is going on here?		
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000           // This is the right calculation based 
                                                                                                                      // upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931                // This price is also correct.


Raison: