- Características de los arrays
- Descripción de arrays
- Utilización de arrays
Características de los arrays
Antes de dar cuenta de las particularidades sintácticas de la declaración de arrays en MQL5 y de cómo trabajar con ellos, vamos a analizar algunos conceptos básicos de la construcción de arrays.
La característica principal de un array es el número de dimensiones. En un array unidimensional, sus elementos se colocan de uno en uno, como una fila de soldados, y un solo número (índice) basta para referirse a ellos. En un array de este tipo pueden guardarse los precios barra por barra de la apertura de un instrumento financiero para la profundidad dada del historial.
En un array bidimensional, sus elementos divergen en dos direcciones lógicamente perpendiculares, formando una especie de cuadrado (o rectángulo, en un caso general) en el que se necesitan dos índices para cada elemento, es decir, uno en cada dimensión. Un array de este tipo podría utilizarse para guardar quads de precios (Open, High, Low y Close) para cada barra del historial. Los números de barra se contarían con la primera dimensión, mientras que la segunda se utiliza para los números del 0 al 3, que indican uno de los tipos de precio.
Un array tridimensional es el equivalente de un cubo (o, más estrictamente en términos de geometría, un paralelepípedo rectángulo) con tres ejes. Siguiendo con el ejemplo del array de precios barra por barra, podríamos añadirle la tercera dimensión responsable de iterar los instrumentos financieros desde Observación de Mercado.
Para cada dimensión, el array tiene una longitud (tamaño) determinada que establece el rango de índices posibles. Si se supone que el historial se carga para 1000 barras y 10 instrumentos, obtendríamos un array de 1000 elementos de tamaño en la primera dimensión, 4 elementos en la segunda (OHLC) y 10 en la tercera.
El producto de los tamaños en todas las dimensiones proporciona el número total de elementos del array; en nuestro caso, es 40 000. En MQL5, no puede superar 2147483647 (máximo para int).
Ya de por sí es difícil imaginar una forma sólida para un array de 4 dimensiones porque vivimos en un mundo tridimensional. Sin embargo, MQL5 permite crear arrays de hasta cuatro dimensiones.
Cabe señalar que siempre se puede utilizar un array unidimensional en lugar de uno multidimensional con un número aleatorio de dimensiones, incluso más de 4. Se trata simplemente de organizar el recálculo de varios índices en uno continuo. Por ejemplo, si un array bidimensional tiene 10 columnas (dimensión 1, eje X) y 5 filas (dimensión 2, eje Y), puede transformarse en un array unidimensional con la misma cantidad de elementos, es decir, 50. En este caso, el índice del elemento se obtendrá mediante la siguiente fórmula:
index = Y * N + X |
Aquí, N es el número de elementos en la primera dimensión, en nuestro caso, 10; se trata del tamaño de cada fila; Y es el número de fila (0..4), y X es el número de columna (0..9) en la fila.
Los tamaños entre dimensiones son otra característica que separa un array de una variable. Así, el número de dimensiones y el tamaño de cada dimensión deben especificarse de algún modo en la descripción, junto con el nombre del array y el tipo de datos (véase la sección siguiente).
Debe distinguir entre el tamaño de una variable (elemento del array) en bytes y el de un array como número de elementos que lo componen. En teoría, el tamaño total del array en términos de la memoria que consume debe ser el producto del tamaño de un elemento (dependiendo del tipo de datos) y el número de elementos. No obstante, esta fórmula no siempre funciona en la práctica. En particular, dado que las cadenas pueden tener distintas longitudes, resulta bastante difícil evaluar el volumen de memoria consumido por un array de cadenas.
Según el método de asignación de memoria, los arrays pueden ser dinámicos o de tamaño fijo.
En el código se describe un array de tamaño fijo con los tamaños exactos en todas las dimensiones. Es imposible cambiar su tamaño posteriormente. Sin embargo, a menudo se dan tareas prácticas en las que la cantidad de datos que se deben procesar es contingente y, por lo tanto, lo deseable sería redimensionar el array durante la operación del algoritmo. Para ello existen arrays dinámicos. Como veremos más adelante, estos arrays se describen sin especificar el tamaño de la primera dimensión y se pueden después «estirar» o «compactar» por medio de las funciones especiales de la API de MQL5.
En la documentación de MQL5 se utiliza terminología ambigua que denomina estáticos a los arrays de tamaño fijo. Este concepto también se utiliza para el modificador 'static' que se puede aplicar al array. Si un array de este tipo se declara dinámico, entonces es al mismo tiempo no estático en términos de asignación de memoria y estático en términos del modificador 'static'. Para evitar ambigüedades, el carácter estático en este libro sólo hará alusión al atributo de declaración.
Además de arrays dinámicos y de tamaño fijo, en MQL5 existen arrays especiales para almacenar cotizaciones y los búferes de los indicadores técnicos. Dichos arrays se denominan arrays de series temporales, ya que sus índices se corresponden con el tiempo. De hecho, estos arrays son unidimensionales y dinámicos. Sin embargo, a diferencia de otros arrays dinámicos, el propio terminal les asigna memoria. Los examinaremos en las secciones dedicadas a series temporales e indicadores.