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

 
crossy:

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

Y.

 

Hagámoslo de nuevo parte 2 :(

 ...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         // Do the selection and OrderClose() INSIDE HERE ..., please
         
         
         /*
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
         */
      }   
      //if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... ) // this selection goes up there
    
         //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); // close it up there, and you have to rewrite the parameters
   }
   */
 

Haz esto... ( repetido desde aquí: https://www.mql5.com/en/forum/139543 )

if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
   {
   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 . . 
   } 

. . y no necesitas la Función en absoluto.

 
onewithzachy:

Hagámoslo de nuevo parte 2 :(


Quiero que me exuss, por favor, ya que tengo un día de fiesta, Así que voy a estar de vuelta el domingo nigth.

Haré lo que me habéis sugerido y espero tener éxito.

Gracias a los dos.

Y.

 
crossy:


Quiero que me exuss, por favor, ya que tengo un día de fiesta, Así que voy a estar de vuelta el domingo nigth.


OK, disfruta de tus vacaciones :-)
 
crossy:


Quiero que me den su apoyo, por favor, ya que tengo vacaciones, así que volveré el domingo por la noche.

Haré lo que habéis sugerido y espero tener éxito.

Gracias a los dos.

Y.

Que lo paséis bien :D

Yo tengo que ver la F1 de Mónaco este domingo :D

 
onewithzachy:

Que lo pasen bien :D

Yo tengo que ver la F1 de Mónaco este domingo :D

Y mañana, la FP3 y la clasificación ;-)
 
crossy:


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.

Esto me parece mucho más sencillo y me funciona:

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

void CheckForClose()
{
int, res, order_id;

//-------+
for(i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA | OrderSymbol()!=Symbol()) continue;
order_id= OrderTicket();


//---trabajo y cierre
si (OrderType() == OP_BUY)
{
if (Is_Close_Buy==true) //-- la señal de cierre
{
RefreshRates();//Refrescar tarifas
res= 0;
res= OrderClose(order_id,Lots,Bid,3,Gold);
while(IsTradeAllowed() == false) Sleep(100); //--espera un poco para obtener respuesta del servidor
si (res>0){
PlaySound("cash_register.wav");} ¡¡¡¡//--sonido de felicidad, ganando dinero con suerte !!!!
si (res<0)
{
PlaySound("creak.wav");
Print("OrderSend failed with error #",GetLastError());
return(0);
}
return;
}
}//terminar la comprobación de la orden de compra
//---
if (OrderType() = OP_SELL)
{
if (Is_Close_Sell==true) //--la señal de cierre
{
RefreshRates();//Refresca las tarifas
res= 0;
res= OrderClose(order_id,Lots,Ask,3,Gold);
while(IsTradeAllowed() == false) Sleep(100); //--espera un poco para obtener respuesta del servidor
si (res>0){
PlaySound("cash_register.wav");}
if(res<0)
{
PlaySound("creak.wav");
Print("OrderSend failed with error #",GetLastError());
return(0);
}
return;
}
}//terminar la comprobación de la orden de venta
}//--------+
return;
}

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

 
RaptorUK:
Y mañana, FP3 y Calificación ;-)

@ RaptorUK, estoy considerando usar el casco de protección para que al menos pueda pensar con bastante antelación de lo que estoy ahora. ¿No es eso lo que hacen los conductores, pensar con antelación? :D


@ skaboy, te lo pido educadamente, si no te importa, podrías usar el botón SRC para publicar tu código. Ya lo hemos pedido demasiadas veces sólo en este hilo.


@ crossy, Ya ha pasado casi una semana desde tu primer post. Seguramente entiendo que no tengas la cabeza despejada ahora tratando con 4000 líneas, ahora mismo yo mismo tengo la mía aquí también. Si todavía no lo entiendes, - ehm - puedes pedirnos que escribamos ese código de Close por ti. Sin embargo todavía tienes que escribir el código aunque sea un poco - y mostrarnos. :D, el código de RaptorUK justo arriba es más directo que el mío, piénsalo y luego puedes seguir con tu EA.

Con la forma en que escribes el código aquí -demasiado código repetido innecesario- deberías tener un poco de preocupación con tus 4000 líneas de código que puede ralentizar tu EA y hace que tu EA pierda un tick. Está bien perder un par de puntos, sin embargo, ¿qué pasa si se pierde como 10 pips de distancia ? y probablemente sus 4000 líneas todavía puede ser reducido a sólo 400 líneas. ¿Quién sabe?, tu EA, se vuelve más ligero y rápido. :D

 
skaboy:

Esto me parece mucho más sencillo y me funciona:


No funciona si tienes varios pedidos por cerrar... lee esto y aprende: Bucles y Cierre o Eliminación de Órdenes