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

 
Roman:

Vale, déjame decirlo de otra manera. Dentro de mql es más o menos posible, dependiendo de la frecuencia de reloj del procesador.
¿Y el PWM? -Una señal de impulso de frecuencia constante y ciclo de trabajo variable.
¿No establece una constante?

En primer lugar, lea lo que es la función WinAPI Sleep, y lo que realmente hace

PS Windows no es un sistema en tiempo real

 
Slava:

En primer lugar, lea lo que es la función WinAPI Sleep y lo que realmente hace

PS Windows no es un sistema en tiempo real

Ejem, ¿qué tiene que ver el WinAPI Sleep con esto?
Cuando hablamos de deslizamiento de microsegundos
individualmente, para su procesador puede definir la frecuencia del temporizador y calcular el número de repeticiones.
Entonces, puedes escribir tu propio MicrosecondCount en mql, pero ¿qué sentido tiene? El estándar es suficiente.

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman:

Ejem, me da vergüenza preguntar, ¿qué tiene que ver WinAPI Sleep con esto?
Cuando hablamos de deslizamiento de microsegundos
Individualmente, para su procesador, puede definir la frecuencia del temporizador y calcular el número de repeticiones.
Entonces, puedes escribir tu propio MicrosecondCount en mql, pero ¿qué sentido tiene? El estándar es suficiente.

Su propio deslizamiento pendiente sin cambio de contexto se comerá su núcleo al 100%.

Este es un método de programación espeluznante. Dios no permita que ese código se filtre al mercado.

 
Renat Fatkhullin:

Su deslizamiento de espera sin cambio de contexto se comerá su núcleo al 100%.

Es un método de programación horrible. Dios no permita que ese código se filtre al mercado.

Y nadie negó que el hardcore ))
Si muestra un ejemplo de cambio de contexto, tal vez pueda mejorar?

Aquí está la carga de la CPU para µsSLEEP (µsRange), en VirtualBox con sólo 2 núcleos, 4 hilos.
Los mineros lo hacen peor ))

cp

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: Secuencia

fxsaber, 2020.10.13 12:54

Un ejemplo de un EA que acabará con la mayoría de los VPS.
#include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.09.01'; // С какой даты анализировать историю

void OnInit()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
    MqlTick Ticks[];
    
    PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(10000); // Ждем освобождения CopyTicks-данных.
  }
}


Lo estoy ejecutando en algunos gráficos de diferentes símbolos. He utilizado este script con inAmount = 5 para automatizar esta acción.


Resultado.

2020.10.13 13:26:53.199 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406953
2020.10.13 13:26:53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 2838
2020.10.13 13:26:53.528 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430958
2020.10.13 13:26:53.807 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3144
2020.10.13 13:26:53.924 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244747
2020.10.13 13:26:54.214 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3464
2020.10.13 13:26:54.344 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327679
2020.10.13 13:26:54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3797
2020.10.13 13:26:54.864 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340006
2020.10.13 13:26:55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4308
2020.10.13 13:26:55.666 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730155
2020.10.13 13:26:55.756 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4316

El Terminal requiere más de 4 Gb de memoria para ejecutar estos seis Asesores Expertos. Tenga en cuenta que sólo es necesario para la inicialización, no para el funcionamiento de estos EAs. Imagina que inicias el terminal con Expert Advisors colgando en él. Si no tienes 4 Gb de RAM disponibles, es casi un desastre.


Ahora vamos a eliminar el comentario de esta línea en el código fuente.

  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

Así, hemos habilitado la inicialización secuencial de los Asesores Expertos.


Veamos el resultado (tras la recompilación).

2020.10.13 13:27:24.002 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406980
2020.10.13 13:27:24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1234
2020.10.13 13:27:35.407 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244772
2020.10.13 13:27:35.422 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1095
2020.10.13 13:27:46.886 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340072
2020.10.13 13:27:46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1224
2020.10.13 13:27:58.293 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327724
2020.10.13 13:27:58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1114
2020.10.13 13:28:09.683 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430999
2020.10.13 13:28:09.696 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1015
2020.10.13 13:28:21.339 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730313
2020.10.13 13:28:21.363 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1519


En la puesta en marcha de los Asesores Expertos hemos conseguido reducir el consumo de memoria del Terminal en más de 2,5 Gb. La probabilidad de que los VPS se caigan (y los ordenadores domésticos sean débiles) ha disminuido significativamente.


Así es como se ven ambas carreras en la dinámica.

El lanzamiento secuencial alargó la inicialización general en el tiempo, pero consiguió que el Terminal no consumiera grandes cantidades de RAM.


Losgráficos superior e inferior muestran claramente el proceso de inicialización en paralelo (pico alto izquierdo) y seis inicializaciones consecutivas (seis picos centrales).


SZY Durante los experimentos salió a la luz un desagradable matiz con Sleep - ver código fuente.


Pido que de alguna manera se permita liberar memoria por la fuerza después de usar CopyTicks. No crear esas muletas del sueño.

 
Por favor, recomiende la forma más barata de consumir memoria para consultar el historial de ticks en un intervalo determinado.
 
fxsaber:
Por favor, recomiende la forma más económica de solicitar el historial de garrapatas en un intervalo determinado.

me parece que no estás buscando uno barato, sino una forma de liberar memoria rápidamente

como opción a comprobar:

- envolver el array dinámico MqlTick Ticks[] en la clase y crear el objeto con new (es decir, también el objeto dinámico), borrarlo cuando no lo necesite

- lo mismo, pero con estructura, pero en ámbito local ( o función o bloque local { } - o bucle con una iteración ? ), las estructuras no funcionan tan bien como las clases - reescribí la mayor parte de mi código EA alejándome de las clases y sustituyéndolas por estructuras de datos, la velocidad de optimización aumentó significativamente - quizás es un efecto subjetivo - quizás las nuevas construcciones son más rápidas

- intente añadir ArrayFree() al destructor

 
Igor Makanu:

No creo que busques uno barato, sino una forma de liberar memoria rápidamente

El Terminal no libera memoria. Las variables MQL no tienen nada que ver.

 
fxsaber:

El terminal no está liberando memoria. Las variables MQL no tienen nada que ver.

¿qué pasa si se fuerza el tamaño = 1?

qué pasa si lo haces^

MqlTick  Tick[];
MqlTick  ZeroTick[1] = {0};
.....
ArrayResize(Tick,1);
ArrayCopy(Tick,ZeroTick)
 
Igor Makanu:

y si

Después de llamar a CopyTicks, el terminal mantiene todos los datos en la memoria durante unos segundos. Por si alguien quiere releer un trozo de la historia de las garrapatas.

Es decir, la cantidad de memoria que consume el Terminal no depende del tamaño de las variables MQL.


La tarea consiste en forzar al Terminal a liberar la memoria.

Razón de la queja: