Ayuda: Por qué el EA no cierra una operación - página 4

 

Vas a tener el problema de que nadie te responda si no usas el botón SRC para publicar tu código :D

 
crossy:

Hola amigos,


OrderT es el número de ticket del pedido,




Mi PROBLEMA es: El EA a veces cierra la operación muy bien, pero otras veces el EA cierra la tarde PERO sigue buscando el ticket para cerrarla, aunque ya estaba cerrada.

(Me sale el error: "Número de ticket desconocido.." .

Creo que tengo un error de lógica.

Gracias por su amable ayuda.

Y

Es muy, muy sencillo... .

Contesta a esta sencilla pregunta y tendrás la respuesta. . .

Usted pasa el número de TICKET a la función para que el ticket pueda ser cerrado... ¿por qué entonces hace un bucle a través de TODOS los otros pedidos? usted ya SABE el número de Ticket que necesita cerrar... ¿por qué el bucle?

 
...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      for ( int vvv = OrdersTotal()-1; vvv >= 0; vvv-- )
      {  
         if ( OrderSelect(vvv, SELECT_BY_POS, MODE_TRADES) )
         {   
            Check = false;
            if ( TREN == "LONG" )
              PRC = MarketInfo(SYMB,MODE_BID);
            else
            if ( TREN == "SHORT" )
               PRC = MarketInfo(SYMB,MODE_ASK);
         
            Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
            if ( Check )
               break;
         }      
      } 
   }
   return;
}
//-----------------------------------------------+

Espero que ahora esté más claro.

Gracias

 
RaptorUK:

Es muy, muy simple...

Responda a esta sencilla pregunta y tendrá la respuesta...

Usted pasa el número de TICKET a la Función para que el ticket pueda ser cerrado . . . por qué entonces hace un bucle a través de TODAS las otras órdenes ? usted ya SABE el número de Ticket que necesita cerrar . . . por qué el bucle ?


Gracias Raptor, lo hice una vez sin el ORDERSELECT, pero tenía el mismo error.

Y.

 
Ya di una pista en la primera página. https://www.mql5.com/en/forum/139543
 

Gracias onewithzachy, e hice lo que me sugeriste y me salió el error

de que no se encontró el TICKET..

 
crossy:

Hola amigos,


OrderT es el número de ticket del pedido,




Mi PROBLEMA es: El EA a veces cierra la operación muy bien, pero otras veces el EA cierra la tarde PERO sigue buscando el ticket para cerrarla, aunque ya estaba cerrada.

(Me sale el error: "Número de ticket desconocido.." .

Creo que tengo un error de lógica.

Gracias por su amable ayuda.

Y

Es muy, muy sencillo... .

Contesta a esta sencilla pregunta y tendrás la respuesta. . .

Usted pasa el número de TICKET a la función para que el ticket pueda ser cerrado... ¿por qué entonces hace un bucle a través de TODOS los otros pedidos? usted ya SABE el número de Ticket que necesita cerrar... ¿por qué el bucle?

 
onewithzachy:
Ya di una pista en la primera página. https://www.mql5.com/en/forum/139543
Y también di la respuesta... https://www. mql5.com/en/forum/139543
 
crossy:


Gracias Raptor, lo hice una vez sin el ORDERSELECT, pero tenía el mismo error.

No estás leyendo lo que he escrito y preguntado... ¿por qué el bucle? ¿cuál es la función del bucle en esta situación?
 
...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      Check = false;
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
   }
   return;
}
//-----------------------------------------------+

O.K. Aquí está la versión modificada, que me dio el mismo error.

Y.