English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
preview
Uso delle Risorse in MQL5

Uso delle Risorse in MQL5

MetaTrader 5Esempi | 17 dicembre 2021, 14:28
321 0
MetaQuotes
MetaQuotes


L'Importanza dell'Interfaccia nei Programmi Moderni

Molto tempo fa, lo scopo principale dei programmi per computer era eseguire pesanti calcoli matematici ed elaborare grandi quantità di dati. Ma con l'aumento della potenza dei computer, le priorità sono cambiate. Ora, tra due programmi con funzionalità identiche, un utente sceglie quello con cui è più facile lavorare.

Al giorno d'oggi, non è sufficiente scrivere un programma secondo l'algoritmo di calcolo richiesto, ma è anche necessario fornire un'interfaccia grafica facile da usare. Anche l'analisi tecnica è nata dal desiderio dei trader di avere una rappresentazione visiva dello stato attuale del mercato: linee di tendenza, livelli di supporto e resistenza, vari canali e indicatori tecnici sono stati sviluppati per mostrare un quadro oggettivo di ciò che sta accadendo.

Il nuovo linguaggio MQL5 ha fornito strumenti ancora più potenti per la creazione di applicazioni completamente funzionali, che non richiedono altro che il Client Terminal MetaTrader 5. In questo articolo, mostreremo come utilizzare le Risorse per creare un file eseguibile EX5 con un'interfaccia intuitiva e questo file non richiederà operazioni di routine come l'installazione o l'avvio.


Le Possibilità di MQL5

Innanzitutto, ovviamente, la possibilità di lavorare con la grafica è molto importante. Negli articoli, puoi trovare alcuni esempi, eccone alcuni:

È l'uso di elementi grafici che rende un programma più interessante e facile da controllare dal punto di vista dell'utente. Oltre ai classici strumenti per Analisi tecnica, il terminale MetaTrader 5 offre un'ampia gamma dioggetti grafici che possono essere usati come mattoni per costruire la tua interfaccia grafica.


Utilizzo di File Immagine per la Creazione dell'Interfaccia

Per creare un'interfaccia speciale, vengono utilizzate molto spesso immagini da file grafici. Ciò consente di ottenere un design unico e riconoscibile di vari elementi di controllo. Il linguaggio MQL5 offre due oggetti grafici che utilizzano la grafica:

  • OBJ_BITMAP - l'oggetto Bitmap permette di scaricare un'immagine da unfile BMP e di visualizzarla su un grafico;
  • OBJ_BITMAP_LABEL - l'Etichetta Grafica è in realtà un pulsante la cui immagine cambia a seconda del suo stato (schiacciato/premuto).

Questi due oggetti consentono di creare un'enorme varietà di controlli e di confrontarli con i gestori di Eventi "click del Mouse" (CHARTEVENT_OBJECT_CLICK). Per impostare l'immagine desiderata per OBJ_BITMAP o OBJ_BITMAP_LABEL, specificare il file BMP desiderato nella proprietà OBJPROP_BMPFILE. Ciò può essere fatto manualmente nel tab "Parametri" dell'oggetto grafico.


Il secondo e principale modo per un programmatore MQL5 consiste nello specificare un nome di file per la proprietà OBJPROP_BMPFILE utilizzando la funzione ObjectSetString(). Ad esempio:

   //--- Load an image for the "Pressed" button state
   bool set=ObjectSetString(0,object_name,OBJPROP_BMPFILE,0,bmp_file_name);

Un algoritmo standard di utilizzo di OBJ_BITMAP o OBJ_BITMAP_LABEL:

  1. Creare un oggetto utilizzando la funzione ObjectCreate().
  2. Utilizzando la funzione ObjectSetInteger(), ancorare l'oggetto all'angolo del grafico desiderato, se necessario. Le coordinate X e Y del punto di ancoraggio in pixel verranno impostate rispetto a questo angolo.
  3. In ObjectSetInteger(), impostare i valori delle coordinate X e Y (OBJPROP_XDISTANCE e OBJPROP_YDISTANCE).
  4. Utilizzando ObjectSetString(), impostare sull'oggetto grafico il valore della proprietà OBJPROP_BMPFILE (uno per BITMAP o due per OBJ_BITMAP_LABEL).
  5. Per l'oggetto OBJ_BITMAP_LABEL, utilizzando ObjectSetInteger() puoi impostare lo stato iniziale del pulsante - schiacciato o premuto (OBJPROP_STATE è vero o falso).

Dopo aver creato e configurato l'oggetto, durante l'esecuzione del programma MQL5, puoi modificare dinamicamente non solo la posizione e la condizione dell'oggetto grafico, ma anche modificare il valore della proprietà OBJ_BITMAP_LABEL per mostrare le immagini. Pertanto, l'interfaccia può essere molto flessibile e riconfiguratile.


Riproduzione di Suoni

Un'ulteriore comodità richiesta nei programmi è la possibilità di chiedere ad un utente un'azione in caso di una determinata situazione. Per implementare questa interazione inversa, spesso viene utilizzata la riproduzione di suoni diversi, a seconda dell'evento. Questo solleverà il trader da una continua osservazione dei grafici dei prezzi, attirando la sua attenzione solo nei casi necessari. Per riprodurre file audio, in MQL5 viene utilizzata la funzione PlaySound().

PlaySound() è molto facile da usare e richiede solo la specifica del percorso di un file audio:

//--- The path to a sound file  
string wav_file_name="Ok.wav";
...
//--- Play a sound from the file terminal_directory\Sounds\Ok.wav
bool played=PlaySound(wav_file_name);
if(!played)
  //--- Failed to play the sound, notify of this
  {
   PrintFormat("Failed to play file %s. Error code=%d", wav_file_name, GetLastError());
  }


Dove Trovare i File Audio e Immagine

Le funzioni ObjectSetString() e PlaySound()richiedono la specifica di un percorso a un file. Per motivi di sicurezza, tutti i file utilizzati nei programmi MQL5 si trovano all'interno della sandbox dei file. Ciò significa che i file possono essere archiviati solo in determinate directory, non è consentito lavorare con file di altre directory. Innanzitutto, devi conoscere quali directory sono disponibili per le operazioni e le funzioni sui file e come vengono denominate.

Ci sono tre diverse directory:

  • Directory del terminale: la directory di installazione del client terminale. MetaTrader 5 viene avviato da questa directory, per visualizzare la cartella selezionare "File"-"Open terminal data" nel menu del terminale.
  • Directory dei dati del terminale- la cartella che memorizza i dati di un determinato utente di Windows. I meccanismi di protezione integrati nel sistema operativo differenziano l'accesso degli utenti, quindi i dati di ciascun utente possono essere archiviati separatamente da quelli degli altri utenti. Quindi, in questa directory, nella sottocartella MQL5, sono archiviati tutti gli indicatori, gli Expert Advisor e gli script visualizzati nella finestra Navigator.
  • La cartella condivisa di tutti i terminali (di tutti i client Terminal MetaTrader 5 installati sul computer) - una cartella per eseguire operazioni sui file utilizzando il flag FILE_COMMON.

Per determinare la posizione di queste directory, puoi utilizzare lo script WhereMyFolders.mq5:

//+------------------------------------------------------------------+
//|                                               WhereMyFolders.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- The folder from which the terminal is started - terminal_directory
   string terminal_path=TerminalInfoString(TERMINAL_PATH);
//--- The folder that stores the terminal data - terminal_data_directory
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
//--- The shared folder of all client terminals - common_terminal_folder
   string common_data_path=TerminalInfoString(TERMINAL_COMMONDATA_PATH);   
   //--- Show all the paths 
   Print("TERMINAL_PATH(terminal_directory) = ",TerminalInfoString(TERMINAL_PATH));
   Print("TERMINAL_DATA_PATH(terminal_data_directory) = ",TerminalInfoString(TERMINAL_DATA_PATH));
   Print("TERMINAL_COMMONDATA_PATH(comon_terminal_folder) = ",TerminalInfoString(TERMINAL_COMMONDATA_PATH));   
  }

Importante: In alcuni casi, la posizione diterminal_directory eterminal_data_directory può coincidere, ma è meglio non basarsi mai su questo e, quindi, non confondere questi concetti.

I file immagine e audio vengono cercati dal sistema runtime del terminale nel seguente ordine:

  • se il separatore backslash "\" (scritto come "\\") è posto all'inizio del percorso, esso ricerca la risorsa relativo alla directory terminal_data_directory\MQL5\;
  • se non è presente un back slash all'inizio del percorso, viene cercato il file relativo alla posizione del file EX5, da cui viene chiamata la funzione ObjectSetString(... , OBJPROP_BMPFILE, ...) o PlaySound();
Per la funzione PlaySound(), c'è un'aggiunta: se il file non è stato trovato utilizzando i due metodi precedenti, questo file audio viene cercato in relazione a terminal_directory\Sounds\.


Esempi per i file Audio:

  • Il file one.wav verrà cercato in terminal_data_directory\MQL5\
    PlaySound("\\one.wav");
  • Il file two.wav verrà cercato in terminal_data_directory\MQL5\Files\
    PlaySound("\\Files\\two.wav");
  • Il file three.wav verrà cercato in terminal_data_directory \MQL5\MySounds\
    PlaySound("\\MySounds\\three.wav");
  • Il file four.wav verrà cercato nella cartella da cui l'eseguibile EX5 è in esecuzione. Se questo file non viene trovato in questa cartella, tenterà di trovare il file nella cartella terminal_directory\Sounds\.
    PlaySound("four.wav");


Esempi di file immagine:

  • Il file bird.bmp verrà cercato in terminal_data_directory\MQL5\
    //--- Setting an image for the OBJ_BITMAP_LABEL object
    bool res=ObjectSetString(0,object_name,OBJPROP_BMPFILE,0,"bird.bmp");// Modifier 0 is specified
  • swan.bmp verrà cercato in terminal_data_directory\MQL5\Files\
    //--- Setting an image for the OBJ_BITMAP object
    bool set=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"\\Files\\swan.bmp");// No modifier
  • dog.bmp verrà cercato in terminal_data_directory\MQL5\MyPictures\
    //--- Setting an image for OBJ_BITMAP
    bool done=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"\\MyPictures\\dog.bmp");// No modifier
  • cat.bmp verrà cercato nella cartella da cui è in esecuzione il file eseguibile EX5
    //--- Setting an image for OBJ_BITMAP
    bool result=ObjectSetString(0,object_name,OBJPROP_BMPFILE,"cat.bmp");// No modifier

Si noti che il doppio back slash "\\" viene utilizzato come separatore durante la scrittura del percorso.

Importante: Quando si specifica il percorso, utilizzare sempre doppio back slash come separatore, poiché un singolo back slash è un carattere di controllo per il compilatore durante l'analisi delle righe costanti e delle costanti di carattere nel codice sorgente di un programma.


Nuove Possibilità - Risorse

Per utilizzare immagini e suoni nel tuo programma MQL5, assicurati che tutti i file multimediali che utilizza si trovino nelle cartelle appropriate. Ciò impone un netto svantaggio durante il trasferimento di un file EX5 compilato da un terminale all'altro. Tuttavia, è possibile risolvere questo problema nella fase di scrittura del codice. In questi casi utilizzare le risorse.

Per utilizzare una risorsa in un programma, dovrebbe essere dichiarata utilizzando la direttiva del compilatore #resource

 #resource path_to_resource_file

Ora, questa risorsa può essere utilizzata al posto di un percorso di file. 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 ei suoni necessari possono essere localizzati direttamente in un file EX5. Ora, per avviare un programma MQL5 in un altro terminale, non sarà necessario trasmettere tutti i file in esso utilizzati .

Qualsiasi file EX5 può contenere le risorse, e qualsiasi programma EX5 può utilizzare le risorse da un altro programma EX5. In altre parole, un Expert Advisor può utilizzare le risorse che si trovano in un indicatore o in una libreria EX5. Questa è una comodità in più dall'uso delle risorse.

L'uso delle risorse consente di ottenere tutto in uno: il file eseguibile stesso e tutte le risorse che utilizza sono impacchettate in un file EX5 durante la compilazione di un codice sorgente.


Ricerca di Risorse da parte di un Compiler

Una risorsa viene specificata utilizzando la direttiva #resource "<percorso del file di risorse>"

 #resource "<path_to_resource_file>"
La lunghezza della stringa costante <path_to_resource_file> non deve superare i 63 caratteri. Il compilatore cerca una risorsa nel percorso specificato nel seguente ordine:1
  • Se il back slash "\" viene posizionato all'inizio del percorso, la risorsa viene cercata rispetto alla cartella terminal_data_directory\MQL5\,
  • se non c'è il backslash, esso cerca la risorsa relativa alla posizione del file di origine, in cui è scritta la risorsa.

Importante: Nel percorso della risorsa, è inaccettabile utilizzare le sottostringhe "..\\" e ":\\".

Esempi di risorse includendo anche dall'argomento della Guida Risorse:

//--- Correct specification of a resource
#resource "\\Images\\euro.bmp" // euro.bmp is located in terminal_data_directory\MQL5\Images\
#resource "picture.bmp"        // picture.bmp is locate in the same directory with the source file
#resource "Resource\\map.bmp"  // The resource is located in the folder source_file_directory\Resource\map.bmp
 
//--- incorrect specification of resources
#resource ":picture_2.bmp"     // Use of ":" is not allowed
#resource "..\\picture_3.bmp"  // Use of ".." is not allowed
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" //More than 63 characters


Nomi delle Risorse

Dopo la dichiarazione di una risorsa utilizzando la direttiva #resource, può essere utilizzata in qualsiasi parte di un programma. Per il nome della risorsa, verrà utilizzato il suo percorso senza slash all'inizio della stringa che definisce il percorso della risorsa.

Esempi:

//---Examples of specifying resources and their names in the comments
#resource "\\Images\\cat.bmp"           // Resource name - Images\cat.bmp
#resource "dog.bmp"                     // Resource name - dog.bmp
#resource "Resource\\map.bmp"           // Resource name - Resource\map.bmp
#resource "\\Files\\Pictures\\bird.bmp" // Resource name - Files\Pictures\bird.bmp
#resource "\\Files\\good.wav"           // Resource name - Files\good.wav"
#resource "\\Sounds\\thrill.wav"        // Resource name - Sounds\thrill.wav"

I nomi delle risorse non fanno distinzione tra maiuscole e minuscole: per il compilatore, i nomi dog.bmp e DOG.bmp avranno lo stesso significato.


Utilizzo di Risorse Proprie e di Terze Parti

Per utilizzare una risorsa, dovresti specificarne il nome. Il nome della risorsa è il suo percorso senza back slash all'inizio della riga. Quando usi la tua risorsa, l'attributo speciale "::" dovrebbe essere aggiunto prima del nome della risorsa.

//--- Use of resources
ObjectSetString(0,bitmap_name,OBJPROP_BMPFILE,0,"::Images\\cat.bmp");
...
ObjectSetString(0,my_bitmap,OBJPROP_BMPFILE,0,"::dog.bmp");
...
set=ObjectSetString(0,bitmap_label,OBJPROP_BMPFILE,1,"::Files\\Pictures\\bird.bmp");
...
PlaySound("::Files\\good.wav");
...
PlaySound("::Sounds\\thrill.wav");

Puoi utilizzare non solo le tue risorse (dal tuo file EX5), ma anche da qualsiasi libreria e moduli EX5. Pertanto, è puoi creare un archivio di risorse e utilizzarle in molti altri programmi mql5.

Per utilizzare le risorse di un altro file EX5, il nome della risorsa deve essere specificato nel formato <EX5_file_name_path>::<resource_name>. Ad esempio, supponiamo che lo script Draw_Triangles_Script.mq5 contenga 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 - "::Files\triangle.bmp". Per poter utilizzare la stessa risorsa da un altro programma, ad esempio da un Expert Advisor, dobbiamo aggiungere al nome della risorsa il percorso del file EX5 relativo a terminal_data_directory\MQL5\ e il nome del file EX5 dello script - Draw_Triangles_Script.ex5. Supponi che lo script si trovi nella cartella standard terminal_data_directory\MQL5\Scripts\, allora la chiamata deve essere scritta nel seguente modo:

//--- Use of a script resource in an Expert Advisor
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\triangle_1.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 quanto segue: Se un Expert Advisorsi trova interminal_data_directory\MQL5\Experts\e una risorsa dal fileDraw_Triangles_Script.ex5 ci è stata richiesta senza specificare il percorso, allorail file verrà cercato interminal_data_directory\MQL5\Experts\.

//--- Request for a resource from a script in an Expert Advisor without path specification
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle_1.bmp");


Compressione delle risorse nei file EX5 - Come funziona

I file in BMP e WAV vengono compressi automaticamente prima di essere inclusi in un file eseguibile EX5. Ciò significa che l'utilizzo delle risorse non solo consente di creare programmi MQL5 completi, ma riduce anche la dimensione complessiva dei file richiesti dal terminale quando si utilizzano immagini e suoni, rispetto al modo convenzionale di scrivere programmi MQL5.

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

Importante: Un ulteriore vantaggio dell'utilizzo delle risorse è la compressione automatica dei file WAV e BMP quando vengono compressi in un file eseguibile EX5. Ciò non solo riduce la quantità ma anche la dimensione dei file utilizzati dal programma.

Ad esempio, considera un piccolo programma Animals_EA.mq5. Di seguito, viene fornito un piccolo blocco di codice per l'utilizzo delle risorse:

//+------------------------------------------------------------------+
//|                                                   Animals_EA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- Declare image resources
#resource "\\Images\\cat.bmp"
#resource "\\Images\\dog.bmp"
#resource "\\Images\\cow.bmp"
#resource "\\Images\\bird.bmp"
//--- Declare sound resources
#resource "\\Files\\MySounds\\cat.wav"
#resource "\\Files\\MySounds\\dog.wav"
#resource "\\Files\\MySounds\\cow.wav"
#resource "\\Files\\MySounds\\bird.wav"
//--- Object names
string cat_dog="cat_dog";
string cow_bird="cow_bird";
string canvas="canvas";
string text="text";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Create a substrate
   CreateCanvas(canvas,50,50,500,500);
//--- Create buttons
   CreateObjectBITMAP_LABEL(cat_dog,110,120,"::Images\\cat.bmp","::Images\\dog.bmp");
   CreateObjectBITMAP_LABEL(cow_bird,110,330,"::Images\\cow.bmp","::Images\\bird.bmp");
   CreateText(text,"Click on any graphical object",200,90,clrTan);
//--- Give a command for an immediate refresh to see the object
   ChartRedraw();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|  Creating OBJ_BITMAP_LABEL with the specified images          |
//+------------------------------------------------------------------+
bool CreateObjectBITMAP_LABEL(string obj_name,int X,int Y,string res_name1,string res_name2)
  {
//--- If there is no such an object on the chart
   if(ObjectFind(0,obj_name)==-1)
     {
      //--- Create it
      bool res=ObjectCreate(0,obj_name,OBJ_BITMAP_LABEL,0,0,0);
      //--- Check the result
      if(!res)
        {
         PrintFormat("%s: Failed to create OBJ_BITMAP_LABEL with the name %s. Error code=%d",
                     __FUNCTION__,
                     GetLastError());
         return false;
        }
     }

//--- Set the coordinates
   ObjectSetInteger(0,obj_name,OBJPROP_XDISTANCE,X);
   ObjectSetInteger(0,obj_name,OBJPROP_YDISTANCE,Y);
//--- Disable display on the background
   ObjectSetInteger(0,obj_name,OBJPROP_BACK,false);
//--- Reset the error code
   ResetLastError();
//--- Set an image for the pressed condition
   bool res=ObjectSetString(0,obj_name,OBJPROP_BMPFILE,0,res_name1);
//--- Check the operation result
   if(!res)
     {
      PrintFormat("%s: Failed to upload an image from the resource %s. Error code=%d",
                  __FUNCTION__,
                  res_name1,
                  GetLastError());
      return false;
     }
//--- Set an image for the depressed state
   res=ObjectSetString(0,obj_name,OBJPROP_BMPFILE,1,res_name2);
//--- Check the operation result
   if(!res)
     {
      PrintFormat("%s: Failed to upload an image from the resource %s. Error code=%d",
                  __FUNCTION__,
                  res_name2,
                  GetLastError());
      return false;
     }
//--- Set the button pressed
   ObjectSetInteger(0,obj_name,OBJPROP_STATE,true);
   return true;
  }
//+------------------------------------------------------------------+

Il compito del programma è disegnare su uno sfondo blu (substrato), due pulsanti grafici che cambiano il loro aspetto con un click del mouse. Quando clicchi sul substrato, cambia il suo colore da blu a beige e viceversa. Ad ogni modifica, viene riprodotto un suono, l'evento del click del mouse viene gestito nella funzione OnChartEvent(). Nella figura viene mostrato un grafico subito dopo l'inizio di Adviser Animals_EA.mq5.



Dai un'occhiata alle proprietà dell'oggetto OBJ_BITMAP_LABEL, ad esempio cat_dog. La modifica delle proprietà di File Bitmap (On) e File Bitmap (Off) è ora impossibile tramite una finestra di dialogo, questi campi non sono disponibili e sono in grigio.


Importante: Negli oggetti grafici, le immagini caricate dalle risorse possono essere modificate solo a livello di programma. La modifica manuale di queste proprietà tramite la finestra delle Proprietà dell'oggetto diventa non disponibile.

Il volume totale delle immagini utilizzate dall'Expert Advisor Animals_EA.mq5 è di 430 kb.


Tuttavia, la dimensione del file eseguibile risultante Animals_EA.ex5, che contiene tutte queste immagini, è di 339 kb. Quindi, invece di 9 file (un file MQ5, quattro file BMP e quattro file WAV), ora abbiamo un file EX5 che contiene tutte le risorse necessarie per il programma.

Nelle risorse, è possibile utilizzare solo immagini in formato BMP a 24 o 32 bit. BMP a 32 bit può contenerealpha compositing - in questo caso verranno applicati a un grafico con trasparenza.

Il file dell'Expert Advisor Animals_EA.mq5, le immagini e i suoni sono allegati all'articolo:

  • Le immagini devono essere decompresse da архива images.zip a terminal_data_directory\MQL5\Images\
  • I suoni da MySounds.zip devono essere decompressi in terminal_data_directory\MQL5\Files\MySounds\

Se vuoi testare questo programma nel tuo terminale, scarica semplicemente l'allegato compilato Expert Advisor Animals_EA.ex5 che contiene tutte le risorse necessarie. In questo caso, non è necessario scaricare ed installare i file immagine e audio.


Lavorare con indicatori personalizzati inclusi 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, viene riportato un esempio di inclusione ed utilizzazione dell'indicatore personalizzato SampleIndicator.MQL5 che si trova interminal_data_folder\MQL5\Indicators\ directory:

//+------------------------------------------------------------------+
//|                                                     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);
  }

Il caso in cui 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 di iCustom() nella 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 viene fornito di seguito:

//+------------------------------------------------------------------+
//|                                              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()
  {
//--- the wrong way to provide a link to itself
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";  
//--- the right way to receive a link to itself
  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;
//--- get the absolute path to the application
   string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- find the position of "\MQL5\" substring
   int    pos =StringFind(path,"\\MQL5\\");
//--- substring not found - error
   if(pos<0)
      return(NULL);
//--- skip "\MQL5" directory
   pos+=5;
//--- skip extra '\' symbols
   while(StringGetCharacter(path,pos+1)=='\\')
      pos++;
//--- if this is a resource, return the path relative to MQL5 directory
   if(StringFind(path,"::",pos)>=0)
      return(StringSubstr(path,pos));
//--- find a separator for the first MQL5 subdirectory (for example, MQL5\Indicators)
//--- if not found, return the path relative to MQL5 directory
   if((pos2=StringFind(path,"\\",pos+1))<0)
      return(StringSubstr(path,pos));
//--- return the path relative to the subdirectory (for example, 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);
  }


Risparmiare la Memoria del Terminale

Ogni risorsa viene caricata nella memoria del terminale una sola volta. Durante il normale utilizzo, ogni accesso al file provoca un caricamento aggiuntivo del file nella memoria. Ad esempio, supponiamo di avere 50 oggetti OBJ_BITMAP, ognuno dei quali contiene la stessa immagine di 100 kb. Quindi, durante il normale utilizzo, questi 50 oggetti richiederebbero la memoria 50*100kb=5Mb.

Se dichiariamo una risorsa per l'immagine caricata, questa immagine verrà caricata in memoria una sola volta, indipendentemente dal numero di oggetti in cui viene utilizzata.

Importante: Le risorse vengono caricate in memoria solo una volta e possono risparmiare memoria se utilizzate più volte.


Conclusione

L'uso delle risorse facilita l'utilizzo e la distribuzione dei programmi MQL5. La creazione di strumenti comodi e moderni per il trading richiede l'uso di immagini e file audio basati su file multimediali. Il concetto di risorsa in MQL5 è semplice e facile da capire, quindi prova a verificarlo.

Le immagini in formato BMP a 32 bit possono contenere alpha compositing - in questo caso verranno applicate a un grafico con trasparenza.

Le risorse offrono i seguenti vantaggi:

  • Compattezza: tutti i file sono compressi in un singolo file eseguibile EX5, quindi il programma è facile da trasmettere e lanciare;
  • Salvataggio della memoria: la memoria del terminale contiene sempre una sola istanza di ciascuna risorsa, indipendentemente dalla frequenza del suo utilizzo in un programma;
  • Memorizzazione conveniente: un file EX5 con tutte le risorse è inferiore alla somma dell'immagine originale e dei file audio.

Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/261

File allegati |
mysounds.zip (65.89 KB)
images.zip (214.29 KB)
wheremyfolders.mq5 (1.46 KB)
animals_ea.mq5 (18 KB)
animals_ea.ex5 (393.38 KB)
Crea i Tuoi Pannelli Grafici in MQL5 Crea i Tuoi Pannelli Grafici in MQL5
L'usabilità del programma MQL5 è determinata sia dalla sua ricca funzionalità che da un'elaborata interfaccia utente grafica. La percezione visiva a volte è più importante del funzionamento rapido e stabile. Ecco una guida step-by-step per la creazione di pannelli di visualizzazione sulla base delle classi della Libreria Standard.
Indicatori e Sistemi di Trading di William Blau in MQL5. Parte 1: Indicatori Indicatori e Sistemi di Trading di William Blau in MQL5. Parte 1: Indicatori
L'articolo presenta gli indicatori, descritti nel libro di William Blau "Momentum, Direction, and Divergence". L'approccio di William Blau ci consente di approssimare tempestivamente e accuratamente le fluttuazioni della curva dei prezzi, di determinare l'andamento dei movimenti dei prezzi e dei punti di svolta ed eliminare il rumore dei prezzi. Nel frattempo, siamo anche in grado di rilevare gli stati di ipercomprato/ipervenduto del mercato e segnali, che indicano la fine di una tendenza e l'inversione del movimento dei prezzi.
MetaTrader 5 - Più di Quanto Tu Possa Immaginare! MetaTrader 5 - Più di Quanto Tu Possa Immaginare!
Il client terminal MetaTrader 5 è stato sviluppato da zero e supera di gran lunga il suo predecessore, ovviamente. La nuova piattaforma di trading offre opportunità illimitate per il trading in qualsiasi mercato finanziario. Inoltre, la sua funzionalità continua ad espandersi per offrire funzionalità e praticità ancora più utili. Quindi, ora è abbastanza difficile elencare tutti i numerosi vantaggi di MetaTrader 5. Abbiamo cercato di descriverli brevemente in un articolo e siamo rimasti sorpresi dal risultato; l'articolo è tutt'altro che breve!
Costruire un Analizzatore di Spettro Costruire un Analizzatore di Spettro
Questo articolo ha lo scopo di far conoscere ai suoi lettori una possibile variante dell'utilizzo di oggetti grafici del linguaggio MQL5. Analizza un indicatore, che implementa un pannello di gestione di un semplice analizzatore di spettro utilizzando gli oggetti grafici. L'articolo è pensato per i lettori che hanno acquisito le basi di MQL5.