Enumeraciones
Las enumeraciones son un grupo de tipos integrados en MQL5, cada uno de los cuales contiene un conjunto de constantes con nombre que sirve para describir conceptos o propiedades relacionadas. Estas constantes también se denominan elementos de enumeración.
Por ejemplo, la enumeración ENUM_DAY_OF_WEEK contiene constantes para todos los días de la semana:
Identificador (ID) |
Descripción |
Valor |
---|---|---|
SUNDAY |
Domingo |
0 |
MONDAY |
Lunes |
1 |
TUESDAY |
Martes |
2 |
WEDNESDAY |
Miércoles |
3 |
THURSDAY |
Jueves |
4 |
FRIDAY |
Viernes |
5 |
SATURDAY |
Sábado |
6 |
La enumeración ENUM_ORDER_TYPE describe todos los tipos de órdenes admitidos en MetaTrader 5:
Identificador (ID) |
Descripción |
Valor |
---|---|---|
ORDER_TYPE_BUY |
Orden de mercado para la compra |
0 |
ORDER_TYPE_SELL |
Orden de mercado para la venta |
1 |
ORDER_TYPE_BUY_LIMIT |
Orden pendiente Buy Limit |
2 |
ORDER_TYPE_SELL_LIMIT |
Orden pendiente Sell Limit |
3 |
ORDER_TYPE_BUY_STOP |
Orden pendiente Buy Stop |
4 |
ORDER_TYPE_SELL_STOP |
Orden pendiente Sell Stop |
5 |
ORDER_TYPE_BUY_STOP_LIMIT |
Al alcanzar el precio de la orden, la orden pendiente Buy Limit se coloca al precio StopLimit |
6 |
ORDER_TYPE_SELL_STOP_LIMIT |
Al alcanzar el precio de la orden, la orden pendiente Sell Limit se coloca al precio StopLimit |
7 |
ORDER_TYPE_CLOSE_BY |
Orden de cierre de una posición con la opuesta |
8 |
Hay varias docenas de enumeraciones distintas, cuyos nombres llevan el prefijo «ENUM_». Las iremos descubriendo a medida que avancemos por las áreas correspondientes.
Cada enumeración es un tipo independiente. Sin embargo, su representación interna es idéntica, es decir, un número entero de cuatro bytes (int). Cada constante de enumeración se codifica con un número u otro, pero en la mayoría de los casos, el programador no necesita recordar estos números, ya que el la enumeración se utiliza precisamente para sustituir las representaciones internas por identificadores evidentes.
El compilador se asegura de que el valor de enumeración sea siempre una de las constantes redefinidas. De lo contrario, aparecerá un aviso o se producirá un error de compilación (contextualmente, véase el ejemplo).
Así es como aparece «debajo» la enumeración ENUM_DAY_OF_WEEK (script MQL5/Scripts/MQL5Book/p2/TypeEnum.mq5).
void OnStart()
|
Todas las constantes de los días de la semana se codifican con números del 0 al 6, siendo el domingo el punto de partida. Básicamente, las constantes no tienen por qué constar de números consecutivos ni empezar por 0. Hay enumeraciones en las que esto no es así.
Tenga en cuenta que las mismas constantes pueden significar cosas distintas en tipos de enumeración diferentes. Por ejemplo, para las órdenes ORDER_TYPE_BUY y ORDER_TYPE_SELL de la enumeración ENUM_ORDER_TYPE se utilizan los mismos valores (0 y 1) que para los días de la semana SUNDAY y MONDAY de ENUM_DAY_OF_WEEK.
Cuando se copia el valor de una variable entera simple i en la variable de enumeración x, el compilador emite un aviso, ya que puede haber un valor distinto de las constantes permitidas en la variable i en la fase de ejecución del programa.
En la variable yregistramos el número 1, que significa MONDAY, y el compilador considera que esta es una operación correcta.
Un intento de escribir la constante de una enumeración en la variable de otra enumeración (como MONDAY para la variable type en el ejemplo anterior) puede dar lugar a un aviso sobre una conversión de tipo implícita. Esto ocurre si la constante que se está escribiendo tiene el mismo valor que uno de los elementos de la enumeración de destino. En otras palabras: cada una de las dos enumeraciones tiene su propio elemento con el valor correspondiente. Seguidamente, el compilador realiza de forma automática una conversión implícita en lugar del programador, pero utiliza un aviso para «pedir» al programador que compruebe si todo va según lo previsto: el hecho de que MONDAY vaya a sustituirse por ORDER_TYPE_SELL es extraño, sin duda; sin embargo, lo aquí lo hemos hecho a propósito con fines ilustrativos.
Si el elemento que se copia no coincide, por su valor, con ningún elemento de otra enumeración, se genera un error de compilación, ya que es imposible una conversión implícita, como cuando se escribe ORDER_TYPE_CLOSE_BY en la variable day.
La cadena comentada con la variable z también provoca un error de compilación, ya que el valor 10 no pertenece a ENUM_DAY_OF_WEEK. Si el programador está seguro de que, en un caso raro, sigue siendo necesario registrar un valor aleatorio en la variable de tipo enumeración, puede utilizar la conversión de tipos explícita.
La conversión de tipos explícita e implícita se abordará en la sección titulada Conversión de tipos.
MQL5 permite al programador declarar sus propias enumeraciones utilizando la palabra clave enum. Esta función se describe en la sección siguiente, Enumeraciones personalizadas (enum).