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()

Un ejemplo de la llamada de la función PlaySound():

//+------------------------------------------------------------------+
//|  la función llama a la función estándar OrderSend() y reproduce  |
//|  el sonido                                                       |
//+------------------------------------------------------------------+
void OrderSendWithAudio(MqlTradeRequest  &request, MqlTradeResult &result)
  {
  //--- mandamos la solicitud al servidor
   OrderSend(request,result);
   //--- si la solicitud se acepta, reproducimos el sonido Ok.wav 
   if(result.retcode==TRADE_RETCODE_PLACEDPlaySound("Ok.wav");
   //--- en caso del fallo, reproducimos el sonido de alarma desde el archivo timeout.wav
   else PlaySound("timeout.wav");
  }

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
   string terminal_path=TerminalInfoString(TERMINAL_PATH);

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
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);

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
   PlaySound("\\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
   PlaySound(NULL);

 

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 
string euro      ="\\Images\\euro.bmp";    // ruta del archivo directorio_de_datos_del_terminal\MQL5\Images\euro.bmp
string dollar    ="\\Images\\dollar.bmp";  // ruta del archivo directorio_de_datos_del_terminal\MQL5\Images\dollar.bmp
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- creamos el botón OBJ_BITMAP_LABEL si no lo tenemos todavía
   if(ObjectFind(0,label_name)<0)
     {
      //--- intentaremos crear el objeto OBJ_BITMAP_LABEL
      bool created=ObjectCreate(0,label_name,OBJ_BITMAP_LABEL,0,0,0);
      if(created)
        {
         //--- enlazamos el botón a la esquina superior derecha del gráfico
         ObjectSetInteger(0,label_name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
         //--- ahora ajustaremos las propiedades del objeto
         ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,100);
         ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,50);
         //--- pondremos a 0 el código del último error
         ResetLastError();
         //--- cargaremos la imagen para el estado del botón "Pulsado"
         bool set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,0,euro);
         //--- comprobaremos el resultado
         if(!set)
           {
            PrintFormat("Fallo al cargar la imagen desde el archivo %s. Código del error %d",euro,GetLastError());
           }
         ResetLastError();
         //--- cargaremos la imagen para el estado del botón "Despulsado"
         set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,1,dollar);
         
         if(!set)
           {
            PrintFormat("Fallo al cargar la imagen desde el archivo %s. Código del error %d",dollar,GetLastError());
           }
         //--- enviaremos al gráfico el comando de reinicio para que el botón aparezca en el acto, sin esperar la llegada de nuevo tick
         ChartRedraw(0);
        }
      else
        {
         //--- fallo al crear el objeto, avisaremos sobre ello
         PrintFormat("Fallo al crear el objeto OBJ_BITMAP_LABEL. Código del error %d",GetLastError());
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- quitaremos el objeto desde el gráfico
   ObjectDelete(0,label_name);
  }

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
string dollar    ="\\Images\\dollar.bmp";  // ruta del archivo directorio_de_datos_del_terminal\MQL5\Images\dollar.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.

Propiedades del objeto OBJ_BITMAP_LABEL

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
#resource "\\Images\\euro.bmp" // euro.bmp se encuentra en carpeta_de_datos_del_terminal\MQL5\Images\
#resource "picture.bmp"        // picture.bmp se encuentra en la misma carpeta que el archivo fuente
#resource "Resource\\map.bmp"  // recurso se encuentra en la carpeta catálogo_del_archivo_fuente\Resource\map.bmp
 
//--- indicación incorrecta de los recursos
#resource ":picture_2.bmp"     // no se puede utilizar ":"
#resource "..\\picture_3.bmp"  // no se puede utilizar ".."
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" //más de 63 caracteres

 

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
#resource "\\Images\\euro.bmp"          // nombre del recurso - Images\euro.bmp
#resource "picture.bmp"                 // nombre del recurso - picture.bmp
#resource "Resource\\map.bmp"           // nombre del recurso - Resource\map.bmp
#resource "\\Files\\Pictures\\good.bmp" // nombre del recurso - Files\Pictures\good.bmp
#resource "\\Files\\Demo.wav";          // nombre del recurso - Files\Demo.wav"
#resource "\\Sounds\\thrill.wav";       // nombre del recurso - Sounds\thrill.wav"
...                                  
 
//--- uso de recursos
ObjectSetString(0,bitmap_name,OBJPROP_BMPFILE,0,"::Images\\euro.bmp");
...
ObjectSetString(0,my_bitmap,OBJPROP_BMPFILE,0,"::picture.bmp");
...
set=ObjectSetString(0,bitmap_label,OBJPROP_BMPFILE,1,"::Files\\Pictures\\good.bmp");
...
PlaySound("::Files\\Demo.wav");
...
PlaySound("::Sounds\\thrill.wav");

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\
#resource "\\Images\\dollar.bmp";  // dollar.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:

using_resource

 

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
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"::Files\\triangle.bmp");

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
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\triangle.bmp");

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
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle.bmp");

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\:

//+------------------------------------------------------------------+
//|                                                     SampleEA.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex5"
int handle_ind;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   handle_ind=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex5");
   if(handle_ind==INVALID_HANDLE)
     {
      Print("Expert: iCustom call: Error code=",GetLastError());
      return(INIT_FAILED);
     }
//--- ...
   return(INIT_SUCCEEDED);
  }

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:

//+------------------------------------------------------------------+
//|                                              SampleIndicator.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_plots 0
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- modo incorrecto de indicar el vínculo hacia sí mismo
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";   
//--- modo correcto de obtener el vínculo hacia sí mismo
  string path=GetRelativeProgramPath();
//--- indicator buffers mapping
   handle=iCustom(_Symbol,_Period,path,0,0);
   if(handle==INVALID_HANDLE)
     {
      Print("Indicator: iCustom call: Error code=",GetLastError());
      return(INIT_FAILED);
     }
   else Print("Indicator handle=",handle);
//---
   return(INIT_SUCCEEDED);
  }
///....
//+------------------------------------------------------------------+
//| GetRelativeProgramPath                                           |
//+------------------------------------------------------------------+
string GetRelativeProgramPath()
  {
   int pos2;
//--- obtenemos la ruta absoluta hacia la aplicación
   string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- buscamos la posición de la subcadena "\MQL5\"
   int    pos =StringFind(path,"\\MQL5\\");
//--- subcadena no encontrada - error
   if(pos<0)
      return(NULL);
//--- saltamos la carpeta "\MQL5"
   pos+=5;
//--- saltamos los símbolos '\' que sobran
   while(StringGetCharacter(path,pos+1)=='\\')
      pos++;
//--- si es un recurso, devolvemos la ruta respecto al directorio MQL5
   if(StringFind(path,"::",pos)>=0)
      return(StringSubstr(path,pos));
//--- buscamos el divisor para el primer subdirectorio en MQL5 (por ejemplo, MQL5\Indicators)
//--- si no hay, devolvemos la ruta respecto al directorio MQL5
   if((pos2=StringFind(path,"\\",pos+1))<0)
      return(StringSubstr(path,pos));
//--- devolvemos la ruta respecto al subdirectorio (por ejemplo, MQL5\Indicators)
   return(StringSubstr(path,pos2+1));
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,        
                const double& price[])
  {
//--- return value of prev_calculated for next call
   return(rates_total);
  }

 

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
#resource "data.bin" as MqlRates ExtData[]        // declaración de una matriz de estructuras simples, que contiene los datos del archivo data.bin
//--- líneas
#resource "data.txt" as string ExtCode            // declaración de la línea que contiene los datos del archivo data.txt (tienen soporte las codificaciones ANSI, UTF-8 y UTF-16)
//--- recursos gráficos
#resource "image.bmp" as bitmap ExtBitmap[]       // declaración de la matriz que contiene el ráster del archivo BMP, tamaño de la matriz = height * width
#resource "image.bmp" as bitmap ExtBitmap2[][]    // declaración de la matriz bidimensional que contiene el ráster del archivo BMP, tamaño de la matriz [height][width]

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[][]
#resource "\\Images\\dollar.bmp"
//+------------------------------------------------------------------+
//|  Función de creación del objeto OBJ_BITMAP_LABEL con la ayuda del recurso     |
//+------------------------------------------------------------------+
void Image(string name,string rc,int x,int y)
  {
   ObjectCreate(0,name,OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetString(0,name,OBJPROP_BMPFILE,rc);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- introduciomos el tamaño de la imagen [width, height], que se guarda en la variable de recurso euro
   Print(ArrayRange(euro,1),", ",ArrayRange(euro,0));
//--- cambiamos la imagen a euro - dibujamos una franja horizontal roja en la mitad
   for(int x=0;x<ArrayRange(euro,1);x++)
      euro[ArrayRange(euro,1)/2][x]=0xFFFF0000;
//--- creamos el recurso gráfico con la ayuda de la variable de recurso
   ResourceCreate("euro_icon",euro,ArrayRange(euro,1),ArrayRange(euro,0),0,0,ArrayRange(euro,1),COLOR_FORMAT_ARGB_NORMALIZE);
//--- creamos el objeto marca gráfica Euro, al que le colocamos la imagen del recurso euro_icon
   Image("Euro","::euro_icon",10,40);
//--- otro método de utilización del recurso, no podemos dibujar en él
   Image("USD","::Images\\dollar.bmp",15+ArrayRange(euro,1),40);
//--- el método directo de direccionamiento al recurso euro.bmp no está disponible, puesto que ya ha sido declarado a través de la variable de recurso euro
   Image("E2","::Images\\euro.bmp",20+ArrayRange(euro,1)*2,40); // habrá un error de tiempo de ejecución
  }

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.

res_variables

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
...
int context;
if((cl_program=CLProgramCreate(context,cl_program)!=INVALID_HANDLE)
  {
   //--- ejecutamos las acciones posteriores con el programa OpenCL
  }

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