Problèmes de fermeture, aidez-nous

 

Bonjour à tous
J'espère que la syntaxe est meilleure qu'avant. Depuis une semaine, je lis le Codersguru.

Le programme ci-dessous, bien que n'ayant pas d'erreurs, le compilateur n'enregistre qu'une seule commande. Mais mon code ne la fermera pas.
Le programme dit --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), je n'ai pas inséré le stoploss ni le stoploss dans l'ordre.
pas inséré le stoploss ou le takeprofit, comme vous pouvez le voir. Raison pour laquelle, il y a une condition StopLoss déjà codée comme telle ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Blue)
Il n'est donc pas nécessaire d'insérer un autre StopLoss, non ? En ce qui concerne le TakeProfit
Je le coderai lorsque cet autre problème sera résolu.
Est-ce la façon dont j'ai codé la condition de clôture, ou y a-t-il encore des problèmes de syntaxe ?
Merci à tous pour votre aide, et puisse mon problème en aider d'autres,
Cheers

-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
  {                                                               
    if (OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
&&  OrderMagicNumber()  == MagicNumber                          // with my MN    
&&  OrderSymbol()       == Symbol())                            // with my symbol
  {                                                                                                                                                    
    if(OrderType() == OP_SELL)
    order = OrderTicket(); 
                       
    if(OrderTicket() == OrderOpenPrice() + (ATR*2))     // ATR*2 above Sell. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),3,Blue);   
      Print("Sell order closed with Hard Stop"); 
     }     
  else
  {
      Print("Error closing Sell Hard Stop", GetLastError()); 
   }   
//---------- Closeing Buy -------------
           
    if(OrderType() == OP_BUY) 
    order = OrderTicket(); 
    
    if(OrderTicket() == OrderOpenPrice() - (ATR*2))     // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),3,Red); 
      Print("Buy order closed with Hard Stop");
     }     
  else 
  {
      Print("Error closing Buy Hard Stop", GetLastError());                                      
      return(0); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if(OrdersTotal() < 1)                                        // Checking for any working orders
   {                                   
     if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
     if(ticket>0)
   { 
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
      Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
    }
  else
      Print ("Error Opening Buy Order :" , GetLastError()); 
      return(0);                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
  if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                               //with no working orders
    {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
   if(ticket>0)
     {     
       if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
     }
    else
       Print ("Error Opening Sell Order :" ,GetLastError());
       return(0);
     }  
    return(0); 
  }
}
 
-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
       {                                                               
        if (
           OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol()                     // with my symbol
           )                     
           {                                                                                                                                                    
            if(OrderType() == OP_SELL) order = OrderTicket(); 
                       
            if(OrderTicket() == OrderOpenPrice() + (ATR*2))     // ATR*2 above Sell. Hard Stop
              {
               OrderClose(OrderTicket(),OrderLots(),3,Blue);   
               Print("Sell order closed with Hard Stop"); 
              }     
              else
              {
               Print("Error closing Sell Hard Stop", GetLastError()); 
              } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2))
                                 
                                                              //---------- Closeing Buy -------------
                     
              if(OrderType() == OP_BUY) order = OrderTicket(); 
               
              if(OrderTicket() == OrderOpenPrice() - (ATR*2))     // ATR*2 below Buy. Hard Stop
                {
                 OrderClose(OrderTicket(),OrderLots(),3,Red); 
                 Print("Buy order closed with Hard Stop");
                }     
                else 
                {
                 Print("Error closing Buy Hard Stop", GetLastError());                                      
                 return(0); 
                }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2))                                              
           }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc
       }// END for loop               
                     
                             
                                        //------------ Opening Buy -----------------
                       
    if(OrdersTotal() < 1)                                        // Checking for any working orders
      {                                   
       if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
        {                                                                                     
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
         if(ticket>0)
           { 
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
           }
           else
           Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0)
             
         return(0);                                                  
        }//ENDif (Ask > High[iHighest(NU... etc  
                                                      
                                                             //--------------- Opening Sell ----------------
                                                                         
       if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                                    //with no working orders
          {   
           ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
           if(ticket>0)
             {     
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
             }//ENDif (ticket>0)
             else
             Print ("Error Opening Sell Order :" ,GetLastError()); 
             //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                 
           return(0);
          }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])  
       return(0); 
      }//ENDif  (OrdersTotal() < 1)
}//ENDint start()
Les blocs de code devraient être plus faciles à lire
 
if(OrderTicket() == OrderOpenPrice() - (ATR*2)) 
Leticket de commande est un très grand nombre entier (probablement des milliards), la clé de la commande.
OOP - 2ATR est un prix.
Les deux ne seront JAMAIS égaux
si vous vouliez dire OrderClosePrice() == OOP-2ATR les nombres réels ne seront presque jamais égaux. utilisez plutôt :
 if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...

OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol() 
Votre orderSend ne fixe pas un nombre magique.
 
Ickyrus wrote >>
Cela devrait rendre vos blocs de code plus faciles à lire


Oui, vous avez raison. Avec chaque tentative et enquête, j'apprends un peu plus. Merci d'avoir fait le ménage. C'est seulement ces derniers jours que j'ai pu mettre les accolades aux bons endroits. Plus c'est simple, mieux c'est.
A la vôtre
 
WHRoeder wrote >>
Le ticket de commande est un très grand nombre entier (probablement des milliards), la clé de la commande.
OOP - 2ATR est un prix.
Les deux ne seront JAMAIS égaux
si vous vouliez dire OrderClosePrice() == OOP-2ATR les nombres réels ne seront presque jamais égaux. utilisez plutôt :

Votre orderSend ne fixe pas un nombre magique.


Bonjour WHRoeder
Merci d'avoir regardé et donné les suggestions. Mais je dois dire que je n'ai pas compris tout de suite l'OOP -2ATR.
OOP = OrderOpenPrice. Cela m'est passé au-dessus de la tête au début. Votre explication est tout à fait correcte. J'étais bloqué par le signe ==. L'OrderClosePrice() pourrait ne jamais être égal à l'OrderOpenPrice() moins le (ATR*2). Merci de l'avoir remarqué.
Laissez-moi voir si je comprends votre suggestion. Je vais la reformuler ici. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
On dirait que cela donne (je vais utiliser des chiffres arbitraires ici) OCP = 1.4361, OOP = 1.4321, ATR = 20. Donc l'expression ressemblerait à :
si (1.4321 - 1.4361 - (20*2) <= 0), je suis désolé, mais je ne comprends pas.
Je peux peut-être utiliser les mêmes chiffres pour réarranger l'expression, afin de montrer ce que je voulais dire. Mais cela n'a pas fonctionné non plus lorsque je les ai introduits dans le programme.
Le nouvel arrangement ressemble à ceci.

si (1.4361 >= 1.4321 + (20*2)).

Lorsque l'OCP >=OOP + ATR*2, le contrôle passe à :
OrderClose (OrderTicket(), OrderLots(), etc.

Votre autre observation était que l'OrderSend ne fixe pas un nombre magique.
Pourrais-je simplement retirer cette partie du programme : && OrderMagicNumber == MagicNumber,
Merci encore, et si vous voyez d'autres améliorations, je vous en serais reconnaissant.
Merci encore. Si vous voyez d'autres améliorations, je vous en serais reconnaissant.
 

Bonjour Ais
Merci pour votre réponse. J'espère que vous vous portez bien.
La suggestion a été insérée ce matin. Désolé de dire que le compilateur n'aime pas ce que j'ai codé. Je ne suis pas sûr de l'instruction du programme qui est incorrecte. Je pense que les suggestions sont correctes. Je vais réafficher le programme et signaler la zone qui, selon moi, pose problème. Je vais également indiquer la stratégie de fermeture.

La position de vente sera arrêtée au-dessus du prix d'ouverture de l'ordre par Atr*2. Par exemple, OOP est 1.4321, Atr =20, et OCP = 1.4361.
J'ai donc codé l'expression comme suit

if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // la condition est remplie, le contrôle passe à....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;

Note : Il n'y a pas de StopLoss(), ni de TakeProfit() dans l'instruction OrderSend, si cela a une quelconque importance.

Merci encore pour l'aide de tous.
Salutations
double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
  {                                                               
    if (OrderSelect(index, SELECT_BY_TICKET)                  // existing orders
//&&  OrderMagicNumber()  == MagicNumber                      // with my MN    
&&  OrderSymbol()       == Symbol())                          // with my symbol
  {                                                                                                                                                    
    if(OrderType() == OP_SELL) order = OrderTicket(); 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                       
    if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met,
                                                        // control then passes to...
  {                                                     
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      Print("Sell order closed with Hard Stop"); 
     }     
  else
  {
      Print("Error closing Sell Hard Stop", GetLastError()); 
   }   
//---------- Closeing Buy -------------
           
    if(OrderType() == OP_BUY)  order = OrderTicket(); 
    
    if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2))        // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); 
      Print("Buy order closed with Hard Stop");
     }     
  else 
  {
      Print("Error closing Buy Hard Stop", GetLastError());                                      
      return(0); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if(OrdersTotal() < 1)                                        // Checking for any working orders
   {                                   
     if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
     if(ticket>0)
   { 
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
      Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
    }
  else
      Print ("Error Opening Buy Order :" , GetLastError()); 
      return(0);                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
  if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                               //with no working orders
    {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
   if(ticket>0)
     {     
       if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
     }
    else
       Print ("Error Opening Sell Order :" ,GetLastError());
       return(0);
     }  
    return(0); 
  }
}
 

Bonjour Huckleberry,
Je vais légèrement remanier votre programme.
Au revoir pour le moment

 

Pourquoi faire "order = OrderTicket() ;" et ne pas utiliser cette valeur dans la fonction orderclose() ?
Même s'il est peu probable que l'ordre sélectionné ait changé, ne serait-il pas plus sûr d'utiliser la valeur de l'ordre identifié positivement ?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue) ;
OrderTicket() sera le ticket actuellement sélectionné - à ce stade de mon apprentissage
Je ne peux pas dire quel ticket de commande est sélectionné lorsque vous effectuez la commande OrderClose().

//// Modifier
En fait, je ne suis pas sûr que "order= OrderTicket()" soit le ticket que vous avez identifié dans la déclaration If précédente.

 
Ais wrote >>

Bonjour Huckleberry,
Je vais légèrement remanier votre programme.
Au revoir pour le moment


Merci beaucoup. J'attends votre réponse.
Au revoir
 
Ickyrus wrote >>

Pourquoi faire "order = OrderTicket() ;" et ne pas utiliser cette valeur dans la fonction orderclose() ?
Même s'il est peu probable que l'ordre sélectionné ait changé, ne serait-il pas plus sûr d'utiliser la valeur de l'ordre identifié positivement ?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue) ;
OrderTicket() sera le ticket actuellement sélectionné - à ce stade de mon apprentissage
Je ne peux pas dire quel ticket de commande est sélectionné lorsque vous effectuez la commande OrderClose().

//// Modifier
En fait, je ne suis pas sûr que "order= OrderTicket()" soit le ticket que vous avez identifié dans la déclaration If précédente.


Bonjour Ickyrus
Merci pour votre observation et votre suggestion. Votre temps est précieux.
Votre raisonnement est parfaitement logique. Je ne suis pas plus sûr que vous en ce qui concerne l'ordre de sélection. Je vais faire un essai avec votre suggestion.
Merci encore
Au revoir