- Ejecución de programas
- Trade Permission
- Eventos de terminal de cliente
- Recursos
- Llamadas a las funciones importadas
- Errores de ejecución
- Simulación de estrategias comerciales
Recursos
El uso de la gráfica y sonidos en los programas MQL5
Los programas escritos en MQL5 permiten trabajar con los archivos de sonido e imágenes:
- PlaySound() reproduce un archivo de audio;
- ObjectCreate() permite crear las interfaces personalizadas utilizando los objetos gráficos OBJ_BITMAP y OBJ_BITMAP_LABEL.
PlaySound()
Un ejemplo de la llamada de la función PlaySound():
//+------------------------------------------------------------------+
|
En este ejemplo se nos muestra cómo reproducir los sonidos desde los archivos Ok.wav y timeoit.wav que entran en la entrega estándar del terminal. Estos archivos se ubican en la carpeta directorio_del_terminal\Sounds. Aquí el directorio_del_terminal significa la carpeta desde la que ha sido iniciado el terminal de cliente MetaTrader 5. La ubicación del directorio del terminal se puede averiguar desde el programa mql5 de la siguiente manera:
//--- La carpeta en la que guardan los datos del terminal
|
Usted puede utilizar los archivos de sonido no sólo desde la carpeta directorio_del_terminal\Sounds, sino también desde cualquier otra subcarpeta que se encuentra en la carpeta directorio_del_terminal\MQL5. La ubicación de la carpeta de datos del terminal en el ordenador se puede averiguar a través del menú del terminal "Archivo"-"Abrir carpeta de datos" o mediante el método programado:
//--- La carpeta en la que guardan los datos del terminal
|
Por ejemplo, si el archivo de sonido Demo.wav se encuentra en la carpeta directorio_de_datos_del_terminal\MQL5\Files, entonces la llamada de PlaySound() debe estar escrita de la siguiente manera:
//--- vamos a reproducir el archivo de sonido Demo.wav desde la carpeta directorio_de_datos_del_terminal\MQL5\Files\Demo.wav
|
Preste la atención a que en el comentario la ruta del archivo está escrita con el símbolo "\", mientras que en la misma función se utiliza la secuencia "\\" para separar las carpetas dentro de la ruta.
A la hora de indicar una ruta siempre use sólo doble barra diagonal inversa como separador, puesto que una barra inversa solitaria es un símbolo de control para el compilador durante el análisis de las cadenas constantes y constantes de caracteres en el código fuente del programa.
Para parar la reproducción del archivo, hay que llamar a la función PlaySound() con el parámetro NULL:
//--- la llamada a PlaySound() con el parámetro NULL para la reproducción del sonido
|
ObjectCreate()
Ejemplo del EA que a través de la función ObjectCreate() crea el objeto "Etiqueta gráfica" (OBJ_BITMAP_LABEL).
string label_name="currency_label"; // nombre del objeto OBJ_BITMAP_LABEL
|
La creación y configuración del objeto gráfico con el nombre currency_label se llevan a cabo en la función OnInit(). Las rutas hacia los archivos de imágenes se establecen en las variables globales euro y dollar, como separador se utiliza la barra diagonal inversa doble:
string euro ="\\Images\\euro.bmp"; // ruta del archivo directorio_de_datos_del_terminal\MQL5\Images\euro.bmp
|
En este caso los archivos se encuentran en la carpeta directorio_de_datos_del_terminal\MQL5\Images.
En realidad el objeto OBJ_BITMAP_LABEL representa un botón que en función de su estado (pulsado o despulsado) puede visualizar una de las dos imágenes: euro.bmp o dollar.bmp.
El tamaño del botón con la interfaz gráfica se ajusta automáticamente al tamaño de la imagen a mostrar. La imagen se cambia con el clic izquierdo en el objeto OBJ_BITMAP_LABEL (en las propiedades tiene que estar seleccionada la opción "Desactivar la selección"). El objeto OBJ_BITMAP se crea de la misma manera y sirve para crear el fondo con la imagen necesaria.
El valor de la propiedad OBJPROP_BMPFILE que responde de la apariencia de los objetos OBJ_BITMAP y OBJ_BITMAP_LABEL se puede cambiar de forma dinámica. Esto permite crear diferentes interfaces personalizadas interactivas para los programas mql5.
Inserción de recursos en los archivos ejecutables durante la compilación de programas mql5 #
Un programa mql5 a lo mejor podrá necesitar varios diferentes recursos cargables en forma de archivos de imágenes o sonidos. Para evitar la necesidad de transferir todos estos archivos durante el movimiento del programa ejecutable en MQL5, se debe utilizar la directiva #resource:
#resource ruta_hacia_archivo_del_recurso |
El comando #resource indica al compilador que hay que hay que incluir el recurso según la ruta especificada ruta_hacia_archivo_del_recurso en el archivo ejecutable EX5. De esta manera, se puede colocar todas las imágenes y sonidos necesarios directamente en el archivo EX5, sin tener que pasar todos los archivos que utiliza el programa para que funcione en otro terminal. Cualquier archivo EX5 puede contener recursos, y cualquier programa EX5 puede utilizar los recursos desde otro programa EX5.
Los archivos en el formato BMP y WAV se comprimen automáticamente antes de ser insertados en el archivo ejecutable EX5. Esto quiere decir que el uso de los recursos no sólo permite crear los programas MQL5 de pleno valor sino también reduce el tamaño total de los archivos requeridos por el terminal a la hora de utilizar la gráfica y el audio en comparación con el modo común de creación de los programas mql5.
El tamaño del archivo de un recurso no puede superar 128 Mb.
Búsqueda de recursos especificados por el compilador
Un recurso puede ser insertado mediante el comando #resource "<ruta_hacia_archivo_del_recurso>"
#resource "<ruta_hacia_archivo_del_recurso>" |
La longitud de la cadena constante <ruta_hacia_archivo_del_recurso> no puede ser más de 63 caracteres.
El compilador busca el recurso especificado en orden siguiente:
- si la ruta se empieza con la barra inversa separadora "\" (se escribe "\\"), entonces el recurso se busca respecto al catálogo carpeta_de_datos_del_terminal\MQL5\,
- si no hay ninguna barra inversa, el recurso se busca respecto a la ubicación del archivo fuente en el que este recurso ha sido insertado.
En la ruta del recurso no se puede utilizar las subcadenas "..\\" y ":\\".
Algunos ejemplos de inserción de recursos:
//--- la especificación correcta de los recursos |
Uso de recursos
Nombre del recurso
Después de que el recurso haya sido declarado mediante la directiva #resource, puede utilizarlo en cualquier parte del programa. El nombre del recurso será su ruta sin la barra inversa al principio de la línea que establece la ruta del archivo. Para poder utilizar su propio recurso en el código, hay que añadir el signo especial "::" antes del nombre de este recurso.
Ejemplos:
//--- ejemplos de indicación de recursos y sus nombres en el comentario
|
Cabe mencionar que cuando se establece una imagen desde el recurso para los objetos OBJ_BITMAP y OBJ_BITMAP_LABEL, el valor de la propiedad OBJPROP_BMPFILE ya no se puede cambiar manualmente. Por ejemplo, estamos utilizando los recursos de los archivos euro.bmp y dollar.bmp para crear OBJ_BITMAP_LABEL.
#resource "\\Images\\euro.bmp"; // euro.bmp se encuentra en carpeta_de_datos_del_terminal\MQL5\Images\
|
Entonces si nos fijamos en las propiedades de este objeto, veremos que las propiedades BitMap File (On) y BitMap File (Off) tienen el color gris y no están disponibles para el cambio manual:
Uso de recursos de otros programas mql5
El uso de los recursos también tiene otra ventaja en cualquier programa mql5 se puede utilizar los recursos desde cualquier archivo EX5. De esta manera, los recursos desde un archivo EX5 se puede utilizar en muchos otros programas mql5.
Para poder usar el nombre del recurso desde otro archivo, hay que indicarlo como sigue <ruta_nombre_del_archivo_EX5>::<nombre_del_recurso>. Por ejemplo, supongamos que el script Draw_Triangles_Script.mq5 contiene el recurso para una imagen en el archivo triangle.bmp:
#resource "\\Files\\triangle.bmp" |
Entonces su nombre para el uso en el mismo script será el siguiente "Files\triangle.bmp", y para poder usarlo hay que añadir a su nombre el signo especial "::".
//--- el uso del recurso en el mismo script
|
Para tener la posibilidad de usar el mismo recurso desde otro programa, por ejemplo desde un Asesor Experto, hay que añadir al nombre del recurso la ruta del archivo EX5 respecto a la carpeta carpeta_de_datos_del_terminal\MQL5\ y el nombre del archivo EX5 de este script - Draw_Triangles_Script.ex5. Supongamos que el script se encuentra en la carpeta estándar carpeta_de_datos_del_terminal\MQL5\Scripts\, entonces la llamada hay que escribir de la siguiente manera:
//--- el uso del recurso del script en el Asesor Experto
|
Si durante la llamada al recurso de otro archivo EX5 no indicamos la ruta de este archivo ejecutable, entonces la búsqueda de este archivo ejecutable se realiza en la misma carpeta donde se encuentra el programa que ha llamado al recurso. Eso quiere decir que si en el Asesor Experto se llama al recurso desde el archivo Draw_Triangles_Script.ex5 sin especificar la ruta, por ejemplo así:
//--- llamada al recurso del script en el EA sin especificar la ruta
|
entonces el archivo va a buscarse en la carpeta carpeta_de_datos_del_terminal\MQL5\Experts\ si el mismo EA se encuentra en la carpeta carpeta_de_datos_del_terminal\MQL5\Experts\.
Trabajo con los indicadores personalizados incluidos como recursos
Para el funcionamiento de los programas mql5 puede ser necesario uno o varios indicadores personalizados. Todos ellos pueden incluirse en el código del programa mql5 a ejecutar. La inclusión de los indicadores como recursos permite facilitar la distribución de la aplicación.
A continuación se muestra el ejemplo de inclusión y uso del indicador SampleIndicator.ex5 ubicado en la carpeta: directorio_de_datos_del_terminal\MQL5\Indicators\:
//+------------------------------------------------------------------+
|
El caso cuando un indicador personalizado crea en la función OnInit() una o varias copias de sí mismo requiere un análisis más detenido. Recordemos que para el uso del recurso desde el programa mql5, hay que indicarlo como sigue: <ruta_nombre_del_archivo_EX5>::<nombre_del_recurso>.
Por ejemplo, si el indicador SampleIndicator.ex5 se incluye como recurso en el Asesor Experto SampleEA.ex5, la ruta hacia sí mismo especificada durante la llamada de iCustom() en la función de inicialización del indicador personalizado, tendrá la siguiente apariencia: "\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5". Si esta ruta se establece de forma explícita, el indicador personalizado SampleIndicator.ex5 será vinculado rígidamente al Asesor Experto SampleEA.ex5 y perderá la capacidad de actuar independientemente.
La ruta hacia sí mismo se puede conseguir a través de la función GetRelativeProgramPath(), su ejemplo se muestra más abajo:
//+------------------------------------------------------------------+
|
Variables de recurso #
Los recursos se pueden declarar con la ayuda de variables de recurso y llamarse como si fueran una variable del tipo correspondiente. Formato de la declaración:
#resource ruta_al_archivo_del_recurso as tipo_de_variable_de_recurso nombre_de_la_variable_de_recurso |
Ejemplos de declaración:
#resource "data.bin" as int ExtData[] // declaración de una matriz de tipo numérico, que contiene los datos del archivo data.bin
|
Con tal declaración solo es posible dirigirse a los datos del recurso a través de una variable, el direccionamiento automático a través de "::<rsource name>" no funciona.
#resource "\\Images\\euro.bmp" as bitmap euro[][]
|
Resultado de ejecución del script - se han creado solo dos objetos OBJ_BITMAP_LABEL de tres. Además, en la imagen del primer objeto veremos una franja roja en la mitad.
Una ventaja importante del uso de recursos es que los archivos de recurso, antes de ser incluidos en el archivo ejecutable EX5, se comprimen de forma automática antes de la compilación. De esta forma, el uso de las variables de recurso permite no solo empaquetar los datos necesarios para el trabajo directamente en un archivo ejectutable EX5, sino también reducir el número y el tamaño total de los archivos en comparación con el método habitual de escritura de programas mql5.
El uso de variables de recurso es especialmente cómodo para publicar productos en el Mercado.
Particularidades
- El tipo especial de variable de recurso bitmap indica al compilador que el recurso es una imagen gráfica. Estas variables reciben el tipo uint.
- La matriz-variable de recurso del tipo bitmap puede tener dos dimensiones, en este caso, el tamaño de la matriz se definirá como [altura_de_la_imagen ][ anchura_de_la_imagen ]. En el caso de que la matriz sea unidimensional, el número de elementos será igual al producto altura_de_la_imagen*anchura_de_la_imagen.
- Al cargar una imagen de 24 bits para todos los píxeles de la imagen del componente del canal alfa se establece en el valor 255.
- Al cargar una imagen de 32 bits sin canal alfa, asimismo, para todos los píxeles de la imagen del componente del canal alfa se establece en el valor 255.
- Al cargar una imagen de 32 bits con canal alfa, no tiene lugar ninguna manipulación con los píxeles.
- El tamaño del archivo del recurso no puede ser superior a 128 Mb.
- Para los archivos de línea se define la codificación de forma automática por la presencia de BOM (encabezamiento). Si no hay BOM, la codificación se determina por el contenido del archivo. Tienen soporte los archivos en la codificación ANSI, UTF-8 y UTF-16. Al leer los datos de los archivos, todas las líneas se transforman en Unicode.
Programas en OpenCL
El uso de variables de línea de recurso puede facilitar significativamente la escritura de algunos programas. Por ejemplo, podrá escribir el código de un programa OpenCL en un archivo CL aparte, y después incluir este archivo en forma de línea en los recursos de su programa MQL5.
#resource "seascape.cl" as string cl_program
|
En este ejemplo, sin uso de la variable de recurso cl_program, usted tendría que describir todo el código en forma de una gran variable de línea.
Véase también
ResourceCreate(), ResourceSave(), PlaySound(), ObjectSetInteger(), ChartApplyTemplate(), Operaciones con archivos