hizo una cruz de 2 EMA EA, necesita asesoramiento - página 4

 
prupru:

Ahora tengo un problema mayor, mi broker tiende a ejecutar parcialmente las órdenes.

Estimado cliente,

Le informamos que su operación ha sido abierta parcialmente (2,32 lotes de 15,84) al precio 587,318.

Si tiene alguna pregunta adicional sobre este tema, no dude en ponerse en contacto con nosotros.

Saludos cordiales,

Corredor de bolsa.

esto es lo que dice el soporte:

Por favor, tenga en cuenta que durante los períodos de alta volatilidad o baja liquidez, las órdenes de límite pueden ser ejecutadas parcialmente. Esto significa que la posición se ejecutará inmediatamente de forma total o parcial si se cumple el precio. En su caso su orden fue ejecutada parcialmente, por eso ha recibido la carta de notificación.

Entiendo cómo cerrar todas las órdenes a pesar de que se hayan cerrado parcialmente, sólo tengo que hacer Close all Orders while OrdersTotal() > 0, pero no sé qué hacer todavía cuando las órdenes se abren parcialmente.

Editar:

Acabo de darme cuenta de que tengo que comprobar las órdenes propias de Symbol y magicnumber, es un poco más difícil

edit: aquí está la función close all orders que debería cerrar las órdenes incluso con cierre parcial


//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

 while (OrdersTotal()>notMyOrders)
 {
 notMyOrders = 0;
 for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
   if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) {notMyOrders++; continue;}
   if(OrderType()<= 1)CloseOrder();
         
   }
 }
return;
}  
reescrito
 
deVries:

reescrito


¡wow!

eso es un poco complicado para mí, he leído como 4 o 5 veces antes de conseguirlo. Gracias.

y... ¿qué pasa si OrderSelect devuelve false?

¿Con qué frecuencia orderselect devuelve false? ¿Es posible?

 
prupru:


¡vaya!

eso es un poco complicado para mí, he leído como 4 o 5 veces antes de conseguirlo. ¡Gracias!

y... ¿qué pasa si OrderSelect devuelve false?

¿Con qué frecuencia orderselect devuelve false? ¿Es posible?


for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;

i= 0

vuelve del bucle

i = -1

if(OrderSelect(-1,SELECT_BY_POS,MODE_TRADES)==false) break; // ==> al terminar de comprobar las operaciones rompemos el bucle

siguiente CloseOrder()

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

qué errores comunes puede devolver GetLastError()

si el cierre falla, puede que el siguiente falle también por un error como que el contexto de la operación esté demasiado ocupado u otro error...

¿Qué se puede hacer para evitar que se produzcan estas situaciones?

 
deVries:


¿qué se puede hacer para evitar que se produzcan muchas de estas situaciones?

Todavía no lo sé. Tengo que pensarlo.

Ahora mismo estoy atascado con otro problema.

He puesto mi EA en un VPS de windows 2003 y ahora está devolviendo el error "terminado por tiempo de espera", pero nunca he visto tal error en mi PC de casa.

Y el error aparece no el tiempo de mi mientras que los ciclos de orden de cierre y apertura que se ejecuta, pero cuando el experto jush cheques para el cruce e ir inactivo.

Es decir, el programa comprueba la apertura de una nueva barra, trailingstop = 0 por lo que no se llama a la función de trailing stop, entonces si se abre una nueva barra se comprueba el cruce de la EMA, no hay cruce (las veces que tuve errores de timeout las líneas de la EMA estaban lejos de cruzarse), por lo que el programa retorna(0)

¡No hay ciclos! ¿Cómo puede ser terminado por el tiempo de espera?

 
prupru:

no lo sé todavía. Tengo que pensarlo.

Ahora mismo estoy atascado con otro problema.

He puesto mi EA en un VPS de windows 2003 y ahora está devolviendo el error "terminado por el tiempo de espera", pero nunca he visto tal error en mi PC de casa.

Y el error aparece no el tiempo de mi mientras que los ciclos de orden de cierre y apertura que se ejecuta, pero cuando el experto jush cheques para el cruce e ir inactivo.

Es decir, el programa comprueba la apertura de una nueva barra, trailingstop = 0 por lo que no se llama a la función de trailing stop, entonces si se abre una nueva barra se comprueba el cruce de la EMA, no hay cruce (las veces que tuve errores de timeout las líneas de la EMA estaban lejos de cruzarse), por lo que el programa retorna(0)

¡No hay ciclos! ¿Cómo puede ser terminado por el tiempo de espera?


¿esto no es un ciclo?

while(!IsTradeAllowed()) Sleep(10);
 
deVries:


¿esto no es un ciclo?


Me refiero a que durante el tiempo en que el EA fue terminado las líneas EMA estaban lejos de cruzarse por lo que no se llamó a la función NewOrder, por lo que el ciclo del que hablas (que está dentro de la función NewOrder) no se ejecutó.

Añadida la condición IsStopped

while( (!IsTradeAllowed()) && (!IsStopped()) ) Sleep(10);
while ( (LotRemains>0) && (!IsStopped()) )
while ( (OrdersTotal()>0) && (!IsStopped()) ) 
 
tal vez el error de tiempo de espera sale porque se me acaban los recursos del procesador del VPS. Me he cambiado a un plan más caro y no los veo hasta que ejecuto algo pesado como windows uodate