Bucles y cierre o eliminación de pedidos - página 4

 
ggekko:

Hola expertos, ¿cuál es su opinión sobre esta solución?

while(OrdersTotal()>0)
Significa que es incompatible con cualquier otro EA (incluido él mismo) y el comercio manual. (Operaciones en otros gráficos)
 
WHRoeder:
ggekko:

Hola expertos, ¿cuál es su opinión sobre esta solución?

Significa que es incompatible con cualquier otro EA (incluido él mismo) y el comercio manual. (Operaciones en otros gráficos)

Por supuesto. Esto es un cierre total todo.

A veces hay situaciones (por ejemplo, usted quiere cerrar demasiadas operaciones abiertas inmediatamente) cuando la versión "original" no funciona. Esta versión es buena para esto.

 
ggekko:

Por supuesto. Esto es un cierre total.

A veces hay situaciones (por ejemplo, usted quiere cerrar demasiadas operaciones abiertas inmediatamente) cuando la versión "original" no funciona. Esta versión es buena para esto.

¿Por qué no intentas reaccionar a los errores? ¿No deberías analizar el error y reaccionar en consecuencia? Para algunos errores puedes reintentar, para otros tienes que dejar de intentarlo.
 

Hola,


Tengo una pregunta sobre los bucles while. Quiero ejecutar el EA actual en un bucle con la mayor frecuencia posible. Así que mi idea es poner el código actual dentro de un bucle while con una función sleep incluida dentro que hace que el while sólo se ejecute cada 1 milisegundo.


Sin embargo, cuando hice esto, (tengo algunas llamadas a la función Print("...") que mantiene un registro de lo que está sucediendo en cada bucle), veo esta congelación, y no más impresiones en la pantalla.

Me pregunto cuál puede ser el problema. ¿Es correcto ejecutar el EA en un bucle tan frecuente como 1ms? ¿Habría un problema con tratar de obtener la última oferta / demanda, por ejemplo, desde el servidor cada milisegundo? ¿Esto pondría demasiada carga allí, causando la congelación?

Posiblemente algo más mi algoritmo está haciendo esto, no estoy seguro.


Lo he ejecutado en ciclos de 200ms y sigo teniendo el mismo problema (aunque no tan inmediato). ¿Podría haber un problema con la impresión de demasiadas líneas en el archivo de registro?



Gracias por cualquier consejo sobre esto.

Saludos,


C.

 
Puede ser un problema de código - ¿pero sin conocer el código?
 

14967057:

Tengo una pregunta sobre los bucles while. Quiero ejecutar el EA actual en un bucle con la mayor frecuencia posible.

Así que mi idea es poner el código actual dentro de un bucle while con una función sleep incluida dentro que haga que el while sólo se ejecute cada 1 milisegundo.

¿Podría haber un problema al tratar de obtener la última oferta o demanda?

¿Podría haber un problema con la impresión de demasiadas líneas en el archivo de registro?

  1. Este hilo era sobre el cierre y la eliminación de órdenes. No secuestrar hilos para preguntas fuera de tema. Publica uno nuevo.
  2. ¿Por qué quiere hacer un bucle continuo? Nada está cambiando. Todo lo que está haciendo es perder tiempo de la CPU.
  3. Regresa desde el inicio y cuando la oferta o la demanda cambien, tu inicio será llamado tan rápido como sea posible.
  4. Sí, has llenado toda la ram disponible con las líneas, más rápido de lo que Windows puede ponerlas en el disco. Todos los programas son paginados. Todo se cuelga.
 

Hola,

Resulta que el problema que tenía no era debido a encapsular mi código EA dentro de un bucle while con un sleep de 1ms. Esta parte parece estar bien (independientemente de que imprima a pantalla o no) ya que lo tengo funcionando desde hace media hora sin fallos.


El problema se debía a otro while furtivo que tenía en el código y que al final hacía que el EA se quedara atrapado en un bucle infinito.

Gracias por las aportaciones gooly y Roesder.

Saludos,

 

Hola a todos. He leído este tema y tengo una pregunta. Trato de hacer un código, que eliminar la orden pendiente (sólo STOP, sin LÍMITE), pero sólo si otro orden pendiente se activó (inicio ser OP_SELL o OP_BUY). Así que el código es este (pero hay un error, pero no sé dónde). ¿Podría ver mi código por favor?

 bool   result;
   int   i, j, cmd, cmd2,total;

   total=OrdersTotal();

   for(i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         cmd=OrderType();
         
         if(cmd!=OP_BUYSTOP && cmd!=OP_SELLSTOP)  //take an orders which was activated 
           {
           for(j=0; j<total; j++)   //another variable j 
     { 
     if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){ cmd2=OrderType();
     if(cmd2!=OP_BUY && cmd2!=OP_SELL)
           {
            
            OrderPrint();
            
            result=OrderDelete(OrderTicket());  //first pending order become to OP_SELL or OP_BUY, second pending order will be delete
            if(result!=TRUE) Print("LastError = ", GetLastError());
            break;
           }
        }
       }
     }
     }
   }
 

OrdersTotal() no es correcto...

Me ha sorprendido que la secuencia de código for..loop que utiliza OrdersTotal() no da resultados correctos (observado con dos brokers diferentes).

Estoy usando la versión 1090 de MT4 en un escritorio Linux Ubuntu-MATE 16.04, corriendo WINE 3.0

Esto es lo que he estado usando...

for(int cc = 0; cc < OrdersTotal(); cc++)
{
if (!OrderSelect(cc, SELECT_BY_POS, MODE_TRADES) ) continue;
if (OrderSymbol() != Symbol() ) continue;
if (OrderType() > 1) continue; //--ignorar las operaciones pendientes

OpenTradecnt++; //--cuenta cada posición viva de ese símbolo que exista
Print("el recuento de las operaciones abiertas de este símbolo es: ", OpenTradecnt);
}

He notado con dos brokers diferentes que el valor de OrdersTotal() no siempre coincide con lo que se muestra en la pestaña 'Trade' del broker de MT4. Inicialmente, pensé que era el broker el que hacía que OrdersTotal() no funcionara correctamente. Cuando me di cuenta en el segundo broker, empecé a preguntarme si MT4 tenía un 'problema' interno, o si mi código era incorrecto O si se trataba de un problema de sincronización de MT4 con el servidor .....

Después de leer este hilo del foro, me pregunto si tendría un cambio en los resultados para cambiar el for..loop para leer:

for(int cc = OrdersTotal() - 1; cc >= 0; cc--)
{
...........
}

O, ¿hay alguna bandera o línea de código que garantice que el OrdersTotal() se sincronice correctamente durante un evento OnTick()?

¡Cualquier aclaración con respecto a esto sería muy útil y sería muy apreciado!

 

Por favor, utilice el botón </> para insertar su código.