Desarrollo y conexión de bibliotecas de formatos binarios

Además de los tipos especializados de programas MQL ( Asesores Expertos, indicadores, scripts y servicios) la plataforma MetaTrader 5 permite crear y conectar módulos binarios independientes con funcionalidad arbitraria, compilados como archivos ex5 o DLL (Dynamic Link Library) de uso común, estándares para Windows. Pueden ser algoritmos analíticos, visualización gráfica, interacción en red con servicios web, control de programas externos o el propio sistema operativo. En cualquier caso, estas librerías funcionan en el terminal no como programas MQL independientes, sino en conjunción con un programa de cualquiera de los 4 tipos anteriores.

La idea de integrar la biblioteca y el programa principal (padre) es que la biblioteca exporte determinadas funciones, es decir, las declare disponibles para su uso desde el exterior, y el programa importe sus prototipos. Es la descripción de prototipos -conjuntos de nombres, listas de parámetros y valores de retorno- lo que permite llamar a estas funciones en el código sin disponer de su implementación.

A continuación, durante el lanzamiento del programa MQL, se realiza la vinculación dinámica temprana. Esto implica cargar la biblioteca después del programa principal y establecer la correspondencia entre los prototipos importados y las funciones exportadas disponibles en la biblioteca. Establecer correspondencias uno a uno por nombres, listas de parámetros y tipos de retorno es un requisito previo para el éxito de la carga. Si no se puede encontrar una implementación exportada correspondiente para la descripción de importación de al menos una función, se cancelará la ejecución del programa MQL (finalizará con un error en la fase de inicio).

Diagrama de componentes de comunicación de un programa MQL con bibliotecas

Diagrama de componentes de comunicación de un programa MQL con bibliotecas

No se puede seleccionar una biblioteca incluida al iniciar un programa MQL. Esta vinculación la establece el desarrollador al compilar el programa principal junto con las importaciones de bibliotecas. No obstante, el usuario puede sustituir manualmente un archivo ex5/dll por otro entre inicios del programa (siempre que los prototipos de las funciones exportadas implementadas coincidan en las bibliotecas). Esto puede utilizarse, por ejemplo, para cambiar el idioma de la interfaz de usuario si las bibliotecas contienen recursos de cadenas etiquetadas. Sin embargo, lo más frecuente es que las bibliotecas se utilicen como un producto comercial con ciertos conocimientos técnicos, que el autor no está dispuesto a distribuir en forma de archivos de encabezado abiertos.

Para los programadores que han llegado a MQL5 desde otros entornos y ya están familiarizados con la tecnología DLL, nos gustaría añadir una nota sobre la vinculación dinámica tardía, que es una de las ventajas de las DLL. La conexión dinámica completa de un programa MQL (o módulo DLL) a otro programa MQL durante la ejecución es imposible. La única acción similar que MQL5 le permite hacer «sobre la marcha» es la vinculación de un Asesor Experto y un indicador a través de iCustom o IndicatorCreate, donde el indicador actúa como una biblioteca vinculada dinámicamente (sin embargo, la interacción programática debe realizarse a través de la API del indicador, lo que supone una mayor sobrecarga para CopyBuffer, en comparación con las llamadas directas a funciones a través de export/#import).

Tenga en cuenta que, en casos normales, cuando un programa MQL se compila a partir de fuentes sin importar funciones externas, se utiliza el enlazado estático, es decir, el código binario generado hace referencia directa a las funciones llamadas ya que son conocidas en el momento de la compilación.

En sentido estricto, una biblioteca también puede depender de otras bibliotecas, es decir, puede importar algunas de sus funciones. En teoría, la cadena de estas dependencias puede ser incluso más larga: por ejemplo, un programa MQL incluye la biblioteca A, la biblioteca A utiliza la biblioteca B y la biblioteca B, a su vez, utiliza la biblioteca C. Sin embargo, estas cadenas no son deseables porque complican la distribución e instalación del producto, además de dificultar la identificación de las causas de posibles problemas de arranque. Por lo tanto, las bibliotecas suelen estar conectadas directamente al programa MQL padre.

En este capítulo describiremos el proceso de creación de librerías en MQL5, la exportación e importación de funciones (incluyendo las restricciones sobre los tipos de datos utilizados en ellas), así como la conexión de DLLs externas (ya preparadas). El desarrollo de DLL va más allá de lo contemplado en este libro.