Lo primero es convencerse que, la programación en MQL4, es accesible para cualquier persona pero requiere de atención y ciertos conocimientos lógicos y matemáticos. Hay traders que piensan que encontraran muchas dificultades en el estudio de la programación imaginándose complicados procesos los cuales se ejecutaran en sus equipos. Afortunadamente para la creación de programas en MQL4 creo que no se debe tener necesariamente conocimientos especiales sobre la comunicación cliente-terminal, de sistema operativo, del protocolo de red o del compilador.

Para empezar a programar basta con algunos sencillos principios y con empezar a elaborar pequeños programas y después poco a poco abordar códigos más complejos.

Todos los programas desarrollados en MQL4 tienen una estructura definida y es la base de un código correcto. Así, es necesario comprender los componentes de un programa.

Hay muchísimas funciones en el MQL4. Estas funciones son llamadas funciones estándar. Pero hay varias funciones de gran importancia, que se llaman funciones especiales. Un programa no puede ejecutarse sin ellas. Cada una de estas funciones tiene su propia tarea.

Uno debe entender correctamente como opera un programa MQL4. No todas las partes de código se utilizan con la misma frecuencia.

En los primeros artículos hemos aprendido nociones básicas del lenguaje de programación MQL4. Ahora vamos a estudiar cómo está organizado un programa en general.

La función especial es una función llamada a ser ejecutadas. A diferencia de las funciones comunes, las funciones especiales solo tienen la descripción y su llamada no se especifica en un programa. Cuando un programa se inicia para su ejecución en una ventana de un símbolo, el Terminal de Usuario pasa el control a una de las funciones especiales. Como resultado esta función se ejecuta. Como regla de programación en MQL4: el código del programa debe estar escrito dentro de una función.

Las líneas de programa (operadores y llamadas a funciones) que se encuentran fuera de una función no serán ejecutadas. Por tanto al compilar el código el MetaEditor mostrara un mensaje de error y el archivo ejecutable *.exe no aparecerá como resultado de la compilación.

La estructura de un programa, Asesor Experto, en MQL4 estará dentro de la siguiente estructura:

Como vemos los bloques principales del código MQL4 son los siguientes:

–    Cabecera del programa.

–    Función especial init ().

–    Función especial Deinit ().

–    Función especial start ().

–    Funciones definidas por el usuario.

–    Estructura de Programa.

La cabecera consta de varias líneas que contienen información general sobre el programa. Incluyen líneas de la declaración y la inicialización de variables globales.

Después de la cabecera, son descritas las funciones especiales del programa. Las funciones especiales tienen nombres predefinidos: init (), start () y Deinit ().Son un bloque de cálculos y están en relación con la información recibida desde el bróker por el Terminal de Usuario. El número de funciones definidas por el usuario en un programa es ilimitado.

Como se mencionó anteriormente, las funciones estándar solo pueden presentarse como una llamada a una función. Las funciones estándar, como cualquier otra función: las funciones especiales y funciones definidas por el usuario, tienen una descripción. Sin embargo, en la función estándar esta descripción no se da en el programa. La descripción de una función estándar esta oculta, no está visible para el programador y, por tanto, no se puede cambiar; a pesar de que está disponible para MetaEditor. Durante la compilación del programa, el MetaEditor creara un archivo ejecutable en el que todas las llamadas a funciones estándar se ejecutaran correctamente y con todo el rigor.

La cabecera debe estar ubicada en las primeras líneas. Las descripciones de funciones especiales y funciones definidas por el usuario no importan y pueden ser descritas en un orden aleatorio.

Después de leer las definiciones escritas en la cabecera del programa se pasa el control a la función especial init (), esta es llamada para la ejecución una sola vez al comienzo de la ejecución del programa. Por lo general, esta función contiene un código que debe ejecutarse solo una vez antes de la operación principal del programa de inicio start (). Por lo general se inicializan algunas variables globales, objetos gráficos se muestran en una ventana gráfica, se muestran mensajes etc. Después se pasa el control a la función start (). El tiempo de operación del programa principal es el periodo de funcionamiento de la función start (). En determinadas condiciones, incluyendo la recepción de nuevos tikcs por el Terminal de Usuario desde el servidor, el terminal de usuario pide la ejecución función especial start (). Esta función se puede referir a la información de entorno del Terminal de Usuario, realizar los cálculos necesarios, abrir y cerrar posiciones, es decir, realizar cualquier acción permitida por MQL4. Por lo general, cuando la función especial start () es ejecutada, una solución producida se implementa como una medida de control. Este control puede ser implementado como una solicitud de comercio para abrir, cerrar o modificar una orden creada por el programa.

Después de que todo el código de la AE de la función especial start () es ejecutado, la función start () termina su operación y devuelve el control al terminal de usuario. El terminal tendrá el control durante algún tiempo no iniciando ninguna función especial. Una pausa aparece, durante la cual el programa no funcionara. Más tarde, cuando llegue un nuevo tick, el terminal de usuario pasara el control a la función especial start () una vez más, como resultado, la función será ejecutada y después cuando su ejecución termina, el control se devuelve al Terminal de Usuario. En siguiente tick la función start () será iniciada por el Terminal de Usuario una vez más.

El proceso de múltiples llamadas de la función especial start () por el Terminal de Usuario se repetirá mientras que el programa este asociado a un gráfico y puede continuar durante semanas y meses. Durante todo este periodo un Asesor Experto puede llevar a cabo comercio automatizado, es decir, cumplir su principal misión.

Cuando se elimina el Asesor Experto de un gráfico, el Terminal de Usuario inicia una vez la función especial deinit (). La ejecución de esta función es necesaria para la correcta terminación de una operación de EA. Durante la operación un programa puede, por ejemplo, crear objetos gráficos y variables globales del Terminal de Usuario. Es por ello que el código de la función deinit () contiene líneas de programa, la ejecución de los cuales se traduce en la supresión de objetos innecesarios y de variables. Tras la ejecución de la función especial deinit () una vez más, se devuelve el control al Terminal de Usuario.

Las funciones definidas por el usuario se ejecutan cuando la llamada está contenida en alguna función. En este caso, el control pasa a la función definida por el usuario y después de la ejecución de la función el control es devuelto al lugar de la llamada. La llamada a las funciones definidas por el usuario se puede hacer no solo dentro de la descripción de una función especial, sino también en la descripción de otras funciones definidas por el usuario.

Una función definida por el usuario puede llamar a otras funciones definidas por el usuario. Esta forma de llamar a las funciones definidas por el usuario no solo está permitida, sino que es un uso ampliamente utilizado en la programación.

Un rasgo distintivo de los programas destinados a la operación en el Terminal de Usuario MetaTrader 4 es su trabajo con una información constantemente actualizada en tiempo real. En este lenguaje MQL4, esta particularidad se refleja en la forma de tres funciones especiales: init (), start () y deinit ().

La principal propiedad de todas las funciones especiales es su ejecución en un programa bajo ciertas condiciones y que su funcionamiento no se inicia desde el programa. Las funciones especiales son llamadas para ser ejecutadas por el Terminal de Usuario. Si un programa contiene la descripción de una función especial, será llamada (y ejecutada), de conformidad con sus condiciones de llamada.

La propiedad particular de la función especial de init () es su ejecución en el programa de inicialización. Si un programa contiene la descripción de la función especial init (), será llamada (y ejecutada) en el momento de iniciar el programa. Si no hay una función especial init () en un programa, las acciones no se llevaran a cabo en el programa de inicio.

En los Asesores Expertos la función especial de init () se llama (y ejecuta) después de que el Terminal de Usuario ha iniciado y cargado los datos históricos, después de cambiar el marco temporal del símbolo y/o gráfico, después de re-compilar el programa en el MetaEditor, después de cambiar parámetros de entrada y la ventana de configuración, después de los cambios de la cuenta.

En los scripts de inicio de la función especial init () también se llama inmediatamente después de que se llama y se ejecuta un gráfico.

En los indicadores personalizados de usuario función especial init () se ejecuta inmediatamente después de empezar el Terminal de Usuario, después de cambiar el marco temporal del símbolo y/o periodo, después de re-compilar el programa en MetaEditor y después de cambiar parámetros de entrada en la ventana de configuración del indicador personal.

Las propiedades especiales de la función start () difieren en función del tipo de programa que se ejecute.

En los Asesores Expertos la función especial start () se llama (y ejecuta) inmediatamente después de marcar un nuevo tick. Si un nuevo tick ha llegado durante la ejecución de la función especial start (), este tick no se tendrá en cuenta, es decir, la función especial start () no será llamada para su ejecución cuando este tick llega. Todas las cotizaciones recibidas durante la ejecución de la función especial start () se ignoran.

El Inicio de la función especial start () para su ejecución se realiza por medio del Terminal de Usuario solo a condición de que la operación del anterior periodo de sesión se haya completado, el control haya sido devuelto al Terminal de Usuario y la función especial start () este a la espera de un nuevo tick.

La posibilidad de llamar y ejecutar la función especial start () se ve influida por el estado del botón “Activar / desactivar del Asesor Experto. Si este botón se encuentra en el estado de desactivación AEs, del Terminal de Usuario no invocara la ejecución de la función especial start () con independencia de si las nuevas cotizaciones de llegan o no. No obstante, los cambios en el botón de estado desde Activado a Desactivado no finaliza la operación de la sesión actual de la función especial start ().

La función especial start () no es llamada por el Terminal de Usuario si la ventana de propiedades del AE está abierta. La ventana de propiedades de AE se puede abrir solo cuando la función especial start () está a la espera de un nuevo tick. Esta ventana no puede abrirse durante la ejecución de la sesión del AEs la función especial start ().

En los script la función especial start () se llama (y ejecuta) una vez, inmediatamente después de la inicialización del programa especial en la función init ().

En los indicadores personales función especial start () se ejecuta inmediatamente después de marcar un nuevo tick, inmediatamente después de que se vincula a un gráfico, cuando se cambia el una tamaño de una garantía de la ventana, cuando se cambia de uno a otro instrumento, cuando se inicia el Terminal de Usuario (si durante el anterior periodo de sesiones, un indicador se asoció a una gráfica), después de cambiar un símbolo y el marco temporal actual de un gráfico con independencia del hecho de que si las nuevas cotizaciones llegan o no.

Si un programa contiene la descripción de la función especial deinit (), será ejecutada en un programa de apagado. Si un programa no contiene la función especial deinit (), no se llevaran a cabo acciones en programa de cierre.

El tiempo de ejecución de deinit () está  limitado a 2,5 segundos. Si el código de la función especial deinit () se ejecuta en más tiempo el Terminal de Usuario fuerza la terminación de la ejecución de la función especial deinit () y el funcionamiento del programa.

La presencia de las funciones especiales init () y deinit () no son imprescindibles dentro programa. No importa el orden en el que estén descritas las funciones especiales en el programa. Las funciones especiales pueden tener parámetros. Sin embargo, cuando estas funciones son llamadas por el Terminal de Usuario, estos parámetros no pueden ser enviados desde el exterior y en este caso se utilizaran solo los valores por defecto.

Las funciones especiales init () y deinit () deben terminar su funcionamiento con la máxima rapidez y en ningún caso ejecutarse dentro de un recorrido cíclico pretendiendo hacer todas las operaciones antes de llamar a la función start ().

Por tanto el ciclo de trabajo del código será el siguiente: En primer lugar se ejecutara el init (), después se realiza el trabajo principal con la ayuda de la función start (), y cuando un usuario quiera apagar el experto la función deinit () se pondrá en marcha antes de que sea cerrado el programa.

La única parte indispensable en cualquier código completo es la función start () y el código encerrado dentro de esta función. Y lo fundamental que debemos recordar es que esta función se ejecuta cada nuevo tick.

Tenga en cuenta que las habilidades de programación se desarrollan mejor si se tiene un pequeño programa operativo desde donde empezar. Para entender todo el programa, es necesario examinar a fondo todos sus componentes y localizar su funcionamiento paso a paso. Las propiedades de una función especial de los distintos programas de aplicación (Asesores Expertos, scripts e indicadores) son diferentes.