Recursos informáticos: memoria, disco y CPU

Como todos los programas, las aplicaciones MQL consumen recursos del ordenador, incluida memoria, espacio en disco y CPU. Teniendo en cuenta que el propio terminal consume muchos recursos (debido, en especial, a la posible descarga de cotizaciones y ticks para múltiples instrumentos financieros con un largo historial), a veces es necesario analizar y controlar la situación en cuanto a la proximidad de los límites disponibles.

La API de MQL5 proporciona varias propiedades que le permiten calcular los recursos máximos alcanzables y gastados. Las propiedades se resumen en las enumeraciones ENUM_MQL_INFO_INTEGER y ENUM_TERMINAL_INFO_INTEGER.

Identificador

Descripción

MQL_MEMORY_LIMIT

Cantidad máxima posible de memoria dinámica para un programa MQL en Kb

MQL_MEMORY_USED

Memoria utilizada por un programa MQL en Mb

MQL_HANDLES_USED

Número de objetos de clase

TERMINAL_MEMORY_PHYSICAL

RAM física del sistema en Mb

TERMINAL_MEMORY_TOTAL

Memoria (física+archivo de intercambio, es decir, virtual) disponible para el proceso del terminal (agente) en Mb

TERMINAL_MEMORY_AVAILABLE

Memoria libre del proceso del terminal (agente) en Mb, parte de TOTAL

TERMINAL_MEMORY_USED

Memoria utilizada por el terminal (agente) en Mb, parte de TOTAL

TERMINAL_DISK_SPACE

Espacio libre en disco, teniendo en cuenta posibles cuotas para la carpeta MQL5/Files del terminal (agente), en Mb

TERMINAL_CPU_CORES

Número de núcleos de procesador del sistema

TERMINAL_OPENCL_SUPPORT

Versión OpenCL admitida como 0x00010002 = 1.2; «0» significa que OpenCL no está admitido

La cantidad máxima de memoria disponible para un programa MQL se describe mediante la propiedad MQL_MEMORY_LIMIT. Esta es la única propiedad de la lista que utiliza kilobytes (Kb). Todas las demás se devuelven en megabytes (Mb). Por regla general, MQL_MEMORY_LIMIT es igual a TERMINAL_MEMORY_TOTAL, es decir, toda la memoria disponible en el ordenador puede asignarse a un programa MQL por defecto. No obstante, el terminal, en particular su implementación en la nube para MetaTrader VPS, y los agentes de prueba en la nube pueden limitar la memoria para un solo programa MQL. Así, MQL_MEMORY_LIMIT será significativamente menor que TERMINAL_MEMORY_TOTAL.

Dado que Windows normalmente crea un archivo de intercambio que es igual en tamaño a la memoria física (RAM), la propiedad TERMINAL_MEMORY_TOTAL puede ser de hasta 2 veces el tamaño de TERMINAL_MEMORY_PHYSICAL.

Toda la memoria virtual disponible TERMINAL_MEMORY_TOTAL se divide entre la memoria utilizada (TERMINAL_MEMORY_USED) y la aún libre (TERMINAL_MEMORY_AVAILABLE).

El libro viene con el script EnvProvision.mq5, que registra todas las propiedades especificadas.

void OnStart()
{
   PRTF(MQLInfoInteger(MQL_MEMORY_LIMIT)); // Kb!
   PRTF(MQLInfoInteger(MQL_MEMORY_USED));
   PRTF(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL));
   PRTF(TerminalInfoInteger(TERMINAL_MEMORY_TOTAL));
   PRTF(TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE));
   PRTF(TerminalInfoInteger(TERMINAL_MEMORY_USED));
   PRTF(TerminalInfoInteger(TERMINAL_DISK_SPACE));
   PRTF(TerminalInfoInteger(TERMINAL_CPU_CORES));
   PRTF(TerminalInfoInteger(TERMINAL_OPENCL_SUPPORT));
   
   uchar array[];
   PRTF(ArrayResize(array1024 * 1024 * 10)); // allocate 10 Mb
   PRTF(MQLInfoInteger(MQL_MEMORY_USED));
   PRTF(TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE));
   PRTF(TerminalInfoInteger(TERMINAL_MEMORY_USED));
}

Tras la salida inicial de las propiedades, asignamos 10 Mb para el array y volvemos a comprobar la memoria. A continuación se muestra un ejemplo de resultado (usted tendrá sus propios valores).

MQLInfoInteger(MQL_MEMORY_LIMIT)=8388608 / ok
MQLInfoInteger(MQL_MEMORY_USED)=1 / ok
TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)=4095 / ok
TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)=8190 / ok
TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)=7842 / ok
TerminalInfoInteger(TERMINAL_MEMORY_USED)=348 / ok
TerminalInfoInteger(TERMINAL_DISK_SPACE)=4528 / ok
TerminalInfoInteger(TERMINAL_CPU_CORES)=4 / ok
TerminalInfoInteger(TERMINAL_OPENCL_SUPPORT)=0 / ok
ArrayResize(array,1024*1024*10)=10485760 / ok
MQLInfoInteger(MQL_MEMORY_USED)=11 / ok
TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)=7837 / ok
TerminalInfoInteger(TERMINAL_MEMORY_USED)=353 / ok

Observe que la memoria virtual total (8190) es el doble de la memoria física (4095). La cantidad de memoria disponible para el script es de 8388608 Kb, que es casi igual a toda la memoria de 8190 Mb. La memoria del sistema libre (7842) y utilizada (348) también suman 8190.

Si antes de asignar memoria para un array, el programa MQL ocupaba 1 Mb; después de asignarla ocupa ya 11 Mb. Mientras tanto, la cantidad de memoria ocupada por el terminal sólo aumentó en 5 Mb (de 348 a 353), ya que algunos recursos se reservaron de antemano.