Llamadas a las funciones importadas

Para importar funciones durante la ejecución de un programa mql5 se utiliza la ligadura temprana. Eso significa que si en el programa hay llamada a una función importada, el módulo correspondiente (ex5 o dll) se carga durante la carga del programa. Las bibliotecas MQL5 y DLL se ejecutan en el flujo del módulo-invocador.

No se recomienda utilizar el nombre completamente especificado del módulo a cargar como el Drive:\Directory\FileName.Ext. Las bibliotecas MQL5 se cargan de la carpeta terminal_dir\MQL5\Libraries. Si no encontramos ninguna, intentamos cargar la biblioteca desde la carpeta terminal_dir\experts.

Las bibliotecas de sistema (DLL) se cargan según las reglas del sistema operativo. Si la biblioteca ya está cargada (por ejemplo, por otro Asesor Experto, e incluso de otro terminal de cliente inicializado en paralelo), entonces nos dirigimos a la biblioteca ya cargada. En caso contrario, la búsqueda se efectua como sigue:

  1. Directorio del que ha sido iniciado el módulo que importa dll. Hablando del módulo, se quiere decir un Asesor Experto, un script, un indicador o biblioteca EX5;
  2. Directorio directorio_de_terminal_datos\MQL5\Libraries (TERMINAL_DATA_PATH\MQL5\Libraries);
  3. Directorio del que ha sido iniciado el terminal de cliente de MetaTrader 5;
  4. Directorio de sistema;
  5. Directorio Windows;
  6. Directorio corriente;
  7. Directorios enumerados en la variable de sistema PATH.

Si una biblioteca DLL utiliza en su trabajo otra biblioteca, la primera no puede ser cargada si falta la segunda DLL.

Antes de que se cargue un Asesor Experto (script, indicador) se forma una lista general de todos los módulos bibliotecarios EX5. Se prevé usarlos como del Asesor Experto cargado (script, indicador), tanto de las bibliotecas de esta lista. De esta manera cargándose sólo una vez, los módulos bibliotecarios EX5 se utilizan varias veces. Las bibliotecas usan las variables predefinidas del Asesor Experto (script, indicador) que las ha invocado.

El orden de búsqueda de la biblioteca EX5 importada es el siguiente:

  1. Directorio, ruta al cual se establece con relación al directorio del Asesor Experto (script, indicador) que importa EX5;
  2. Directorio directorio_de_terminal\MQL5\Libraries;
  3. Directorio MQL5\Libraries en el directorio general de todos los terminales de cliente de MetaTrader 5(Common\MQL5\Libraries).

Las funciones importadas de DLL en el programa mql5 deben asegurar el acuerdo de enlaces para las funciones Windows API. Para asegurar dicho acuerdo en el texto fuente de programas escritos en C o C++ se utiliza la palabra clave __stdcall, bastante específica para los compiladores de Microsoft(r). El acuerdo en cuestión se caracteriza por lo siguiente:

  • función que invoca (en nuestro caso es el programa mql5) tiene que "ver" el prototipo de función invocada (importada de DLL) para colocar los parámetros en la pila de una forma correcta;
  • función que invoca (en nuestro caso es un programa mql5) coloca los parámetros en la pila de una forma inversa - de derecha a izquierda; precisamente en este orden una función importada lee los parámetros traspasados para ella;
  • parámetros se traspasan por valor, salvo los que se pasan explícitamente por referencia (en nuestro caso, líneas);
  • función importada limpia la pila cuando lee losparámetros pasados para ella.

A la hora de describir el prototipo de una función importada se puede utilizar los parámetros con valores por defecto.

Si la biblioteca correspondiente no ha podido cargarse o si está prohibido usar DLL, o no se ha encontrado la función importada, entonces el Asesor Experto deja de funcionar dejando el mensaje "expert stopped" en el registrador de datos. El Asesor Experto se cargará hasta que no vuelva a ser inicializado. El Asesor Experto podrá ser reinicializado después de recompilación o después de que abramos la tabla de propiedades de Asesor y apretemos el botón "Ok".

Traspaso de parámetros

Todos los parámetros de tipos simples se traspasan por valor, si no se indica explícitamente que se pasan por referencia. Cuando se traspasa la cadena, se traspasa la dirección del buffer de la cadena copiada; si la cadena se pasa por referencia , en la función importada de DLL se pasa la dirección del buffer precisamente de esta cadena sin copiar.

Las estructuras que contienen los arrays dinámicos, cadenas, clases, otras estructuras complejas, así como los arrays dinámicos o estáticos de los objetos mencionados, no pueden ser traspasadas en la función importada en calidad de parámetros.

Cuando se traspasa un array en DLL, siempre (haya o no haya la bandera AS_SERIES) se pasa la dirección del inicio del búfer de datos. La función dentro de DLL no sabe nada de la bandera AS_SERIES, el array traspasado es un array estático de una longitud desconocida, y para especificar el tamaño del array se utiliza un parámetro adicional.