Risorse

Uso di immagini e suoni in programmi mql5

I programmi in MQL5 permettono di lavorare con i file audio e grafica:

 

PlaySound()

Esempio di chiamata della funzione PlaySound():

//+--------------------------------------------------------------------------------+
//| Chiama OrderSend() standard e riproduce un suono                               |
//+--------------------------------------------------------------------------------+
void OrderSendWithAudio(MqlTradeRequest  &request, MqlTradeResult &result)
  {
//--- Invia una richiesta ad un server
   OrderSend(request,result);
//--- se la richiesta viene accettata, riproduce l'audio Ok.wav 
   if(result.retcode==TRADE_RETCODE_PLACEDPlaySound("Ok.wav");
//--- se fallisce, riproduce l' allarme dal file timeout.wav
   else PlaySound("timeout.wav");
  }

L'esempio mostra come riprodurre i suoni di 'Ok.wav' file e 'timeout.wav', che sono inclusi nel pacchetto terminale standard. Questi file si trovano nella cartella terminal_directory\Sounds. Qui terminal_directory vi è la cartella, da cui viene avviato Terminale Client MetaTrader 5. La posizione della directory del terminale può essere scoperta da un programma MQL5 nel modo seguente:

//--- Cartella, in cui sono memorizzati i dati del terminale
   string terminal_path=TerminalInfoString(TERMINAL_PATH);

È possibile utilizzare i file audio non solo dalla cartella terminal_directory\Sounds, ma anche da qualsiasi sottocartella che si trova terminal_data_directory\MQL5. Si può scoprire il percorso della directory dei dati del terminale dal menu del terminale "File" -> "Apri" dati del terminale o con il metodo del programma:

//--- Cartella, in cui sono memorizzati i dati del terminale
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);

Ad esempio, se il file audio Demo.wav si trova nella terminal_data_directory\MQL5\Files, allora la chiamata di PlaySound() dovrebbe essere scritta nel modo seguente:

//--- suona Demo.wav dalla cartella terminal_directory_data\MQL5\Files\Demo.wav
   PlaySound("\\Files\\Demo.wav");

Si prega di notare che nel commento il percorso del file è scritto usando una barra inversa "\", e nella funzione invece viene usato "\\" .

Quando si specifica il percorso, usare sempre e solo la doppia barra rovesciata come separatore, in quanto una singola barra rovesciata è un simbolo di controllo per il compilatore quando si tratta di stringhe costanti e caratteri costanti nel codice sorgente del programma.

Chiama la funzione PlaySound() con parametro NULL per fermare la riproduzione:

//--- la chiamata di PlaySound() con il parametro NULL ferma la riproduzionne
   PlaySound(NULL);

 

ObjectCreate()

Esempio di un Expert Advisor, che crea un'etichetta grafica (OBJ_BITMAP_LABEL) utilizzando la funzione ObjectCreate().

string label_name="currency_label";        // nome dell'oggetto OBJ_BITMAP_LABEL
string euro      ="\\Images\\euro.bmp";    // percorso del file terminal_data_directory\MQL5\Images\euro.bmp
string dollar    ="\\Images\\dollar.bmp";  // percorso del file terminal_data_directory\MQL5\Images\dollar.bmp
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert                                      |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- crea un bottone OBJ_BITMAP_LABEL, se non è stato ancora creato
   if(ObjectFind(0,label_name)<0)
     {
//--- cerca di creare l'oggetto OBJ_BITMAP_LABEL
      bool created=ObjectCreate(0,label_name,OBJ_BITMAP_LABEL,0,0,0);
      if(created)
        {
         //--- link sul pulsante nell'angolo in alto a sinistra del grafico
         ObjectSetInteger(0,label_name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
         //--- ora imposta le proprietà di un oggetto
         ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,100);
         ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,50);
         //--- reimpostare il codice dell'ultimo errore a 0
         ResetLastError();
//--- scaricare un'immagine per indicare lo stato "Premuto" del bottone
         bool set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,0,euro);
         //--- testa il risultato
         if(!set)
           {
PrintFormat("Impossibile scaricare l'immagine dal file %s. Error code %d",euro,GetLastError());
           }
         ResetLastError();
         //--- scarica un'immagine per indicare lo stato "Non premuto" del bottone
         set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,1,dollar);
         
         if(!set)
           {
PrintFormat("Impossibile scaricare l'immagine dal file %s. Error code %d",dollar,GetLastError());
           }
//--- invia un comando per un grafico per aggiornare in modo che il bottone viene visualizzato immediatamente, senza un segno di spunta
         ChartRedraw(0);
        }
      else
        {
         // --- fallimento nel creare un oggetto, notifica
         PrintFormat("Fallimento nel creare OBJ_BITMAP_LABEL. Error code %d",GetLastError());
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert                                             |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- elimina un oggetto da un grafico
   ObjectDelete(0,label_name);
  }

La creazione e configurazione dell'oggetto grafico denominato currency_label è svolta nella funzione OnInit(). I percorsi dei file grafici si trovano nelle variabili globalieuro e dollaro, una doppia backslash viene utilizzata come separatore:

string euro   ="\\Images\\euro.bmp";      // percorso al file terminal_data_directory\MQL5\Images\euro.bmp
string dollar ="\\Images\\dollar.bmp";    // percorso al file terminal_data_directory\MQL5\Images\dollar.bmp

I file si trovano nella cartella terminal_data_directory\MQL5\Images.

L'oggetto OBJ_BITMAP_LABEL è in realtà un bottone, che visualizza una delle due immagini, a seconda dello stato del bottone (premuto o non premuto): euro.bmp o dollar.bmp.

Proprietà dell'oggetto OBJ_BITMAP_LABEL

La grandelzza del bottone con un'interfaccia grafica viene automaticamente adattata alla dimensione dell'immagine. L'immagine viene modificata con un clic del tasto sinistro del mouse sull'oggetto OBJ_BITMAP_LABEL (deve essere impostata nelle proprietà "Disattivare la selezione"). L'oggetto OBJ_BITMAP viene creato nello stesso modo - viene utilizzato per creare lo sfondo con un'immagine necessaria.

Il valore della proprietà OBJPROP_BMPFILE, che è responsabile per l'aspetto degli oggetti OBJ_BITMAP e OBJ_BITMAP_LABEL, può essere modificato in modo dinamico. Questo permette di creare diverse interfacce utente interattive per programmi mql5.

 

Comprese le risorse per i file eseguibili durante la compilazione dei programmi mql5 #

Un programma mql5 può necessitare di un sacco di differenti risorse scaricabili sotto forma di file immagine ed audio. Al fine di eliminare la necessità di trasferire tutti i file quando si sposta un file eseguibile in MQL5, la direttiva del compilatore #resource deve essere utilizzata:

 #resource percorso_al_file_risorsa

Il comando #resource indica al compilatore che la risorsa nel percorso specificato path_to_resource_file dovrebbe essere inclusa nel file eseguibile EX5. Così tutte le immagini e suoni necessari possono essere posto direttamente in un file EX5, in modo che non vi sia alcuna necessità di trasferire separatamente i file utilizzati in esso, se si desidera eseguire il programma su un terminale diverso. Qualsiasi file EX5 può contenere le risorse, e qualsiasi programma EX5 può utilizzare le risorse da un altro programma EX5.

I file in formato BMP e WAV vengono automaticamente compressi prima di includerli in un file EX5. Questo indica che in aggiunta alla creazione di programmi completi in MQL5, l'utilizzo di risorse consente inoltre di ridurre la grandezza totale dei file necessari utilizzando immagini e suoni, rispetto al solito modo di scrittura del programma MQL5.

La grandezza del file di risorse non deve superare i 16 Mb.

 

Ricerca di risorse specificate da un compilatore

Una risorsa viene inserita con il comando #resource "<percorso ad un file risorsa>"

 #resource "<percorso_ad_un_file_risorse>"

La lunghezza della stringa costante <path_to_resource_file> non deve superare i 63 caratteri.

Il compilatore cerca per una risorsa nel percorso specificato nel seguente ordine:

  • se il separatore barra rovesciata "\" (scritto come "\\") è posto all'inizio del percorso, esso ricerca per il resource relativo alla directory terminal_data_directory\MQL5\,
  • se non c'è backslash, esso cerca la risorsa relativa alla posizione del file di origine, in cui è scritta la risorsa.

Il percorso delle risorse non può contenere le sottostringhe "..\\" e ":\\".

Esempi di integrazione delle risorse:

//--- specifiche corrette delle risorse
#resource "\\Images\\euro.bmp" // euro.bmp è localizzato in terminal_data_directory\MQL5\Images\
#resource "picture.bmp"        // picture.bmp è localizzato nella stessa directory del file sorgente
#resource "Resource\\map.bmp"  // la risorsa è localizzata nel file sorgente source_file_directory\Resource\map.bmp
 
//--- specificazione non corretta della risorsa
#resource ":picture_2.bmp"     // non deve contenere ":"
#resource "..\\picture_3.bmp"  // non deve contenere ".."
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" //più di 63 simboli

 

Uso delle risorse

Nome risorsa

Dopo che una risorsa viene dichiarata mediante la direttiva #resource, essa può essere utilizzata in qualsiasi parte di un programma. Il nome della risorsa è il suo percorso senza backslash all'inizio della riga, che imposta il percorso della risorsa. Per usare le tue risorse nel codice, il contrassegno speciale "::" deve essere aggiunto prima il nome della risorsa.

Esempi:

//--- esempi di specifiche risorse e dei loro nomi nei commenti
#resource "\\Images\\euro.bmp"          // nome risorsa - Images\euro.bmp
#resource "picture.bmp"                 // nome risorsa - picture.bmp
#resource "Resource\\map.bmp"           // nome risorsa - Resource\map.bmp
#resource "\\Files\\Pictures\\good.bmp" // nome risorsa - Files\Pictures\good.bmp
#resource "\\Files\\Demo.wav";          // nome risorsa - Files\Demo.wav"
#resource "\\Sounds\\thrill.wav";       // nome risorsa - Sounds\thrill.wav"
...                                  
 
//--- utilizzazione delle risorse
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");

Occorre notare che quando si impostano immagini da una risorsa agli oggetti OBJ_BITMAP e OBJ_BITMAP_LABEL, il valore della proprietà OBJPROP_BMPFILE non può essere modificato manualmente. Ad esempio, per la creazione di OBJ_BITMAP_LABEL utilizziamo le risorse euro.bmp e dollar.bmp.

#resource "\\Images\\euro.bmp";    // euro.bmp si trova in terminal_data_directory\MQL5\Images\
#resource "\\Images\\dollar.bmp";  // dollar.bmp si trova in terminal_data_directory\MQL5\Images\

Quando si visualizzano le proprietà di questo oggetto, vedremo che la proprietà BitMap File (On) e BitMap File (Off) sono disattivate e non possono essere cambiate manualmente:

using_resource

 

Utilizzando le risorse di altri programmi mql5

Vi è un altro vantaggio della risorsa utilizzando - in un qualsiasi programma MQL5, risorse di un altro file EX5 . Così le risorse da un file EX5 possono essere usate in molti altri programmi mql5.

Per utilizzare il nome di risorsa da un altro file, dovrebbe essere specificato come <path_EX5_file_name>::<resource_name> . Ad esempio, si supponga che lo script Draw_Triangles_Script.mq5 contiene una risorsa di un'immagine nel file triangle.bmp:

 #resource "\\Files\\triangle.bmp"

Allora il suo nome, per l'utilizzo nello script stesso, sarà tipo "File\triangle.bmp", e per usarlo, "::" deve essere aggiunto al nome della risorsa.

//--- utilizzo risorsa nello script
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"::Files\\triangle.bmp");

Per poter utilizzare la stessa risorsa da un altro programma, ad esempio da un Expert Advisor, abbiamo bisogno di aggiungere al nome della risorsa il percorso del relativo file da EX5 terminal_data_directory\MQL5\ ed il nome del file EX5 dello script, il EX5 file - Draw_Triangles_Script.ex5. Si supponga che lo script si trovi nella cartella standard terminal_data_directory\MQL5\Scripts\, dunque la chiamata deve essere scritta come segue:

//--- Utilizzando una risorsa da uno script in un EA
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\triangle.bmp");

Se il percorso del file eseguibile non è specificato quando si chiama la risorsa da un altro EX5, il file eseguibile viene cercato nella stessa cartella che contiene il programma che chiama la risorsa. Ciò significa che se un Expert Advisor richiede una risorsa da Draw_Triangles_Script.ex5 senza specificazione del percorso, in questo modo:

//--- chiamata script di risorsa in un EA senza specificare il percorso
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle.bmp");

allora il file verrà ricercato per la cartella terminal_data_directory\MQL5\Experts\, se gli Expert Advisor sono memorizzati in terminal_data_directory\MQL5\Experts\.

 

Funzionamento con indicatore personalizzato incluso come risorsa

Uno o più indicatori personalizzati possono essere necessari per il funzionamento delle applicazioni MQL5. Tutti possono essere inclusi nel codice di un programma MQL5 eseguibile. L'inclusione di indicatori come risorse semplifica la distribuzione delle applicazioni.

Di seguito è riportato un esempio di inclusione ed utilizzazione dell'indicatore personalizzato SampleIndicator.ex5 che si trova in terminal_data_folder\MQL5\Indicators\ directory:

//+------------------------------------------------------------------+
//|                                                     SampleEA.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex5"
int handle_ind;
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert                        |
//+------------------------------------------------------------------+
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);
  }

Il caso quando un indicatore personalizzato nella funzione OnInit() crea una o più copie di se stesso e richiede una speciale considerazione. Si prega di tenere presente che la risorsa deve essere specificata nel seguente modo: <path_EX5_file_name>::<resource_name>.

Ad esempio, se l'indicatore SampleIndicator.ex5 è incluso per SampleEA.ex5 Expert Advisor come una risorsa, il percorso a sé specificato al momento della chiamata della iCustom() enlla funzione di inizializzazione dell' indicatore personalizzato appare nel seguente modo: "\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5".. Quando questo percorso è impostato in modo esplicito, l'indicatore personalizzato SampleIndicator.ex5 è rigidamente collegato all' Expert Advisor SampleEA.ex5 e perde la capacità di lavorare in modo indipendente.

Il percorso di per sé può essere ricevuto tramite la funzione GetRelativeProgramPath(). L'esempio del suo utilizzo è il seguente:

//+------------------------------------------------------------------+
//|                                              SampleIndicator.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_plots 0
int handle;
//+-----------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato          |
//+-----------------------------------------------------------------+
int OnInit()
  {
//--- il modo sbagliato di fornire un collegamento a se stesso
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";  
//--- il modo giusto per ricevere un collegamento a se stesso
  string path=GetRelativeProgramPath();
//--- mappatura buffers indicatore
   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;
//--- ottiene il percorso assoluto per l'applicazione
   string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- trova la posizione della sottostriga "\MQL5\"
   int    pos =StringFind(path,"\\MQL5\\");
//--- sottostringa non trovata - errore
   if(pos<0)
      return(NULL);
//--- salta la directory "\MQL5"
   pos+=5;
//--- salta il simbolo '\' 
   while(StringGetCharacter(path,pos+1)=='\\')
      pos++;
//--- se c'è una risorsa, restituisce il percorso relativo alla directory MQL5
   if(StringFind(path,"::",pos)>=0)
      return(StringSubstr(path,pos));
//--- trova un separatore per la prima sottodirectory MQL5 (per esempio, MQL5\Indicators)
//--- se non trovato, restituisce il percorso relativo alla directory MQL5
   if((pos2=StringFind(path,"\\",pos+1))<0)
      return(StringSubstr(path,pos));
//--- restituisce il percorso relativo alla sottodirectory (per esempio, MQL5\Indicators)
   return(StringSubstr(path,pos2+1));
  }
//+-----------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato                 |
//+-----------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,        
                const double& price[])
  {
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }

Variabili di risorsa #

Le risorse possono essere dichiarate utilizzando le variabili di risorsa e trattati come se fossero variabili del tipo appropriato. Formato Dichiarazione:

#resource percorso_al_file_risorsa as tipo_variabile_risorsa nome_variabile_risorsa

Dichiarazioni di esempio:

#resource "data.bin" as int ExtData[]             // dichiara l'array numerico contenente i dati dal file data.bin
#resource "data.bin" as MqlRates ExtData[]        // dichiara l'array strutture semplici contenente i dati dal file data.bin
//--- strings
#resource "data.txt" as string ExtCode            // dichiara la stringa contenente i dati file data.txt (le codifiche ANSI, UTF-8 e UTF-16 sono supportate)
#resource "data.txt" as string ExtCode[]          // dichiara l'array contenente le stringe file data.txt (le codifiche ANSI, UTF-8 e UTF-16 sono supportate)
// --- risorse grafiche
#resource "image.bmp" as bitmap ExtBitmap[]       // dichiara l'array mono-dimensionale contenente il bitmap dal file BMP, grandezza array = altezza * larghezza
#resource "image.bmp" as bitmap ExtBitmap2[][]    // dichiara l'array bi-dimensionale contenente il bitmap dal file BMP, grandezza array [altezza][larghezza]

In caso di tale dichiarazione, la risorsa dati può essere indirizzata solo attraverso la variabile, l'auto indirizzamento via "::<rsource name>" non funziona.

#resource "\\Images\\euro.bmp" as bitmap euro[][]
#resource "\\Images\\dollar.bmp"
//+------------------------------------------------------------------+
//|  OBJ_BITMAP_LABEL funzione creazione oggetto usando la risorsa   |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Funzione start del programma Script                        |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- grandezza output dell'immagine [larghezza, altezza] memorizzata nella variabile risorsa euro
   Print(ArrayRange(euro,1),", ",ArrayRange(euro,0));
//--- cambia l'immagine in euro - disegna la riga orizzontale red horizontal nel mezzo
   for(int x=0;x<ArrayRange(euro,1);x++)
      euro[ArrayRange(euro,1)/2][x]=0xFFFF0000;
//--- crea la risorsa grafica utilizzando la variabile risorsa
   ResourceCreate("euro_icon",euro,ArrayRange(euro,1),ArrayRange(euro,0),0,0,ArrayRange(euro,1),COLOR_FORMAT_ARGB_NORMALIZE);
//--- Crea l'oggetto grafico etichetta Euro, a cui verrà impostata l'immagine dalla risorsa euro_icon
   Image("Euro","::euro_icon",10,40);
//--- un altro metodo di applicazione della risorsa, non si può disegnare su esso
   Image("USD","::Images\\dollar.bmp",15+ArrayRange(euro,1),40);
//--- il metodo diretto di indirizzare la risorsa euro.bmp non è disponibile in quanto è già stata dichiarata tramite la variabile risorsa euro
   Image("E2","::Images\\euro.bmp",20+ArrayRange(euro,1)*2,40); // il tempo di esecuzione deve avvenire
  }

Risultato di esecuzione Script – solo due OBJ_BITMAP_LABEL oggetti su tre sono stati creati. L'immagine del primo oggetto ha la striscia rossa nel mezzo.

res_variables

Un importante vantaggio di applicare le risorse è che i file di risorse vengono compressi automaticamente prima di essere inclusi in un file eseguibile EX5 prima della compilazione. Così, l'uso delle variabili di risorse consente di mettere tutti i dati necessari direttamente nel file eseguibile EX5, nonché ridurre il numero e la dimensione totale dei file rispetto al modo tradizionale di scrivere programmi MQL5.

L'utilizzo delle variabili di risorse è particolarmente conveniente per i prodotti editoriali nel Market.

Caratteristiche

  • La speciale risorsa variabile di tipo bitmapinforma il compilatore che la risorsa è un'immagine. Tali variabili ricevono il tipo uint.
  • L'array del tipo di variabile risorsa bitmappuò avere due dimensioni. In questo caso, la dimensione dell'array è definita come [altezza_immagine] [larghezza_immagine]. Se non viene specificato un array ad una dimensione, il numero di elementi è pari ad altezza_immagine * larghezza_immagine.
  • Durante il download di immagini a 24 bit, il componente canale alfa è impostato a 255 per tutti i pixel dell'immagine.
  • Quando si scarica un'immagine a 32 bit senza il canale alfa, la componente canale alfa è anche impostata a 255 per tutti i pixel dell'immagine.
  • Quando si scarica un'immagine a 32 bit con il canale alfa, i pixel non vengono elaborati in alcun modo.
  • La grandezza del file di risorse non può superare i 128 Mb.
  • Il rilevamento automatico di codifica presenza da BOM (header) viene eseguita per i file di stringa. Se BOM è assente, la codifica è definita dal contenuto del file. Sono supportati i file nei ANSI, UTF-8 e UTF-16. Tutte le stringhe vengono convertite in Unicode durante la lettura dei dati dai file.

OpenCL programs

L'utilizzo delle variabili stringa risorsa può facilitare notevolmente lo sviluppo di alcuni programmi. Ad esempio, si è in grado di scrivere un codice di un programma OpenCL in un file CL separato e poi includerlo come una stringa nella vostre risorse MQL5 del programma.

#resource "seascape.cl" as string cl_program
...
int context;
if((cl_program=CLProgramCreate(context,cl_program)!=INVALID_HANDLE)
  {
   //--- esegue ulteriori azioni, con un programma OpenCL
  }

In questo esempio, si sarebbe dovuto scrivere l'intero codice come un'unica grande stringa se non sono stati usati variabili risorsecl_program.

Vedi anche

ResourceCreate(), ResourceSave(), PlaySound(), ObjectSetInteger(), ChartApplyTemplate(), Funzioni con i Files