- Introducción a MQL5 y al entorno de desarrollo
- Edición, compilación y ejecución de programas
- Asistente MQL y borrador del programa
- Sentencias, bloques de código y funciones
- Primer programa
- Tipos de datos y valores
- Variables e identificadores
- Asignación e inicialización, expresiones y arrays
- Entrada de datos
- Corrección y depuración de errores
- Salida de datos
- Formato, sangría y espacios
- Miniresumen
- Fundamentos de programación
- Programación orientada a objetos
- API comunes
- Creación de programas de aplicación
- Automatización de trading
- Herramientas lingüísticas avanzadas
- Conclusión
Asignación e inicialización, expresiones y arrays
Un array es un conjunto con nombre de celdas del mismo tipo que se encuentran en la memoria de forma contigua, y a cada uno de los cuales se puede acceder por su índice. En cierto sentido, se trata de una variable compuesta caracterizada por un identificador común, el tipo de valores almacenados y la cantidad de elementos numerados.
Por ejemplo, un array de 5 enteros puede describirse del siguiente modo:
int array[5]; |
El tamaño del array se especifica entre corchetes a continuación del nombre. Los elementos se numeran de 0 a N-1, siendo N el tamaño del array. Se accede a ellos, es decir, los valores se leen, utilizando una sintaxis similar. Por ejemplo, para imprimir el primer elemento del array anterior en el registro, podríamos escribir la siguiente sentencia:
Print(array[0]); |
Tenga en cuenta que el índice 0 corresponde al primer elemento. Para imprimir el último elemento, la sentencia se sustituiría por lo siguiente:
Print(array[4]); |
Se supone, por supuesto, que antes de imprimir un elemento del array, en él se ha escrito alguna vez un valor útil. Este registro se realiza mediante una sentencia especial, es decir, un operador de asignación. Una característica especial de este operador es el uso del símbolo '=', a cuya izquierda se especifica el elemento del array (o variable) en el que se realiza el registro, mientras que a su derecha se especifica el valor que se va a registrar o su «equivalente». Aquí, 'equivalente' oculta la capacidad del lenguaje para calcular expresiones aritméticas, lógicas y de otros tipos (las aprenderemos en la Parte 2). La sintaxis de las expresiones es, en su mayor parte, similar a las reglas de escritura de las ecuaciones que aprendimos en aritmética y álgebra en la época escolar. Por ejemplo, en una expresión pueden utilizarse las operaciones de suma ('+'), resta ('-'), multiplicación ('*') y división ('/').
A continuación se muestran ejemplos de operadores para rellenar algunos elementos del array anterior.
array[0] = 10; // 10
|
Estas sentencias demuestran varios métodos de asignación y construcción de expresiones: En la primera línea, el literal 10 está escrito en el elemento array[0], mientras que en la segunda y tercera líneas se utilizan las expresiones, cálculo que lleva a obtener los resultados especificados para mayor claridad visual en los comentarios.
Cuando en una expresión intervienen elementos de un array (o variables, en un caso general), el ordenador lee sus valores de la memoria durante la ejecución del programa y realiza con ellos las operaciones anteriores.
Es necesario distinguir el uso de variables y elementos de array a la izquierda y a la derecha del carácter '=' en la instrucción de asignación: a la izquierda hay un «receptor» de los datos procesados (siempre es único), mientras que a la derecha están las «fuentes» de datos iniciales para el cálculo (puede haber muchas «fuentes» en una expresión, como en la última cadena de este ejemplo, donde los valores de los elementos array[0] y array[1] se multiplican juntos).
En nuestros ejemplos se ha utilizado el carácter '=' para asignar los valores a los elementos de un array predefinido. Sin embargo, a veces es conveniente asignar valores iniciales a variables y arrays inmediatamente después de definirlos. Esto se denomina inicialización y para ello también se utiliza el carácter '='. Consideremos esta sintaxis en el contexto de nuestra tarea aplicada.
Vamos a describir el array de cadenas con las opciones de saludo dentro de la función Greeting:
string Greeting(int hour)
|
En la sentencia añadida, no sólo se define el array messages con 3 elementos, sino también su inicialización, es decir, el llenado del mismo con los valores iniciales deseados. La inicialización resalta el carácter '=' sobre el nombre de la variable o array y la descripción del tipo. Para una variable, es necesario especificar un solo valor después de '=' (sin llaves), mientras que para un array, como podemos ver, podemos escribir varios valores separados por comas y encerrados entre llaves.
No confunda inicialización con asignación. El primero se especifica al definir una variable o array (y se hace una vez), mientras que el segundo se produce en sentencias específicas (se puede asignar la misma variable o elemento del array con diferentes valores una y otra vez). Los elementos de un array sólo pueden asignarse por separado: MQL5 no admite la asignación de todos los elementos a la vez, como es el caso de la inicialización.
El array messages, al estar definido dentro de la función, sólo está disponible dentro de ella, al igual que el parámetro hour. A continuación veremos cómo podemos describir las variables disponibles en todo el código del programa.
¿Cómo transformaremos el valor entrante de hour con el número de la hora en uno de los tres elementos?
Recordemos que, según nuestra idea, hour puede tener valores de 0 a 23. Si lo dividimos exactamente por 8, obtendremos los valores de 0 a 2. Por ejemplo, dividir 1 entre 8 nos dará 0, y 7 entre 8 dará 0 (en la división exacta, la parte fraccionaria se desprecia). Sin embargo, al dividir 8 entre 8 se obtiene 1, por lo que todos los números hasta 15 nos darán 1 al dividirlos entre 8. Los números del 16 al 23 se corresponderán con el resultado de la división de 2. Los enteros 0, 1 y 2 obtenidos se utilizarán como índices para leer el elemento del array messages.
En MQL5, la operación '/' permite calcular la división exacta para números enteros.
La expresión para obtener los resultados de la división es similar a las que hemos considerado recientemente para el array, sólo que hay que utilizar el parámetro hour y la operación '/'. Utilizaremos la siguiente sentencia como demostración de una posible implementación de la transformación hour en el índice de elementos:
int index = hour / 8; |
Aquí, una nueva variable entera, index, se define e inicializa con el valor de la expresión anterior.
Sin embargo, podemos omitir guardar el valor intermedio en la variable index y transferir inmediatamente esta expresión (a la derecha de '=') dentro de corchetes, donde se especifica el número de elemento del array.
A continuación, en la sentencia con el operador return, podemos extraer el saludo pertinente de la siguiente manera:
string Greeting(int hour)
|
La función está más o menos lista. No obstante, haremos algunas correcciones tras un par de secciones. De momento, guardemos el proyecto en un archivo con otro nombre, GoodTime0.mq5, e intentemos invocar nuestra función. Por esta razón, en OnStart, utilizaremos la llamada a Greeting dentro de la llamada a Print.
void OnStart()
|
Hemos guardado la coma de separación (puesta dentro del literal «Hola, ») entre el saludo y el nombre del instrumento. Ahora hay tres argumentos en la llamada a la función Print: la primera y la última se calcularán sobre la marcha mediante llamadas, respectivamente, a las funciones Greeting y Symbol, mientras que la coma se enviará a imprimir tal cual.
Por ahora, estamos enviando la constante '0' a la función Greeting. Es su valor el que entrará en el parámetro hour. Una vez compilado y ejecutado el programa, podemos asegurarnos de que imprime el texto deseado en el registro.
GoodTime0 (EURUSD,H1) Good morning, EURUSD |
Sin embargo, en la práctica, los saludos deben seleccionarse dinámicamente, en función de la hora especificada por el usuario.
Así, hemos abordado la necesidad de organizar la introducción de datos.