Ayuda: Por qué el EA no cierra una operación

 

Hola amigos,

Necesito su ayuda.

Construí un EA que parte de su proceso tiene que cerrar una operación usando una función. Aquí están las filas de kod's relevantes.

¿Pueden ayudarme por qué el EA no cierra la operación? Gracias.

(Quizás, ya que mientras uso ORDERSELECT en la parte principal, no puede usar ORDERSELECT en la función, también????)

for(int cnt=0; cnt < OrdersTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol() == Pair && OrderType() == OP_BUY )

{

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

{

CLOSE_Single_P(Par, "LONG", OrderTicket(), OrderLots());

}

}

}

...

...

...

//-----------------------------------------------+

void CLOSE_Single_P(cadena SYMB, cadena TREN, int TICKET, double LOTT)

{

int Código, sig;

doble PRC;

if ( TREN == "LONG" )

Code = 0;//OP_BUY

si no

si ( TREN == "SHORT" )

Code = 1;//OP_SELL

for ( int k=0; k < OrdersTotal(); k++ )

{

OrderSelect(k, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol() == SYMB && OrderType() == Code && OrderLots() == LOTT && OrderTicket() == TICKET )

{

si ( OrderType() == OP_BUY )

PRC = MarketInfo(OrderSymbol(),MODE_BID);

si no

si ( OrderType() == OP_SELL )

PRC = MarketInfo(OrderSymbol(),MODE_ASK);

OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);

romper;

}

}

return;

}

 

Utilice el botón SRC para mostrar su código para una mejor lectura, por favor :)

Tu OrderSelect() está codificado de forma incorrecta. Compara tu código con este. Luego escribe si sigues teniendo el problema o no :)

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true &&
          OrderSymbol()==Pair && 
          OrderType()==OP_BUY)
          {
          // code to close
          }
      }
 
crossy:

Hola amigos,

Necesito su ayuda.

Construí un EA que parte de su proceso tiene que cerrar una operación usando una función. Aquí están las filas de kod's relevantes.

¿Pueden ayudarme por qué el EA no cierra la operación? Gracias.

Cuando tienes un bucle y estás cerrando o borrando órdenes (pendientes) DEBES contar hacia abajo y NO hacia arriba....

¿Por qué tienes un bucle en la función Close_Single_P? ¿no está diseñada para cerrar una sola orden? cuando llamas a la función pasas el símbolo, el número de ticket, el tipo de orden y el tamaño de la posición... eso es todo lo que necesitas para cerrar la orden... bueno casi, necesitas el precio de cierre y para eso puedes usar OrderClosePrice() y entonces no tienes que preocuparte si es una Compra o una Venta... de hecho, simplemente deshazte de la función y usa esta línea en lugar de la llamada a la función...

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow);

. . por cierto, ¿dónde está configurando el deslizamiento? y ¿está compensando a los corredores de 4/5 dígitos?

Cuando se utilizan funciones de órdenes, éstas devuelven un valor... este valor de retorno le indica si la función ha funcionado o no... aprenda a utilizar este valor de retorno y si le indica que ha habido un problema, utilice una sentencia Print para reportar la información relevante a los registros... entonces sabrá lo que ha ido mal en lugar de adivinar...

¿Debe cerrarse el pedido? ¿Ha verificado que esto...?

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

. . . es cierto ?

¿Por qué no añadir una sentencia de impresión que se ejecute si esa línea es verdadera . . . entonces sabrá si es o no es . . .

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )
   {
   Print("Trying to close Order: ", OrderTicket());                             // <---- tells you that the   if  returned true
   if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)
      Print("OrderClose failed, error # ", GetLastError());                          // <------- reports the error if the OrderClose failed . . 
   }
 
onewithzachy:

Utiliza el botón SRC para mostrar tu código para una mejor lectura, por favor :)

¿Cuál es el retorno de GetLastError() entonces?


El código tiene unas 4.000 líneas...

De todas formas, no me da ningún masaje de error.

 
crossy:


El código tiene unas 4.000 líneas...

De todos modos, no me da ningún masaje de error.

No tienes que publicar TODO tu código . . pero cuando publiques CUALQUIER código por favor usa el botón SRC.

No obtienes ningún mensaje de error porque no lo reportas al log . . debes comprobar los valores de retorno y reportar los errores.

 
RaptorUK:

Cuando tienes un bucle y estás cerrando o borrando órdenes (Pendientes) DEBES contar hacia abajo y NO hacia arriba....

¿Por qué tienes un bucle en la función Close_Single_P? ¿No está diseñada para cerrar una sola orden? Cuando llamas a la función pasas el símbolo, el número de ticket, el tipo de orden y el tamaño de la posición... eso es todo lo que necesitas para cerrar la orden... bueno, casi, necesitas el precio de cierre y para eso puedes usar OrderClosePrice() y entonces no tienes que preocuparte si es una compra o una venta... de hecho, simplemente deshazte de la función y usa esta línea en lugar de la llamada a la función...

. . por cierto, ¿dónde está configurando el deslizamiento? y ¿está compensando a los corredores de 4/5 dígitos?

Cuando se utilizan funciones de órdenes, éstas devuelven un valor... este valor de retorno le indica si la función ha funcionado o no... aprenda a utilizar este valor de retorno y si le indica que ha habido un problema, utilice una sentencia Print para reportar la información relevante a los registros... entonces sabrá lo que ha ido mal en lugar de adivinar...

¿Debe cerrarse el pedido? ¿ha verificado que esto...?

. ¿Es cierto?

¿Por qué no añadir una sentencia de impresión que se ejecute si esa línea es verdadera?


Gracias Raptor por tus sabias ofertas. SIEMPRE, me ayudas de forma inteligente y clara.

Probaré lo que me has sugerido.

Un saludo.

 

Ya tiene el billete seleccionado, ¿por qué pasar por un segundo bucle orderSelect para encontrar el mismo billete?

¿Por qué no comprueba el valor de retorno de OrderClose e imprime el error para saber por qué?

 
WHRoeder:

Ya tiene el billete seleccionado, ¿por qué pasar por un segundo bucle orderSelect para encontrar el mismo billete?

¿Por qué no compruebas el valor de retorno de OrderClose e imprimes el error para averiguar el PORQUÉ?


Bueno amigos, Gracias por sus esfuerzos.

Hice algunos cambios y nada fue útil, hasta que vi el comentario de WHRoeder.

Eres genial, creo que tienes razón.

Probaré el EA modificado el lunes.

Que tengas un buen fin de semana.

 
crossy:


Bueno amigos, Gracias por sus esfuerzos.

Hice algunos cambios y nada fue útil, hasta que vi el comentario de WHRoeder.

Eres genial, creo que tienes razón.

Probaré el EA modificado el lunes.

Que tengas un buen fin de semana.


Bueno, mis amigos,

Hice todas sus sugerencias - y el EA falló.

¿Alguna otra idea?

 

Hagámoslo de nuevo

  #include "..\libraries\stdlib.mq4" // drag and drop from libraries to very top of your code
  
  for(int cnt = OrdersTotal(); cnt >= 0; cnt--)  // from RaptorUK, count it down to zero 
     {
     if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Pair) // this is how to write OrderSelect()
        {
        if(OrderType()== OP_BUY) // the code below is to close buy position only
          {
          
          //---
           if(MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) * factor * TP) // from RaptorUK, is this statemement true ?
             {
              //CLOSE_Single_P(Pair,"LONG",OrderTicket(),OrderLots()) // From RaptorUK & WHRoeder, you don't have to do OrderSelect() twice
             Print("Trying to close buy position : ", OrderTicket());                            
             if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)) // From Raptor UK, are you doing the slippage correctly ?
                Print("failed to close buy position ", ErrorDescription(GetLastError())  ); 
             }
             else
             {
             Print ("Not qualify to close buy position ", OrderTicket()); // from RaptorUK, is this statemement true ?, if not this print will tell you
             }
          //---
             
           }
           /*
           else
           {
           if (OrderType() == OP_SELL)
              {
              
              }
           }
           */
        }
     }
      

Mientras sigo leyendo el segundo podio de Valentino Rossi en Le Mans, espero escribir esto correctamente :)

 
onewithzachy:

Hagámoslo de nuevo

Mientras sigo leyendo el segundo podio de Valentino Rossi en Le Mans, espero escribir esto correctamente :)


Gracias onewithzachy,

Primero creo que tienes un pequeño error con

for(int cnt = OrdersTotal() -1 ; cnt >= 0; cnt--)

Tienes que añadir la corrección en verde y en negrita.

Pero, no entiendo en qué nos puede ayudar la siguiente línea

#include "..\Nbibliotecas\Nstdlib.mq4"

Gracias, Y.

Razón de la queja: