Aspectos técnicos de la organización y el almacenamiento de series temporales

Antes de proceder a las cuestiones prácticas de la utilización de las funciones de la API de MQL5 diseñadas para trabajar con series temporales, debemos considerar los fundamentos técnicos de la recepción de datos de cotización desde el servidor y su almacenamiento en MetaTrader 5.

Antes de que los datos de precios estén disponibles en el terminal para su visualización en gráficos y su transferencia a programas MQL, se descargan del servidor y se preparan de una manera especial. El mecanismo de acceso al servidor para obtener datos no depende de cómo se haya iniciado la solicitud: por el usuario al navegar por el gráfico o mediante programación a través del lenguaje MQL5.

Los datos llegan del servidor en un formato comprimido: se trata de bloques de barras de minutos comprimidos económicamente que, sin embargo, no son las barras M1 habituales.

Los datos recibidos del servidor se descomprimen automáticamente y se guardan en un formato intermedio especial HCC. Los datos de cada símbolo se escriben en una carpeta independiente {terminal_dir}/bases/{server_name}/history/{symbol_name}. Por ejemplo, los datos sobre EURUSD del servidor de trading demo de MetaQuotes pueden ubicarse en la carpeta C:/Program Files/MetaTrader 5/bases/MetaQuotes-Demo/history/EURUSD/.

Los datos se escriben en archivos con la extensión *.hcc: cada archivo almacena los datos de barras de un minuto correspondientes a un año. Por ejemplo, el archivo 2021.hcc de la carpeta EURUSD contiene barras de minutos EURUSD para 2021. Estos archivos se utilizan para preparar los datos de precios de todos los plazos y no están destinados al acceso directo.

Los archivos de servicios en formato HCC actúan como fuente de datos para trazar los datos de precios de periodos concretos. Sólo se crean a petición de un gráfico o un programa MQL y se guardan para su uso posterior en archivos con la extensión *.hc.

Para cada marco temporal, los datos se preparan independientemente de otros marcos temporales. Las normas de generación y disponibilidad de datos son las mismas para todos los marcos temporales, incluido M1. Es decir, a pesar de que la unidad de almacenamiento de datos en el formato HCC es una barra de minutos, su presencia no significa la presencia y disponibilidad de datos del marco temporal M1 en el mismo volumen en el formato HC.

Para ahorrar recursos, los datos de los marcos temporales se cargan y almacenan en la RAM sólo cuando es necesario: si no hay accesos a los datos durante mucho tiempo, se descargan de la RAM (pero permanecen en el archivo). Esto puede provocar un aumento del tiempo de ejecución de la siguiente solicitud de series temporales si no se ha utilizado durante mucho tiempo. Todas las series temporales populares, en particular aquellas cuyos gráficos están abiertos, están disponibles casi instantáneamente si el ordenador dispone de recursos suficientes.

La recepción de nuevos datos del servidor provoca la actualización automática de los datos de precios utilizados en el formato HC para todos los marcos temporales y el recálculo de todos los indicadores dependientes.

Cuando un programa MQL accede a los datos para un símbolo y un marco temporal concretos, existe la posibilidad de que las series temporales requeridas aún no se hayan generado o sincronizado con el servidor de trading (por ejemplo, que hayan aparecido en él precios actualizados). En este caso, deberá aplicar la espera para la disponibilidad de datos de una forma u otra.

Para los scripts, la única solución es utilizar bucles, ya que no tienen otra opción debido a la falta de manejo de eventos. En el caso de los indicadores, estos algoritmos, al igual que cualquier otro ciclo de espera, no se recomiendan categóricamente, ya que provocan una interrupción en el cálculo de todos los indicadores y del resto del procesamiento de los datos de precios de un símbolo determinado.

Para los Asesores Expertos y los indicadores, es mejor utilizar el modelo de procesamiento de eventos. Si, al procesar un evento OnTick u OnCalculate no ha conseguido obtener todos los datos necesarios de las series temporales requeridas, entonces debe salir del manejador de eventos y esperar a que aparezcan durante las siguientes llamadas del manejador.

Número máximo de barras
 
Debe tenerse en cuenta que el número máximo de barras que se calculará para cada par símbolo/marco temporal solicitado no supera el valor del parámetro Max. bars in chart en el cuadro de diálogo Options del terminal. Por lo tanto, este parámetro impone restricciones no sólo a los gráficos de cualquier marco temporal, sino también a todos los programas MQL.
 
Esta limitación tiene como principal objetivo ahorrar recursos. Al establecer valores grandes de este parámetro, hay que tener en cuenta que, si hay un historial suficientemente profundo de datos de precios para marcos temporales inferiores, el consumo de memoria para almacenar series temporales y búferes de indicadores puede ascender a cientos de megabytes y ocupar toda la RAM.
 
La modificación del límite de barras sólo surte efecto tras reiniciar el terminal de cliente. Afecta a la cantidad de datos solicitados al servidor para construir el número necesario de barras de marcos temporales de trabajo.
 
El límite fijado por el parámetro no es rígido y puede superarse en determinados casos. Por ejemplo, si al principio de la sesión, el historial de cotizaciones para un marco temporal específico es suficiente para seleccionar todo el límite, a medida que se forman nuevas barras, su número puede llegar a ser mayor que el valor actual del parámetro. El número real de barras disponibles se devuelve mediante las funciones Bars/iBars.