Uso delle Risorse in MQL5
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:
- Disegno delle emissioni dell'indicatore in MQL5
- Creazione di un Indicatore con Opzioni di Controllo Grafico
- Creazione di un Gioco "Snake" in MQL5
- Creazione di Pannelli di Controllo Attivi in MQL5 per il Trading
- Collegamento di un Expert Advisor con ICQ in MQL5
- Un Gestore di Ordini Virtuale per tenere traccia degli ordini all'interno dell'ambiente MT5 incentrato sulla posizione
- Creazione di una Bacheca Informativa utilizzando le Classi della Libreria Standard e Google Chart API
- Costruire un Analizzatore di Spettro
- Creazione di Expert Advisor interattivo semiautomatico drag-and-drop basato su rischio predefinito e rapporto R/R
È 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:
- Creare un oggetto utilizzando la funzione ObjectCreate().
- 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.
- In ObjectSetInteger(), impostare i valori delle coordinate X e Y (OBJPROP_XDISTANCE e OBJPROP_YDISTANCE).
- Utilizzando ObjectSetString(), impostare sull'oggetto grafico il valore della proprietà OBJPROP_BMPFILE (uno per BITMAP o due per OBJ_BITMAP_LABEL).
- 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();
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.
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
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso