Problemas de cierre, por favor, ayuda

 

Hola a todos
Espero que la sintaxis sea mejor que antes. Durante la última semana, he estado leyendo el Codersguru.

El programa de abajo, aunque no tiene ningún error, el compilador registrará sólo una orden. Pero mi código no lo cierra.
El programa dice --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), no he
insertado el stoploss o el takeprofit, como puedes ver. Razón, hay una condición de StopLoss ya codificada como tal ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Blue)
Así que no hay necesidad de insertar otro el StopLoss, ¿no? En cuanto a la TakeProfit
Voy a codificar que en cuando este otro problema se resuelve.
¿Es la forma en que codifiqué la condición de cierre, o hay problemas de nuevo con la sintaxis?
Gracias a todos por vuestra ayuda, y que mi problema ayude a otros,
Saludos

-----------------------------------------------------------------+
//|                                         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()
Debería facilitar la lectura de los bloques de código
 
if(OrderTicket() == OrderOpenPrice() - (ATR*2)) 
Elticket de pedido es un número entero muy grande (probablemente de miles de millones), la clave del pedido.
OOP - 2ATR es un precio.
Los dos NUNCA serán iguales
si quieres decir OrderClosePrice() == OOP-2ATR los números reales casi nunca serán iguales. usa en su lugar
 if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...

OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol() 
Tu orderSend no está estableciendo un número mágico
 
Ickyrus wrote >>
Debería facilitar la lectura de los bloques de código


Sí, tienes razón. Con cada intento e investigación, aprendo un poco más. Gracias por la limpieza. Recién en los últimos días pude poner los corchetes en los lugares adecuados. Cuanto más sencillo, mejor.
Saludos
 
WHRoeder wrote >>
El ticket del pedido es un número entero muy grande (probablemente de miles de millones), la clave del pedido.
OOP - 2ATR es un precio.
Los dos NUNCA serán iguales
si quieres decir OrderClosePrice() == OOP-2ATR los números reales casi nunca serán iguales. utiliza en su lugar:

Tu orderSend no está estableciendo un número mágico


Hola WHRoeder
Gracias por mirar y dar las sugerencias. Pero debo decir que no entendí el OOP -2ATR de inmediato.
OOP = OrderOpenPrice. Eso pasó por encima de mi cabeza al principio. Tu explicación es absolutamente correcta. Me quedé pillado con el signo ==. El OrderClosePrice() nunca podría ser igual a OrderOpenPrice() menos el (ATR*2). Gracias por captarlo.
A ver si entiendo tu sugerencia. Lo reexpresaré aquí. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Esto parece que se lee (voy a utilizar cifras arbitrarias aquí) OCP = 1,4361, OOP = 1,4321, ATR = 20. Así que la expresión se vería como
si (1,4321 - 1,4361 - (20*2) <= 0), lo siento, pero no lo entiendo.
Tal vez pueda utilizar las mismas cifras para reordenar la expresión, para mostrar lo que quería decir. Pero esto tampoco funcionó cuando las introduje en el programa.
El nuevo arreglo queda así

si (1,4361 >= 1,4321 + (20*2)).

Cuando el OCP >=OOP + ATR*2, el control pasa a:
OrderClose (OrderTicket(), OrderLots(), etc.

Su otra observación fue que el OrderSend no está estableciendo un número mágico.
Podría quitar esta parte del programa: && OrderMagicNumber == MagicNumber,
Gracias de nuevo, y si puedes ver otras mejoras, te lo agradecería.
Saludos
 

Hola Ais
Gracias por tu respuesta. Espero que te vaya bien.
La sugerencia fue insertada esta mañana. Lamento decir que al compilador no le gusta lo que he codificado. No estoy seguro de qué declaración en el programa es incorrecta. Las sugerencias creo que están bien. Voy a volver a publicar el programa y marcar el área que creo que puede ser el problema. También indicaré la estrategia de cierre.

La posición de venta se detendrá por encima del precio de apertura de la orden por Atr*2. Por ejemplo, OOP es 1.4321, Atr =20, y OCP = 1.4361.
Así que codifiqué la expresión como

if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // se cumple la condición, el control pasa a....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;

Nota: No hay StopLoss(), o TakeProfit() en la declaración OrderSend, si eso tiene alguna relevancia.

Gracias de nuevo por la ayuda de todos
Saludos
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); 
  }
}
 

Hola Huckleberry,
Voy a reestructurar ligeramente tu programa.
Adiós por ahora

 

¿Por qué hacer "order = OrderTicket(); " y no utilizar ese valor en la función orderclose()?
Aunque la posibilidad de que la orden seleccionada haya cambiado es pequeña, ¿no sería más seguro utilizar el valor de la orden positivamente identificado?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() será el ticket actualmente seleccionado - en esta etapa de mi aprendizaje
No puedo saber qué orderticket está seleccionado cuando se hace el OrderClose().

//// Editar
En realidad, no estoy seguro de que "order= OrderTicket()" sea el ticket que identificaste en la declaración If anterior.

 
Ais wrote >>

Hola Huckleberry,
Voy a reestructurar un poco tu programa.
Adiós por ahora


Muchas gracias. Estaré esperando su respuesta.
Saludos
 
Ickyrus wrote >>

¿Por qué hacer "order = OrderTicket(); " y no utilizar ese valor en la función orderclose()?
Aunque la posibilidad de que la orden seleccionada haya cambiado es pequeña, ¿no sería más seguro utilizar el valor de la orden positivamente identificado?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() será el ticket actualmente seleccionado - en esta etapa de mi aprendizaje
No puedo saber qué orderticket está seleccionado cuando se hace el OrderClose().

//// Editar
En realidad no estoy seguro de que "order= OrderTicket()" sea el ticket que has identificado en la declaración If anterior.


Hola Ickyrus
Gracias por tu observación y sugerencia. Tu tiempo es valioso.
Tu razonamiento tiene mucho sentido. No estoy más seguro que tú en lo que respecta al orden seleccionado. Probaré tu sugerencia.
Gracias de nuevo
Saludos