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

 
luisneves:

Hola Kronin,

Su modificación está funcionando. Has limitado las órdenes máximas, pero ¿es posible cerrarlas todas?

He intentado hacerlo con el siguiente código, pero parece que no funciona.

Saludos cordiales

Luis

Hmmm, no estoy seguro de entender lo que quieres decir...
¿Te refieres a que en lugar de abrir la última orden (la orden 7 si MaxOrders está establecido en 7) cerrar todas las órdenes?

Estoy bastante seguro de que no quieres esperar hasta que se alcance el MaxOrders y luego cerrar todos inmediatamente. La última orden la mayoría de las veces (o todas las veces) terminaría con una pérdida.
Por cierto, ¿has visto el PM sobre el controlador de spreads?

 
kronin:

Hmmm, no estoy seguro de entender lo que quieres decir...
¿Te refieres a que en lugar de abrir la última orden (la orden 7 si MaxOrders está establecido en 7) cerrar todas las órdenes?

Estoy bastante seguro de que no quieres esperar hasta que se alcance el MaxOrders y luego cerrar todos inmediatamente. La última orden la mayoría de las veces (o todas las veces) terminaría con una pérdida.
Por cierto, ¿has visto el PM sobre el controlador de spreads?


Hola Kronin,

Gracias por su pronta respuesta.

Digamos que después de un ciclo de ping pong de n órdenes (MaxOrders) se deberían cerrar todas las órdenes abiertas, sé que podría no tener sentido, pero aun así.

Estoy tratando de incluir código para reingresar la orden en caso de que falle y tengo dudas si eso tiene sentido porque ya existe el código de IsContextBusy () Sleep (10). Por lo que entiendo, el significado es "si el servidor está ocupado u otro EA de la plataforma está intentando comunicarse, entonces espera 10 milisegundos y vuelve a intentarlo". Así que supongo que el EA mantendrá este comportamiento hasta que se reciba un ticket, ¿estoy en lo cierto?

En cuanto al tema del PM, en ese caso mejor no hacer uso del Test en fin de semana o hacerlo con la plataforma offline....

He insertado la línea 5, pero creo que no es necesario porque en la línea 1 ya lo has hecho, ¿estoy en lo cierto?

int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber); //1 
   if(LastClosedTicket>0)
    {                                                                 
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))
      {
      if(OrderSymbol()== Symbol() && OrderMagicNumber()== MagicNumber) //5           
       {            
         if(OrderType()==OP_BUY)
         {
         BuyAllowed=false;SellAllowed=true;
         } 
         else                   
         {
         BuyAllowed=true;SellAllowed=false;
         } 
        }   
      }
    }             
  return(0);   
  }
 
  //+---------------------------------------------------------------------------+

Otra cuestión,

En el siguiente trozo de código las líneas en negrita donde está sym y mn no hay que sustituirlas por Symbol() y MagicNumber?

GetTicketFromHistory

int GetTicketFromHistory(string sym,int mn,int orderposinhistory=0)// <------------------------Should replace sym and mn with Symbol () and MagicNumber ?
 {
   bool debug=false;
   if(debug)Print("Orders in history: ", OrdersHistoryTotal());
   int ticket,count=1,i;
   datetime orderclosedates[];
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(debug)Print("OrderSymbol: ",OrderSymbol(),"; OrderMagicNumber: ",OrderMagicNumber(),
                     " ;OrderType: ",OrderType(),"; OrderTicket: ",OrderTicket(),
                     "; OrderCloseTime: ",TimeToStr(OrderCloseTime()),";"); 
      if((OrderMagicNumber()  ==mn) // <---------------------------------------------------------Should replace  mn with  MagicNumber ?
         &&(OrderSymbol()     ==sym)// <---------------------------------------------------------Should replace sym with Symbol () ?
         &&(OrderType()==OP_BUY||OrderType()==OP_SELL))
         {                       
         ArrayResize(orderclosedates,count);
         orderclosedates[count-1]=OrderCloseTime();
         count++;

Aquí, en el siguiente código he insertado los filtros según tu consejo;

(//Phil:

//Comprobar la cantidad total de órdenes. Yo añadiría un filtro para mercado, magia y símbolo...//<----------- No estoy seguro de lo que quieres decir con filtro de mercado..... (Phil: órdenes de mercado, no órdenes pendientes)

//.... pero me da pereza ahora..... es algo que tienes que hacer tú.

¿Es eso correcto?

int start()
 {//0 
                                         
  OTLastTick = OTCurrentTick;                      
  OTCurrentTick = OrdersTotal();
     if(OrderSymbol() == Symbol()           //<--------filter for symbol and magic number, but for market (suppose market orders can't understand how....)
      && OrderMagicNumber() == MagicNumber) //<-|
     if(OTCurrentTick == 0 && OTLastTick > 0)
      {
      BuyTrigger = Ask + OpenDistance * pt;
      SellTrigger = Bid - OpenDistance * pt;
      }             
     if(OTCurrentTick >0 )Trail();                   
     if(OTLastTick >= 2                     //<------could you comment the meaning of this line ?                            
     &&OTCurrentTick < OTLastTick
     && OTCurrentTick > 0)
     {
      CloseAllOnSL();return;
     }      
     if(OTCurrentTick >= MaxOrders)return;                                                            
     if(OTCurrentTick > 0)OpenOppositeOrder();                        
     if(OTCurrentTick == 0)
     {
      BuyAllowed = true;
      SellAllowed = true;


Saludos cordiales

Luis

 

No comento el uso de las funciones. RaptorUK ya lo hizo unos cuantos posts antes. Lee de nuevo y entiende por qué no necesitas cambiar nada en el código dado. Mejor aún, entiende por qué puedes usarlo tal cual en otros EAs.

OrdersTotal() devuelve una cantidad de órdenes. Probablemente quieras saber si las órdenes pertenecen a tu EA o a la operativa manual o si las órdenes están pendientes o ya son de mercado. Yo crearía una función (int) que devuelva la cantidad de órdenes que el EA ha creado.

if(OTLastTick >= 2 //<------¿podrías comentar el significado de esta línea?
Si sólo tienes una orden abierta (menos de 2), no tiene sentido llamar a la función CloseAllOnSL..... la única orden abierta obviamente no está parada.

 
kronin:

No comento el uso de las funciones. RaptorUK ya lo hizo unos cuantos posts antes. Lee de nuevo y entiende por qué no necesitas cambiar nada en el código dado. Incluso mejor, entender por qué se puede utilizar como es en otros EAs.

OrdersTotal() devuelve una cantidad de órdenes. Probablemente quieras saber si las órdenes pertenecen a tu EA o a la operativa manual o si las órdenes están pendientes o ya son de mercado. Yo crearía una función (int) que devuelva la cantidad de órdenes que el EA ha creado.

if(OTLastTick >= 2 //<------¿Podrías comentar el significado de esta línea?
Si solo tienes una orden abierta (menos de 2), no tiene sentido llamar a la función CloseAllOnSL..... la única orden abierta obviamente no está parada.


Hola Kronin,

Gracias por su respuesta a mis problemas.

Pondré mi mayor atención a su código, así RaptorUK aconseja dado antes.

Saludos cordiales

Luis

 

Hola Kronin,

Me ha surgido un problema que tiene que ver con el uso de dos EA's. Si pongo dos EA's en diferentes gráficos y con diferente número mágico no funcionan al mismo tiempo. Recibo un error como uninit razón 5 pero habiendo echado un vistazo en el foro no encuentro información que me ponga en la dirección correcta para tratar ese tema.

¿Tienen alguna información complementaria?

Saludos cordiales

Luis

 
luisneves:

Hola Kronin,

Me ha surgido un problema que tiene que ver con el uso de dos EA's. Si pongo dos EA's en diferentes gráficos y con diferente número mágico no funcionan al mismo tiempo. Recibo un error como uninit reason 5

https://docs.mql4.com/constants/uninit
 

Hola RaptorUK,

Gracias por su pronta respuesta.

En el enlace proporcionado he encontrado

REASON_PARAMETERS5Los parámetros de entrada fueron cambiados por el usuario.

Pero con esa información no se puede hacer nada (que yo sepa). No puedo entender qué parámetros de entrada se han cambiado. El ea es el mismo, solo cambio el numero magico para evitar conflictos entre los otros ea.

Por cierto una vez aquí ¿podrías decirme si en el siguiente código hay que introducir código para que las órdenes sean enviadas de nuevo mientras no se han recibido las entradas lo mismo para las órdenes de cierre?

while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)

Un saludo

Luis

 
luisneves:

Hola RaptorUK,

Gracias por su pronta respuesta.

En el enlace proporcionado he encontrado

REASON_PARAMETERS5Los parámetros de entrada fueron cambiados por el usuario.

Pero con esa información no se puede hacer nada (que yo sepa). No puedo entender qué parámetros de entrada se han cambiado. El ea es el mismo, solo cambio el numero magico para evitar conflictos entre los otros ea.

Si has cambiado el número mágico. . .

extern int    MagicNumber    = 08012013;

. . y es un externo entonces has cambiado un parámetro, el EA se reinicia y da la razón 5

Si quieres ejecutar tu EA en múltiples pares te sugiero que hagas 2 cosas, primero haz que tu EA funcione correctamente en un par, pruébalo completamente para que sepas que está funcionando. Luego, en segundo lugar, introduce un Mutex para que tus operaciones sean manejadas cuando el otro EA no esté tratando de hacer lo mismo.

 
RaptorUK:

Si has cambiado el Número Mágico. . .

. . y es un externo entonces ha cambiado un parámetro, el EA se reinicia y da la razón 5

Si quieres ejecutar tu EA en varios pares te sugiero que hagas 2 cosas, primero haz que tu EA funcione correctamente en un par, pruébalo a fondo para que sepas que está funcionando. Luego, en segundo lugar, introduce un Mutex para que tus operaciones se manejen cuando el otro EA no esté tratando de hacer lo mismo.


Hola RaptorUk,

Gracias por tu respuesta sobre el error, supongo que han cambiado el nombre y el número mágico y han puesto el segundo ea en el gráfico sin cerrar la plataforma.

Respecto al otro tema de las órdenes de reentrada que tiene que ver con un fallo en el cierre de la orden que devolvía un error como timeout. por eso no sé si el código tal y como está reentra la orden de cierre o de envío de la orden.

Saludos

Luis

 
luisneves:


Hola RaptorUk,

Gracias por tu respuesta sobre el error, supongo que han cambiado el nombre y el número mágico y han puesto el segundo ea en el gráfico sin cerrar la plataforma.

En cuanto al otro tema sobre las ordenes de reentrada que tiene que ver con un fallo en el cierre de la orden que devolvió un error como timeout. por eso no se si el código tal y como está reentra la orden de cierre o de envío de la orden.

Saludos

Luis

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 no se ha modificado o eliminado la orden existente, o no se ha cerrado la posición existente)