MT5 y la velocidad en acción - página 78

 
Valeriy Yastremskiy:

Entiéndase correctamente que la memoria del terminal se apila con la memoria del programa del terminal de mcl, tix y otros.

No. Simplemente CopyTicks almacena la caché de los ticks solicitados durante 10 segundos. Por ejemplo, solicitados 3 Gb de memoria, el Terminal almacenará estos 3 Gb más en la caché. El total del terminal consumirá 6 GB. Si haces ArrayFree y solicitas 3 Gb para otro símbolo, el terminal consumirá 9 Gb. Y así sucesivamente.

 
Valeriy Yastremskiy:

Comprender correctamente que la memoria del terminal se suma a la memoria de los programas del terminal mcl, tix y otros.

Por supuesto.
 
Necesitamos hacer un script que cree un símbolo personalizado basado en el historial de ticks de varios símbolos por fórmula
MqlTick Formula( const MqlTick &Symbol1_Tick
                 const MqlTick &Symbol2_Tick,
                 const MqlTick &Symbol3_Tick,
                 const MqlTick &Symbol4_Tick,
                 const MqlTick &Symbol5_Tick );

Parece que 100 MB de RAM deberían ser suficientes para esta tarea, incluso para mil millones de ticks. Pero en MT5 no se puede resolver esta tarea a través de CopyTicks.

Aquí está la muleta:

  1. CopyTicks se llama para cada símbolo por separado (y necesariamente con la espera de la liberación de la caché después de cada llamada), escribiendo el historial de ticks en sus archivos correspondientes a través de FileSave.
  2. Luego viene la lectura de las garrapatas de estos archivos y la llamada de la Fórmula para ellos.

Sí, es una muleta espeluznante, pero no hay más opciones. Por lo tanto, no se puede trabajar con CopyTicks directamente. Es necesario utilizar los archivos de las garrapatas.


El mayor consumo de memoria será en p.1. incluso con la condición de esperar la liberación de la caché después de cada llamada. En este caso, la p.2. correrá gratis.

 

Estoy operando en 8 pares a la vez, con varios Asesores Expertos en cada par. Y aunque en términos de recursos se ve bien, el uso de la memoria no es más del 25%, la CPU no se carga más del 10%, los lags son notables, como un nuevo gráfico se abre durante unos segundos, así como en el comercio en general. ¿Quizás haya algunas buenas prácticas, al menos en abstracto, para empaquetar todo y hacer que funcione más rápido? Sé que están virtualizando varios Asesores Expertos en uno solo. ¿Cuáles son las dificultades? ¿Cómo se ha implementado el envío de órdenes comerciales? ¿A qué debo prestar atención?

P.D. Yo mismo utilizo la sincronización a través de Virtual y opero a través de MT4Orders, 1 EA por gráfico.

 
fxsaber:

Igualmente. Toma tu VPS. Los examinadores del mercado no pueden trabajar en él.

ZS Estaría bien quitar el hipo que se produce desde hace meses. Ejecute este script en una máquina con memoria RAM infinita. Por ejemplo, no puedo cargar las garrapatas del 1 de junio sólo un personaje a la vez. Simplemente cuelga CopyTicks con cero consumo de recursos.

Toma un volcado del terminal cuando se "cuelga". Veamos cuál es la causa.

 
traveller00:

Estoy operando en 8 pares a la vez, con varios Asesores Expertos en cada par. Y aunque en términos de recursos se ve bien, el uso de la memoria no es más del 25%, la CPU no se carga más del 10%, los lags son notables, como un nuevo gráfico se abre durante unos segundos, así como en el comercio en general. ¿Quizás haya algunas buenas prácticas, al menos en abstracto, para empaquetar todo y hacer que funcione más rápido?

Utilice un MT4Orders fresco (donde el manejo de la historia se acelera después de la creación de esta rama) y la instantánea del entorno actual: órdenes y posiciones. Lo tengo todo volando.

Sé que están virtualizando varios Asesores Expertos en uno solo. ¿Cuáles son las dificultades? ¿Cómo se ha implementado el envío de órdenes comerciales? ¿A qué debo prestar atención?

Estoy usando OrderSend sincrónico, pero estoy deshabilitando las comprobaciones de MT5.

Foro sobre trading, sistemas de trading automatizados y comprobación de estrategias

Bibliotecas: MT4Orders

fxsaber, 2020.09.29 08:45

Con esta línea.

MT4ORDERS::OrderSend_MaxPause = 0; // Отключение проверки корректности работы MT5-OrderSend.

se puede utilizar para desactivar todo. Puede ser útil en caso de que el historial de operaciones de MT5 sea lento, porque MT4Orders comprueba la corrección (e incluso corrige) de MT5-OrderSend a veces a través de la referencia a este historial.

No recomiendo hacer esto.


Cada conjunto (conjunto de parámetros de entrada) recibe su propio Virtual. El sincronizador recorre todos los virtuales y hace la sincronización de cada uno. Tiene que hacerlo en un bucle, no desde el primer Virtual.

Después de cualquier llamada a OrderSend (dentro del sincronizador) se realiza necesariamente una instantánea y se añaden nuevos ticks (a todos los virtuales) que llegaron durante el tiempo de ejecución de OrderSend. Es decir, después de una hipotética pausa, lo hacemos todo de nuevo.

Las garrapatas frescas se toman sólo a través de CopyTicks cada vez. No hay SymbolInfoTick para pasar. Asegúrese de que si CopyTicks_LastTick.time_msc < SymbolInfoTick.time_msc (sucede a menudo, incluso si las llamadas son una tras otra (en cualquier secuencia), entonces el sincronizador no está habilitado. De lo contrario, puede encontrarse con que el límite de tiempo real se ejecuta, pero el límite de tiempo virtual no. Y habrá problemas de sincronización.

Hago instantáneas a través de VIRTUAL::Snapshot. Además de la velocidad obvia, también le permite separar su símbolo del resto: sólo su símbolo llega allí. Esto da aún más velocidad. Además, no sólo el historial está desactivado en la instantánea,

#define  VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Отказ от снепшота истории для повышения производительности

sino también los campos (marcados a continuación), que requieren el acceso al historial.

#define  MACROS(A) this.##A = ::Order##A();

  bool ORDERS::Copy( const bool WithoutHistory = false )
  {
    MACROS(CloseTimeMsc)

    if (WithoutHistory && !this.CloseTimeMsc) // Для исторических ордеров оставляем все без изменений.
    {
      const string Str = NULL;
      this.comment = Str;

      this.Commission = 0;
      this.OpenPriceRequest = this.OpenPrice;
    }
    else // В MT4Orders требуется обращение к истории.
    {
      const string Str = ::OrderComment();
      this.comment = Str;

      MACROS(Commission)
      MACROS(OpenPriceRequest)
    }

Anteriormente también comprobé si LastDeal.time_msc no era mayor que LastTick.time_msc. Si esta condición no se cumplía, rechazaba la sincronización por razones obvias. Pero esa comprobación consume muchos recursos (funciona con el historial), así que me negué.


Función de comercio On - OnTick.


Probablemente he enumerado los principales.

 

¿Sincrónico, supongo, no sóloOrderSend, sino todas las órdenes comerciales, incluyendo la modificación, la eliminación, etc.?


SymbolInfoTick no se lanza a través de, porque el orden de las garrapatas puede desordenarse? Y los CopyTicks están exactamente en el orden correcto.


Resulta que SymbolInfoTick es necesario sólo para comprobar la hora y eso es todo? ¿Todas las operaciones, etc. son corregidas sólo porCopyTicks?


¿Tiene algún sentido intentar empaquetar varios EAs en un gráfico de 1 en 1? Nada imposible, pero tratando de entender si vale la pena la molestia y la reescritura o el beneficio será mínimo?

 
traveller00:

¿Tiene sentido tratar de empaquetar varios EAs en 1 en 1 gráfico? Nada imposible, pero tratando de averiguar si vale la pena la molestia y la reescritura o el beneficio será mínimo?

¿De dónde saldría el beneficio? Todo el mundo estará esperando a cualquiera de ellos cuando se negocie.

Y simplemente hay menos paralelos.

A menos que se pueda mantener un caché de pedidos para todos, pero el beneficio es cuestionable...

 
Anton:

Toma un volcado del terminal cuando se "cuelga". Vea qué es lo que lo está causando.

¿No te basta con el código que reproduce el problema? ¿O no se reproduce?

 
traveller00:

¿Sincrónico, supongo, no sóloOrderSend, sino todas las órdenes comerciales, incluyendo la modificación, la eliminación, etc.?

Me refería a MT5-OrderSend.

No se pasa SymbolInfoTick, porque se puede estropear el orden de los ticks? Y CopyTicks va exactamente todo en el orden correcto.

Porque habrá agujeros.

Entonces, SymbolInfoTick es necesario sólo para comprobar el tiempo, ¿eso es todo?

Sí.

¿Todo el comercio, etc. irá sólo porCopyTicks?

Sólo.

¿Tiene sentido tratar de empaquetar varios EAs en 1 en 1 gráfico? Nada imposible, pero tratando de averiguar si vale la pena la molestia y la reescritura o el beneficio será mínimo?

Esto es una gran ayuda para mí.


Cada pase (en modo de prueba individual) al final escribe sus pasos en el mismo archivo. Así que después de mirar algunos pases después de la optimización obtengo un archivo con los datos de esos pases. Luego los filtro en este archivo, dejando sólo lo que se ve bien. Y simplemente selecciono este archivo usando el FileSelectDialog al iniciar el robot. Así, negocia la cartera.


Resulta que la optimización tarda 20 minutos. Previsión de pases - 3 minutos. Su filtro - 3 minutos. Puesta en marcha del robot - segundos. El robot no necesita ser compilado. Seguimiento de las versiones y gráficos - de forma similar.

En el arranque puedo ver el Informe de cada conjunto. En cualquier momento puedo ver el estado del virtual y su homónimo del real, y el informe HTML detallado de la tecla de acceso directo tanto para el virtual como para el real. Tanto para un solo juego, como para toda la cartera.


Dado que las estadísticas comerciales de los virtuales están especialmente escritas de forma rápida, es posible comparar rápidamente los conjuntos sobre la marcha (desde el teclado).

Archivos adjuntos:
clip0184.gif  64 kb