Problema de los pedidos múltiples - página 5

 
RaptorUK:

Lee los códigos de error de ejecución y haz que tu código cumpla con la información que allí se da, por ejemplo....

ERR_TRADE_TIMEOUT128Se ha alcanzado el tiempo de espera de la operación. Antes de reintentar(al menos, en el tiempo de 1 minuto), es necesario asegurarse de que la operación de trading no ha tenido realmente éxito (no se ha abierto una nueva posición, o la orden existente no se ha modificado o eliminado, o la posición existente no se ha cerrado)


Hola RaptorUK,

Gracias por la pista.

Otra cuestión (más una.....);

Digamos que en el Broker ECN una operación está abierta y según los "Requisitos y Limitaciones en la Realización de Operaciones" una orden de mercado no puede ser cerrada si el Stoploss está dentro de la distancia de congelación, en ese caso ¿esta función CloseAll cerrará incluso aquellas órdenes que están dentro de la distancia de congelación?

Saludos cordiales

Luis

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;   
        RefreshRates(); 

   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket>0)                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()-OrderClosePrice())>            
            MathAbs(OrderStopLoss()-OrderClosePrice()))              
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
                  GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 
 
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
}
 
luisneves:


Hola RaptorUK,

Gracias por la pista.

Otra cuestión (más uno.....);

Digamos que en el Broker ECN una operación está abierta y según los "Requisitos y Limitaciones en la Realización de Operaciones" una orden de mercado no puede ser cerrada si el Stoploss está dentro de la distancia de congelación, en ese caso ¿esta función CloseAll cerrará incluso aquellas órdenes que están dentro de la distancia de congelación?

No, fallará, probablemente el error 130
 

Hola RaptorUK,

Si es posible me gustaría pedirte ayuda en este tema;

Este trozo de código encuentra el último OrderLots() y lo multiplica por el factor multiplicador, pero algunas veces se pasa este factor y tengo órdenes de esta manera; 0,01, 196,83, 590,49, etc.

Hay que decir que tengo un límite de órdenes abiertas, en este caso 5. Ahora, la forma en que estoy viendo esta lógica, incluso si viene una condición para abrir una orden por encima de 5 no se abrirá y, a continuación, el número de órdenes en la piscina se limitan a 5 por lo que, si el código sólo ver 5 órdenes en la piscina el tamaño del lote para los pedidos debe ser; 0,01, 0,02, 0,04, 0,08, 0,16. ¿Hay algo malo en este código que yo no sepa?

(espero que la sangría esté bien...)

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
 if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
   {//12
 if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
   {//13
     LastLot = OrderLots();
   }//13              
     MLots = 0;                       
     MLots = LastLot * Multiplier;        
   }//12
 else MLots = LotSize;
   }//11 
 return(0);
 }//0 

Saludos cordiales

Luis

 
luisneves:

Hola RaptorUK,

Si es posible me gustaría pedirte ayuda en este tema;

Este trozo de código encuentra el último OrderLots() y lo multiplica por el factor multiplicador, pero algunas veces se pasa este factor y tengo órdenes de esta manera; 0,01, 196,83, 590,49, etc.

Hay que decir que tengo un límite de órdenes abiertas, en este caso 5. Ahora, la forma en que estoy viendo esta lógica, incluso si viene una condición para abrir una orden por encima de 5 no se abrirá y, a continuación, el número de órdenes en la piscina se limitan a 5 por lo que, si el código sólo ver 5 órdenes en la piscina el tamaño del lote para los pedidos debe ser; 0,01, 0,02, 0,04, 0,08, 0,16. ¿Hay algo malo en este código que yo no sepa?

(espero que la sangría esté bien...)

Lo hago así...

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         }//13              
      MLots = 0;                       
      MLots = LastLot * Multiplier;        
      }//12
   else MLots = LotSize;
   }//11 
return(0);
}//0 

si el OrderSelect() falla MLots = LotSize ?? por qué ? tu sangría no ayuda a ver lo que está pasando con tus declaraciones if y llaves . . ¿quieres hacer esto?

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         MLots = 0;                       
         MLots = LastLot * Multiplier; 
         }//13              
      }//12
   }//11 
if(MLots < 0.001) MLots = LotSize;  //  if MLots == 0.0
return(0);
}//0 

Hice esto...

if(MLots < 0.001)

. como un método rápido y sucio para evitar problemas de doble comparación, ¿has leído esto?¿Puede precio != precio?

 
RaptorUK:

si el OrderSelect() falla MLots = LotSize ?? por qué ? tu sangría no ayuda a ver lo que pasa con tus declaraciones if y llaves . . ¿quieres hacer esto?

Hice esto...

. como un método rápido y sucio para evitar los problemas de doble comparación, ¿ha leído esto?¿Puede precio != precio?


Hola RaptorUk,

Gracias por su pronta respuesta.

Entonces, supongo que es mejor no hacer uso de otra cosa porque eso está ahí para nada. Y gracias por el enlace proporcionado.

Saludos cordiales

Luis

 

Hola RaptorUK,

Tengo un problema (más uno.....)

Algunas órdenes se cierran antes de tiempo, lo que quiero decir es;

Estas órdenes han estado abiertas y hay un límite para abrir hasta 6. Todas las órdenes deberían cerrarse por medio del TrailingStop, pero las órdenes 1. 3 y 5 se han cerrado antes que las otras que se han cerrado después (07:43).

Debido a que estas 3 órdenes se han cerrado antes que las otras, se da espacio a las órdenes abiertas 7, 8 y 9 y estas se abren con un lote basado en el último lote (2.43).

Así que, por lo que entendí, los cierres erráticos de las órdenes a las 07:23 no deberían haber ocurrido y no se han encontrado errores...

1 - 49518192013.01.28 19:51vender0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04comprar0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12vender0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20comprar0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27vender0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48comprar2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23vender7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40comprar21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40vender65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

El código para cerrar todas esas órdenes mediante TrailingStop es este;

¿Podría fallar este código y cerrar las órdenes en diferentes momentos?

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;
        
   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket > 0 )                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()- OrderClosePrice())>            
            MathAbs(OrderStopLoss()- OrderClosePrice()))             
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 

Saludos cordiales

Luis

 
luisneves:


El código para cerrarlas todas por medio de TrailingStop es este;

¿Podría fallar este código y cerrar las órdenes en diferentes momentos?

OK, esto no tiene sentido... un trailing SL se establece de manera que si el precio va con una Orden el SL se mueve hacia el precio por lo que si el nuevo SL es golpeado habrá menos pérdida o incluso un beneficio. ¿Por qué tener un SL de arrastre si vas a cerrar la operación de todos modos? Para mí eso no es un SL de arrastre, no es un SL de ningún tipo, ya que estás cerrando activamente la operación a través del EA, no del SL.

Tal vez sufunción CloseAllOnSL() hace algo diferente de lo que creo que hace, pero, sin embargo, no tiene comentarios que explican lo que su código está tratando de hacer. No hay trailing Sl como no hay OrderModify().

 

Lee esto:¿Qué son los valores de retorno de las funciones? Cómo los utilizo?

if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 {
                 GLError = GetLastError();

                 //  ? ? ? ? ?  why aren't you printing the information about the OrderClose() failure ? ? 
                 Print("OrderClose failed, error# ", GLError);  //<-----  like this  but more info
                 } 
              }//32 

añada más información a la sentencia Print, añada OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc cualquier información que necesite para determinar cuál era el problema cuando se produjo el error, yo no puedo volver fácilmente en el tiempo y averiguar todo esto, así que cuando ocurra imprímalo en el registro.

 
luisneves:


Así que, por lo que he entendido, los cierres erráticos de las órdenes a las 07:23 no deberían haber ocurrido y no se han encontrado errores...

1 - 49518192013.01.28 19:51vender0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04comprar0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12vender0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20comprar0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27vender0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48comprar2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23vender7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40comprar21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40vender65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Muestre la salida del registro cuando esto ocurrió. . .
 
RaptorUK:

Lee esto:¿Qué son los valores de retorno de las funciones? Cómo los utilizo?

añada más información a la sentencia Print, añada OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc cualquier información que necesite para determinar cuál era el problema cuando se produjo el error, yo no puedo volver fácilmente en el tiempo y averiguar todo esto, así que cuando ocurra imprímalo en el registro.


Hola RaptorUk,

Gracias por su tiempo.

El código para TrailingStop está en otra parte, el código enviado es sólo para cerrar todo una vez que la orden ha sido cerrada por medio de TrailingStop.

No obstante, sigo tu consejo y busco algún error que pueda dar más información de por qué las órdenes se cierran antes que otras.

Por cierto, en el siguiente código tiene sentido cambiar la posición de MLots = 0; desde el lugar actual hasta antes del bucle for?

   MLots = 0; <-----------------------------------------------------------------to here 
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
      {//11
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {//12
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//13
            LastLot = OrderLots();
            }//13            
         MLots = 0;  <-----------------------------------------------------------from here                      
         MLots = LastLot * Multiplier;        
         }//12      
      }//11 
   return(0);
   }//0 

Un saludo

Luis