Tipos de datos integrados
El tipo de dato es un concepto fundamental que utilizamos cómodamente en nuestra vida cotidiana sin ni siquiera pensar en su existencia. Está implícito en función del significado de la información que intercambiamos y de los procedimientos de tratamiento admisibles para la misma. Por ejemplo, a la hora de realizar un control de nuestros activos domésticos, sumamos y restamos números que representan nuestros ingresos y gastos. Aquí, «número» describe un tipo, para el que nos damos cuenta por completo de los valores que puede tener y de operaciones aritméticas que se pueden hacer con él. En el contexto del trading existe un valor similar, el saldo de la cuenta corriente, en MetaTrader 5; por lo tanto, MQL5 proporciona un mecanismo para crear y manipular números.
A diferencia de los números, la información textual, como el nombre de un instrumento de trading, cumple otras normas. Aquí podemos construir una palabra a partir de letras o una frase a partir de palabras, pero es imposible calcular el total progresivo o la media aritmética de varias líneas. Así, 'línea' o 'cadena' es otro tipo de dato, no un dato numérico.
Además del propósito y un conjunto típico de operaciones significativas para cada tipo, hay otra cosa importante que diferencia a los tipos entre sí: su tamaño. Por ejemplo, el número de la semana no puede exceder de 52 dentro de un año, mientras que el número de segundos transcurridos desde el comienzo del año adopta una forma astronómica. Por lo tanto, para almacenar y procesar eficazmente valores tan diferentes en la memoria del ordenador se pueden seleccionar segmentos de distinto tamaño. Esto nos lleva a comprender que, de hecho, el concepto generalizado de 'número' puede esconder distintos tipos.
MQL5 permite el uso de algunos tipos de números que difieren tanto en los tamaños de las celdas de memoria asignadas a los mismos como en algunas características adicionales. En concreto, algunos números pueden adoptar valores negativos, como el beneficio flotante en pips, mientras que otros no, como los números de cuenta. Además, algunos valores no pueden tener parte fraccionaria y, por tanto, es más rentable representarlos con un tipo más estricto de 'enteros', frente a los de 'números con coma decimal' aleatorios. Por ejemplo, el saldo de una cuenta o el precio de un instrumento de trading suelen tener valores con una coma decimal. Al mismo tiempo, el número de órdenes en el historial o, de nuevo, el número de cuenta es siempre un número entero.
MQL5 admite un conjunto de tipos universales similares a los disponibles en la gran mayoría de lenguajes de programación. El conjunto incluye tipos enteros (de diferentes tamaños), dos tipos de números reales (con coma decimal) de diferente precisión, cadenas y caracteres simples, así como el tipo lógico, que sólo tiene dos valores posibles: true y false. Además, MQL5 proporciona sus propios tipos específicos que operan con el tiempo y el color.
Por completar la información, es de destacar que MQL5 permite ampliar el conjunto de tipos mediante la declaración de tipos aplicados en el código, es decir, estructuras, clases y otras entidades típicas de la programación orientada a objetos; pero ya los veremos más adelante.
Dado que el tamaño de la celda en la que se almacena el valor es un atributo importante del tipo, vamos a abordar la metodología de la memoria.
La unidad más pequeña de la memoria de un ordenador es el byte. En otras palabras: un byte es el tamaño más pequeño de una celda que un programa puede asignar a un valor independiente. Un byte consta de 8 'partículas' más pequeñas, los bits, cada una de las cuales puede encontrarse en dos estados: activado (1) o desactivado (0). Todos los ordenadores modernos utilizan este tipo de bits en el nivel inferior porque esta representación binaria de la información es práctico incorporarla al hardware (en la memoria de acceso aleatorio, en los procesadores o al transferir los datos por cables de red o vía WiFi).
El procesamiento de valores de distintos tipos está garantizado gracias a las diferentes interpretaciones de los estados de los bits en las celdas de memoria, de lo cual se encarga el compilador. Los programadores no suelen bajar al nivel de los bits; sin embargo, el lenguaje proporciona herramientas para ello (véase Operaciones a nivel de bits).
Hay palabras especiales reservadas en MQL5 para describir los tipos de datos. Ya conocemos algunos de estos tipos, como void, int y string, que vimos en la Parte 1. A continuación se ofrece una lista completa de los tipos, cada uno con una referencia rápida y su tamaño en bytes.
Por su finalidad, pueden dividirse condicionalmente en datos numéricos y datos codificados por caracteres (marcados en las columnas correspondientes), así como en otros tipos especializados, como cadenas, tipos lógicos (o booleanos), fecha/hora y color. El tipo void se sitúa aparte e indica que no existe ningún valor. Además de los tipos escalares, MQL5 proporciona tipos de objetos para operaciones con números complejos, matrices y vectores: complex, vector y matrix. Estos tipos se utilizan para resolver diversos problemas en álgebra lineal, modelización matemática, aprendizaje automático y otras áreas. Los estudiaremos en detalle en la Parte 4 del libro.
Tipo |
Tamaño |
Número |
Carácter |
Nota |
---|---|---|---|---|
1 |
+ |
+ |
Carácter de un byte o un entero con signo |
|
1 |
+ |
+ |
Carácter de un byte o un entero sin signo |
|
2 |
+ |
+ |
Carácter de dos bytes o un entero con signo |
|
2 |
+ |
+ |
Carácter de dos bytes o un entero sin signo |
|
4 |
+ |
|
Entero con signo |
|
4 |
+ |
|
Entero sin signo |
|
8 |
+ |
|
Entero con signo |
|
8 |
+ |
|
Entero sin signo |
|
4 |
+ |
|
Número de punto flotante con signo |
|
8 |
+ |
|
Número de punto flotante con signo |
|
4 |
(int) |
|
Enumeración |
|
8 |
(ulong) |
|
Fecha y hora |
|
4 |
(uint) |
|
Color |
|
1 |
(uchar) |
|
Lógico |
|
10+ |
|
|
Cadena |
|
0 |
|
|
Vacío |
|
16 |
+ |
|
Estructura con dos campos de tipo doble |
|
longitud del vector x tamaño del tipo |
+ |
|
Array unidimensional de tipo real o complejo |
|
filas x columnas x tamaño del tipo |
+ |
|
Array bidimensional de tipo real o complejo |
Dependiendo de su tamaño, en el tipo numérico pueden almacenarse diferentes rangos de valores. Además de lo anterior, el rango puede variar considerablemente para los números enteros y los números de punto flotante del mismo tamaño, ya que para ellos se utilizan diferentes representaciones internas. Todas estas telarañas se estudiarán en las secciones dedicadas a los tipos específicos.
Un programador es libre de elegir un tipo numérico en función de los valores previstos o las consideraciones de eficiencia o por razones de economía. En particular, el menor tamaño del tipo permite que quepan más valores de este tipo en la memoria, mientras que los números enteros se procesan más rápidamente que los de punto flotante.
Tenga en cuenta que los tipos numéricos y los codificados con caracteres se solapan parcialmente. Esto ocurre porque un carácter se almacena en memoria como un número entero, es decir, un código en la tabla de caracteres correspondiente: ANSI para caracteres de un byte o Unicode para los de dos bytes. ANSI es una norma que toma el nombre de un instituto (American National Standards Institute), mientras que Unicode, ya lo ha adivinado, significa (conjunto de caracteres) de Código Universal. Los caracteres Unicode se utilizan en MQL5 para hacer cadenas (tipo string). Los caracteres de un solo byte suelen ser necesarios a la hora de integrar los programas con fuentes de datos externas, como las de Internet.
Como ya se ha mencionado, los tipos numéricos pueden dividirse en números enteros y números de punto flotante. Vamos a verlos con más detalle.