Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1853

 
EVGENII SHELIPOV #:

Lo entiendo, Rostislav

No entiendo por qué si bloqueo la bandera en esta función, el Asesor Experto comienza a abrir y cerrar 100-200 órdenes a la vez

Porque si la bandera no es igual a "0", llama constantemente a la función ClosseAll()
 
EVGENII SHELIPOV #:

No entiendo por qué, si bloqueo la bandera en esta función, el EA abrirá y cerrará 100-200 órdenes a la vez

Permíteme explicarte usando tu código:

Inicialmente, se establece una bandera.

int flag_close=0;
//+------------------------------------------------------------------+

Luego abre los pedidos

//-------------------------------------------------------------------+  Команда на открытие первых ордеров в сетке
   if((UseHour==1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour==0)
     {

Si surge una condición de orden cerrado (tienes tres)

//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)
   if(CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров
   if((CountTrade(0) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==0)||(CountTrade(1) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==1))
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие первых ордеров
   if((CountTrade(0) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==0)||(CountTrade(1) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==1))
     {
      flag_close=1;

Esta bandera obtiene el valor "1" y comienza a cerrar las órdenes

//-------------------------------------------------------------------+  Команда на закрытие ордеров
      if(flag_close==1)ClosseAll();

Y una vez cerradas todas las órdenes, la bandera se pone a "0".

   if(CountTrade() == 0)
     {
      flag_close=0;
 
Tretyakov Rostyslav #:
Porque si la bandera no es "0", llama constantemente a la función ClosseAll()

Este puede ser el caso siempre que se dé la orden de abrir una orden. Por lo tanto, hay una especie de "comprobación" en marcha.

 
EVGENII SHELIPOV #:

Este puede ser el caso siempre que se dé la orden de abrir una orden. Así que hay una especie de "Cálculo" en marcha.

¿Tienes una tarjeta de crédito?

Entras en una tienda y compras una botella de cerveza de una en una y cada vez pagas con la tarjeta hasta que tienes "0" en la tarjeta,

luego ir a rellenar la tarjeta e ir a buscar otra cerveza.

 
Mihail Matkovskij #:

Sí. Pero la cerradura se abre con el mismo lote. Y se abren simultáneamente dos órdenes dirigidas de forma diferente. Y la cobertura es cuando una operación ha entrado en drawdown, y el trader abre una posición con un lote más grande en la misma dirección (con diferentes direcciones me he confundido) implicando que el precio se invertirá para obtener un beneficio en una operación con un lote más grande y cubrir la pérdida de una operación con un lote más pequeño o promediar a 0. Si he entendido algo mal, corregidme.

La cobertura no es en absoluto un bloqueo, o un bloqueo parcial, sino un sistema completamente diferente.

 
Vitaly Muzichenko #:

La cobertura no es en absoluto un bloqueo, o un bloqueo parcial, sino un sistema completamente diferente.

Pero no digo que sea una pérdida. Ayer me confundí (dije: deberías abrir una posición contraria en lugar de una posición unidireccional). La hora era tardía. Y hoy he comprendido en qué me había equivocado.

 
Mihail Matkovskij #:

Pero no digo que sea una pérdida. Ayer me confundí (dije: deberías abrir una posición contraria en lugar de una posición unidireccional). La hora ya era tardía. Y hoy me he dado cuenta de dónde me he equivocado.

Entonces tiene sentido, eso pasa :)

 
EVGENII SHELIPOV #:

Este puede ser el caso siempre que se dé la orden de abrir una orden. Por lo tanto, se produce una especie de "CLIC".

Hay que crear una lista de órdenes, con ticks, para cerrar (como ya han dicho muchos aquí). Si el robot ha detectado una señal de salida, las órdenes correspondientes (tickets) deben añadirse a la lista para cerrar. La lista es pasada por un ciclo que envía solicitudes de cierre (OrderClose). A continuación, debe comprobar constantemente si hay pedidos abiertos con las entradas que se han añadido a la lista. Si no se encuentran una o varias entradas, debemos eliminarlas de la lista. De este modo, la función no enviará una solicitud para cerrar órdenes que no existen.

¿Qué hacer con las nuevas señales y órdenes, que han aparecido durante el periodo de la lista llena? También puede añadirlos a la lista para que se cierren con una señal de salida. De este modo, también se cerrarán a su vez. Eso es todo. Crear una lista de este tipo y cerrar los pedidos por el ticket cíclicamente. Puedes hacerlo con un intervalo de un segundo o de unos segundos por una pasada del ciclo. Sólo tenemos que realizar este algoritmo y todo funcionará.

 
Mihail Matkovskij #:

Hay que crear una lista de pedidos para cerrar (como muchos ya han dicho aquí) con billetes. Si el robot detecta una señal de salida, entonces añade las órdenes correspondientes (tickets) a la lista de cierre. La lista se pasa por un bucle que envía una solicitud de cierre (OrderClose). A continuación, debe comprobar constantemente si hay pedidos abiertos con las entradas que se han añadido a la lista. Si no se encuentran una o varias entradas, debemos eliminarlas de la lista. De esta manera, la función no enviará una solicitud para cerrar órdenes que no existen.

¿Qué hacer con los nuevos pedidos, que han aparecido durante el periodo de la lista llena? También puede añadirlos a la lista de cierre. De este modo, también se cerrarán a su vez. Eso es todo. Cree una lista de este tipo y cierre los pedidos en la etiqueta cíclicamente. Puede hacerlo con un intervalo de un segundo o de unos segundos por una pasada del ciclo. Sólo tenemos que realizar este algoritmo y todo funcionará.

¿Cerrará cada una de ellas por turnos? Cuando la parrilla es tan larga, cerrará las correctas.
Cuando se cierra la última, puede ocurrir que haya 10 órdenes por cerrar y las cerrará todas una a una y tardará un tiempo infinito.

 
Alexander Avksentyev #:

Cuando la red tarda tanto tiempo, cerrará las correctas a su vez.
Al cerrar la última, puede ocurrir que haya 10 órdenes por cerrar, por lo que las cierra todas una a una y tarda un tiempo infinito.

Esto no es del todo así. Todas las órdenes son cerradas por el terminal una por una. En el ciclo OrderSend, puede dispararse muchas veces por segundo (dependiendo de su hardware). Pero OrderSend sólo añade las órdenes correspondientes a la cola de cierre. A continuación,el terminal envía estos comandos al servidor en el intervalo especificado o después de recibir la respuesta del servidor sobre la solicitud anterior, no inmediatamente. Por lo tanto, un gran número de órdenes (posiciones) se cierran mucho más lentamente que una sola orden, de todos modos.

Razón de la queja: