Libreria grafica GUI per MetaTrader: guida all’installazione e all’utilizzo
✔️ Libreria grafica GUI MT4©: https://www.mql5.com/en/market/product/206760
✔️ Libreria grafica GUI MT5©: https://www.mql5.com/en/market/product/206761
✔️ Documentazione completa, galleria degli elementi e strumento Image to Code5: https://www.betasoft.dev/gui-graphic-library
Una tabella delle posizioni, una scheda degli ordini e un grafico in tempo reale.
La libreria grafica GUI offre ai tuoi Expert Advisor e indicatori un'interfaccia completa: finestre, schede, menu, tabelle, grafici, selettori, finestre di dialogo e widget di trading. Tutto è disegnato su un'unica tela, lo stesso codice funziona in MetaTrader 4 e MetaTrader 5 e l'intera API è composta da 15 funzioni.
Questa guida ti accompagnerà dal download al tuo primo pannello di controllo funzionante, e poi alle attività che svolgerai più frequentemente. Ogni esempio di codice utilizza solo il file di inclusione pubblico, quindi puoi incollarlo nel tuo programma.
Una piccola parte dei 78 elementi: pulsanti, campi di input, cursori e schede.
1. Prima di iniziare
- MetaTrader 4 o MetaTrader 5 su Windows. I caratteri e le icone seguono la scala di visualizzazione di Windows (100, 125, 150 e 200 percento).
- MetaEditor, per compilare le demo e i tuoi programmi.
- Non c'è nulla da consentire nelle opzioni del terminale: la libreria non utilizza DLL, non effettua richieste web e non utilizza variabili globali del terminale.
- Le versioni MT4 e MT5 sono prodotti separati. Installa quella compatibile con il tuo terminale.
2. Installazione
- Nel terminale, seleziona File, quindi Apri cartella dati.
- Apri la cartella MQL5 (MetaTrader 5) o la cartella MQL4 (MetaTrader 4).
- Copia ciascun file nella cartella indicata nella tabella sopra: Librerie, Includi, Esperti e Indicatori.
- Apri ciascuna demo in MetaEditor e premi F7. Il risultato dovrebbe essere 0 errori, 0 avvisi.
- Tornati al terminale, aggiornate il Navigatore (clic destro, Aggiorna) in modo che vengano visualizzati i nuovi programmi.
Le cartelle dovrebbero apparire così:
MQL5/
Include/GUI_Graphic_Library.mqh
Libraries/GUI_Graphic_Library.ex5
Experts/GUI_Graphic_Library_FullDemo.mq5
GUI_Graphic_Library_ElementTests.mq5
Indicators/GUI_Graphic_Library_IndicatorWindow.mq5
GUI_Graphic_Library_IndicatorChart.mq5
MQL4/ the same files with .mq4 and .ex4
Non rinominare il file della libreria. Il file di inclusione lo carica con quel nome.
Controlli dopo l'installazione
| Controllo | Dove |
|---|---|
| Il file .ex5 (o .ex4) si trova nelle Librerie | Cartella dati |
| Il file .mqh si trova in Include | Cartella dati |
| La demo viene compilata senza errori. | MetaEditor |
| La demo mostra una finestra sul grafico | Grafico |
| La scheda Esperti non contiene righe "non supportato". | Terminale, cassetta degli attrezzi |
Cosa contiene GUI_Graphic_Library.mqh?
Il file di inclusione è volutamente piccolo. Sopra il blocco di importazione dichiara gli enum (tipi di oggetto, proprietà, eventi, temi e icone). Il blocco di importazione sottostante carica la libreria compilata ed elenca le sue 15 funzioni. MetaTrader 5 carica il file .ex5 e MetaTrader 4 carica il file .ex4, scelto dal compilatore. Il file va incluso, non modificato.
#ifdef __MQL5__ #import "\\Market\\GUI_Graphic_Library.ex5" #else #import "\\Market\\GUI_Graphic_Library.ex4" #endif string Gui_Version(); bool Gui_Create( const long chart= 0 , const string name= "GUI_Graphic_Library" , const int subwin= 0 ); void Gui_Destroy(); void Gui_ChartEvent( const int id, const long lparam, const double dparam, const string sparam); void Gui_Timer(); void Gui_Update( const bool force= false ); bool Gui_NextEvent(ENUM_GUI_EVENT &event, int &sender, long &lparam, double &dparam, string &sparam); int Gui_Add( const ENUM_GUI_OBJECT type, const int parent, const string name, const string text, const int x, const int y, const int w, const int h); int Gui_Set( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE , const double c= EMPTY_VALUE , const double d= EMPTY_VALUE ); string Gui_Get( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE ); double Gui_GetNum( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE ); int Gui_SetArray( const int id, const ENUM_GUI_PROP prop, const double &values[], const double a= EMPTY_VALUE ); int Gui_AddImage( const string name, const uint &argb[], const int w, const int h); int Gui_Find( const string name); void Gui_BringToFront(); #import
Le 15 funzioni nell'ordine in cui appaiono:
| Funzione | Cosa fa | Dove lo chiami |
|---|---|---|
| Versione GUI | Restituisce la versione della libreria in formato testo. | Ovunque |
| Gui_Create | Avvia l'interfaccia grafica su un grafico. Passa 0 per il grafico corrente, un nome per il tuo programma e un numero di sottofinestra per gli indicatori. Restituisce true se l'operazione è andata a buon fine. | OnInit |
| Gui_Destroy | Rimuove l'interfaccia grafica e tutto ciò che essa visualizzava. | OnDeinit |
| Gui_ChartEvent | Fornisce l'evento del grafico (mouse, tasti, clic) alla libreria. | OnChartEvent |
| Timer GUI | Gestisce i timer della libreria: animazioni, notifiche, contatori. | OnTimer |
| Aggiornamento dell'interfaccia utente | Ricolora ciò che è cambiato. Passa true per ridipingere tutto. | Fine di ciascun gestore |
| Gui_NextEvent | Prende l'evento successivo dalla coda (clic, modifica, risultato di dialogo, richiesta di scambio). Restituisce false quando la coda è vuota. | Ciclo degli eventi |
| Gui_Add | Crea un elemento e ne restituisce l'ID. È possibile specificare il tipo, l'elemento padre, un nome, il testo e le coordinate x, y, larghezza e altezza. | OnInit |
| Gui_Set | Modifica una proprietà o esegue un'azione su un elemento. Restituisce -1 e registra una riga se l'elemento non lo supporta. | Ovunque |
| Gui_Get | Legge una proprietà come testo. | Ovunque |
| Gui_GetNum | Legge una proprietà come un numero. | Ovunque |
| Gui_SetArray | Invia un elenco di numeri a un elemento, ad esempio un'intera serie di un grafico. | Ovunque |
| Gui_AddImage | Registra un'immagine da un array di pixel ARGB, in modo che gli elementi possano visualizzarla. Lo strumento "Image to Code" presente sul sito web crea questo array a partire da un'immagine PNG. | OnInit |
| Gui_Find | Trova un elemento tramite il suo nome. | Ovunque |
| Gui_PortaInFronte | Sposta l'interfaccia grafica sopra gli oggetti del grafico disegnati successivamente. | Dopo aver creato gli oggetti del grafico |
Questa è l'intera interfaccia. Tutto il resto in questa guida è una combinazione di queste 15 chiamate.
3. Esegui la demo completa
- Apri un grafico. Una finestra di grandi dimensioni, ad esempio 1280 x 720 pixel o superiore, mostra il maggior numero di informazioni.
- Trascina GUI_Graphic_Library_FullDemo dal Navigatore sul grafico.
- Utilizza le schede di sezione in alto: Home, Casi d'uso, Pulsanti, Input, Selettori, Dati, Grafici, Layout, Feedback, Trading e Impostazioni.
La versione demo non invia mai ordini a meno che non si imposti l'input InpLiveTrading su true. Su un conto reale, è consigliabile disattivarlo. Se si chiude la finestra principale, l'Expert Advisor si chiude automaticamente.
Utilizza GUI_Graphic_Library_ElementTests quando desideri esaminare un elemento alla volta: fai clic su un gruppo nella relativa finestra di selezione.
Una dashboard realizzata esclusivamente con gli elementi della libreria.
4. Il tuo primo pannello
Questo è un Expert Advisor completo: una finestra con una casella per la dimensione del lotto, un pulsante Acquista e una riga di stato. Non effettua operazioni di trading; visualizza un messaggio.
#include <GUI_Graphic_Library.mqh> int wMain, spLots, btnBuy, lblInfo; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit () { if (!Gui_Create( 0 , "MyPanel" )) return INIT_FAILED ; // 0 = this chart Gui_Set( 0 , GUI_PROP_THEME, "" , GUI_THEME_DARK); wMain = Gui_Add(GUI_OBJ_WINDOW, 0 , "wMain" , "My panel" , 20 , 40 , 300 , 170 ); Gui_Set(wMain, GUI_PROP_THEME_BUTTON, "" , true ); // sun / moon button Gui_Set(wMain, GUI_PROP_MAIN_WINDOW, "" , true ); // close asks to remove the program spLots = Gui_Add(GUI_OBJ_SPIN, wMain, "spLots" , "" , 10 , 10 , 280 , 30 ); Gui_Set(spLots, GUI_PROP_RANGE, "" , 0.01 , 50 , 0.01 , 2 ); // min, max, step, digits Gui_Set(spLots, GUI_PROP_VALUE, "" , 0.10 ); Gui_Set(spLots, GUI_PROP_SUFFIX, "lots" ); btnBuy = Gui_Add(GUI_OBJ_BUTTON, wMain, "btnBuy" , "BUY" , 10 , 50 , 280 , 40 ); Gui_Set(btnBuy, GUI_PROP_STYLE, "" , GUI_BUTTON_SUCCESS); Gui_Set(btnBuy, GUI_PROP_ICON, "" , GUI_ICON_ARROW_UP); lblInfo = Gui_Add(GUI_OBJ_LABEL, wMain, "lblInfo" , "Ready" , 10 , 100 , 280 , 20 ); Gui_Set(lblInfo, GUI_PROP_DIM, "" , true ); Gui_Set( 0 , GUI_PROP_REDRAW); return INIT_SUCCEEDED ; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ProcessEvents() { ENUM_GUI_EVENT ev; int sender; long l; double d; string s; while (Gui_NextEvent(ev, sender, l, d, s)) if (ev == GUI_EVENT_CLICK && sender == btnBuy) { double lots = Gui_GetNum(spLots, GUI_PROP_VALUE); Gui_Set(lblInfo, GUI_PROP_TEXT, "Buy " + DoubleToString (lots, 2 ) + " lots" ); Gui_Set( 0 , GUI_PROP_TOAST, "Buy|" + DoubleToString (lots, 2 ) + " lots" , GUI_NOTICE_SUCCESS, 3000 ); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit ( const int r) { Gui_Destroy(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer () { Gui_Timer(); ProcessEvents(); Gui_Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent ( const int id, const long &l, const double &d, const string &s) { Gui_ChartEvent(id, l, d, s); ProcessEvents(); Gui_Update(); }
Lo schema non cambia mai:
- OnInit crea l'interfaccia grafica e i relativi elementi.
- OnChartEvent e OnTimer inviano eventi alla libreria, leggono la coda e chiamano Gui_Update.
- OnDeinit distrugge l'interfaccia grafica.
5. Come pensa la biblioteca
- ID. Gui_Add restituisce un ID intero. Conserva gli ID che ti servono oppure trovane uno in seguito per nome con Gui_Find("nome"). L'ID 0 è l'interfaccia grafica stessa: tema, notifiche, finestre di dialogo, contatori.
- Elementi padre. Ogni elemento viene aggiunto a un elemento padre, che può essere una finestra o un contenitore. Finestre, menu ed etichette dei prezzi utilizzano l'elemento padre 0. Per una scheda, l'elemento padre è l'elemento tabs e l'ID restituito è la pagina a cui vengono aggiunti gli elementi figli.
- Proprietà. Gui_Set(id, proprietà, testo, a, b, c, d) modifica una proprietà o esegue un'azione. Il testo va nell'argomento testo; numeri, colori ed enumerazioni vanno negli argomenti da a a d. Gui_Get legge il testo e Gui_GetNum legge i numeri.
- Eventi. La libreria mette in coda le azioni dell'utente. Leggi la coda con Gui_NextEvent.
- Le coordinate sono espresse in pixel con una scala del 100%. La libreria le moltiplica automaticamente per la scala di visualizzazione di Windows.
Se si passa una proprietà non supportata da un elemento, non si verifica alcun errore: la chiamata restituisce -1 e viene scritta una riga nel registro degli esperti.
6. I compiti che svolgerai più spesso
Leggi cosa ha digitato o scelto l'utente
string name=Gui_Get(edName,GUI_PROP_TEXT); double lots=Gui_GetNum(spLots,GUI_PROP_VALUE); int tab =( int )Gui_GetNum(tabs,GUI_PROP_SELECTED);
Schede
int t=Gui_Add(GUI_OBJ_TABS,win, "tabs" , "" , 10 , 10 , 600 , 300 ); int pOrders =Gui_Add(GUI_OBJ_TAB,t, "" , "Orders" , 0 , 0 , 0 , 0 ); // returns the page int pHistory=Gui_Add(GUI_OBJ_TAB,t, "" , "History" , 0 , 0 , 0 , 0 ); Gui_Add(GUI_OBJ_BUTTON,pOrders, "b1" , "Close all" , 10 , 10 , 120 , 30 );
Tavoli
int tb=Gui_Add(GUI_OBJ_TABLE,page, "tbl" , "" , 10 , 10 , 600 , 300 ); Gui_Set(tb,GUI_PROP_ADD_COLUMN, "Symbol" , 120 ,GUI_ALIGN_LEFT); Gui_Set(tb,GUI_PROP_ADD_COLUMN, "Strength" , 130 ,GUI_ALIGN_LEFT,GUI_COL_PROGRESS); Gui_Set(tb,GUI_PROP_ADD_BUTTON_COLUMN, "Action" , 100 ,GUI_BUTTON_PRIMARY); Gui_Set(tb,GUI_PROP_ADD_ROW, "EURUSD|64|Trade" ); Gui_Set(tb,GUI_PROP_SORT, "" , 0 , true );
Un clic su una cella pulsante invia l'evento GUI_EVENT_CELL_BUTTON con la riga in lparam e la colonna in dparam.
Grafici
int ch=Gui_Add(GUI_OBJ_LINECHART,page, "chart" , "Price" , 10 , 10 , 500 , 260 ); int ln=Gui_Set(ch,GUI_PROP_ADD_SERIES, "Close" , clrDodgerBlue ); // returns the series index double closes[]; CopyClose ( _Symbol , PERIOD_H1 , 0 , 100 ,closes); Gui_SetArray(ch,GUI_PROP_SERIES,closes,ln); // a whole series at once int cd=Gui_Add(GUI_OBJ_CANDLECHART,page, "cd" , _Symbol , 10 , 280 , 500 , 260 ); Gui_Set(cd,GUI_PROP_LOAD_BARS, _Symbol , 80 ); Gui_Set(cd,GUI_PROP_ADD_MA, "" , 20 , clrDodgerBlue ); Gui_Set(cd,GUI_PROP_ADD_BANDS, "" , 20 , 2.0 );
Dialoghi e brindisi
enum { CMD_CLOSE_ALL= 500 }; Gui_Set( 0 ,GUI_PROP_CONFIRM, "Close all|Close every position?|Close|Cancel" ,CMD_CLOSE_ALL); // later, in the event loop: if (ev==GUI_EVENT_DIALOG && Gui_GetNum(sender,GUI_PROP_CMD)==CMD_CLOSE_ALL && l== 0 ) CloseAll(); // l = button index, -1 = cancelled Gui_Set( 0 ,GUI_PROP_TOAST, "Order|Filled" ,GUI_NOTICE_SUCCESS, 3000 );
Temi e colori
Gui_Set( 0 ,GUI_PROP_THEME, "" ,GUI_THEME_MIDNIGHT); // DARK, LIGHT, MIDNIGHT, HIGHCONTRAST, SOFT Gui_Set( 0 ,GUI_PROP_ACCENT, "" , clrOrange ); Gui_Set( 0 ,GUI_PROP_RADIUS, "" , 10 );
Ricorda finestre e valori
Gui_Set( 0 ,GUI_PROP_AUTO_LAYOUT, "" , true ); // load now, save when the GUI is destroyed Gui_Set( 0 ,GUI_PROP_LOAD_VALUES); // in OnInit Gui_Set( 0 ,GUI_PROP_SAVE_VALUES); // in OnDeinit
Entrambi utilizzano piccoli file di testo. Non vengono utilizzate variabili globali del terminale.
Fai qualcosa ogni secondo
Gui_Set( 0 ,GUI_PROP_COUNTER, "refresh" , 1000 , true ); // name, ms, repeat // in OnTimer: if (Gui_GetNum( 0 ,GUI_PROP_COUNTER_DONE, "refresh" )!= 0 ) RefreshNumbers();
7. Un pannello di trading con una funzione di ordine personalizzata
Il modulo d'ordine, il pannello delle posizioni e il calcolatore del rischio leggono l'account e il simbolo, quindi ti mostrano gli eventi. Non inviano mai ordini. Sei tu a decidere cosa succede quando l'utente clicca su Acquista o Vendi.
#include <GUI_Graphic_Library.mqh> #ifdef __MQL5__ #include <Trade\Trade.mqh> CTrade g_trade; #endif input bool InpLiveTrading = false ; // send real orders int g_ticket = 0 ; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit () { if (!Gui_Create( 0 , "GUI_TradePanel" )) return INIT_FAILED ; int w = Gui_Add(GUI_OBJ_WINDOW, 0 , "w" , "Trade" , 20 , 40 , 360 , 260 ); Gui_Set(w, GUI_PROP_MAIN_WINDOW, "" , true ); g_ticket = Gui_Add(GUI_OBJ_ORDERTICKET, w, "ticket" , _Symbol , 10 , 10 , 340 , 212 ); Gui_Set(g_ticket, GUI_PROP_LOTS, "" , 0.10 ); Gui_Set(g_ticket, GUI_PROP_STOP_POINTS, "" , 300 ); Gui_Set(g_ticket, GUI_PROP_TP_POINTS, "" , 600 ); Gui_Set(g_ticket, GUI_PROP_SHOW_LINES, "" , true ); // SL and TP lines on the chart Gui_Set( 0 , GUI_PROP_CLEAR_EVENTS); return INIT_SUCCEEDED ; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void MyTrade( const bool buy, const double lots, const double sl, const double tp) { if (!InpLiveTrading) { Print ( "Trading is off. Would " , buy ? "buy " : "sell " , lots, " lots" ); return ; } #ifdef __MQL5__ if (buy) g_trade.Buy(lots, _Symbol , 0.0 , sl, tp); else g_trade.Sell(lots, _Symbol , 0.0 , sl, tp); #else if (buy) OrderSend ( _Symbol , OP_BUY, lots, Ask, 3 , sl, tp, "GUI" , 0 , 0 , clrGreen ); else OrderSend ( _Symbol , OP_SELL, lots, Bid, 3 , sl, tp, "GUI" , 0 , 0 , clrRed ); #endif } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ProcessEvents() { ENUM_GUI_EVENT ev; int sender; long l; double d; string s; while (Gui_NextEvent(ev, sender, l, d, s)) if (ev == GUI_EVENT_TRADE) // l: 0 buy, 1 sell d: lots s: "sl|tp" prices { string p[]; StringSplit (s, '|' , p); double sl = ( ArraySize (p) > 0 ) ? StringToDouble (p[ 0 ]) : 0.0 ; double tp = ( ArraySize (p) > 1 ) ? StringToDouble (p[ 1 ]) : 0.0 ; MyTrade(l == 0 , d, sl, tp); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit ( const int r) { Gui_Destroy(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer () { Gui_Timer(); ProcessEvents(); Gui_Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent ( const int id, const long &l, const double &d, const string &s) { Gui_ChartEvent(id, l, d, s); ProcessEvents(); Gui_Update(); }
Prima di inviare ordini reali, esegui una prova su un conto demo. Verifica inoltre che la dimensione del lotto sia confrontata con i valori minimi, massimi e con lo step del simbolo, e che la distanza di stop sia confrontata con il livello di stop del broker.
Le posizioni funzionano allo stesso modo: aggiungi GUI_OBJ_POSITIONS, quindi reagisci a GUI_EVENT_POSITION (lparam è il ticket, dparam è 1 per Chiudi e 2 per Modifica).
8. Utilizzo in un indicatore
Un indicatore può disegnare l'interfaccia grafica in una propria finestra secondaria. Passa il numero di tale finestra a Gui_Create:
#property indicator_separate_window int OnInit () { int sub= ChartWindowFind (); Gui_Create( 0 , "GUI_MyIndicator" ,sub); // add windows and controls as usual return INIT_SUCCEEDED ; }
Per disegnare sul grafico dei prezzi a partire da un indicatore, utilizzare la sottofinestra 0. Le due demo degli indicatori sono esempi completi. Esiste un'interfaccia grafica per ogni programma e grafico, quindi assegnare a ciascun programma un nome univoco per l'interfaccia.
9. MetaTrader 4 e MetaTrader 5
| Argomento | MetaTrader 4 | MetaTrader 5 |
|---|---|---|
| File della biblioteca | .ex4 | .ex5 |
| Menu contestuale | Tieni premuto il pulsante sinistro del mouse oppure Ctrl + clic | clic con il tasto destro del mouse |
| Rotellina del mouse | Non inviato dal terminale. Utilizzare le barre di scorrimento. | Opere |
| Profondità del mercato | Aggiungi tu stesso i livelli | Legge il libro del mercato |
| Calendario economico | Aggiungi tu stesso le righe | Carichi dal terminale |
| Digitare | Mappa chiave degli Stati Uniti integrata | Funziona qualsiasi layout di tastiera |
10. Se qualcosa non funziona
| Problema | Cosa fare |
|---|---|
| Sul grafico non compare nulla. | Verifica che Gui_Create abbia restituito true e leggi le ultime righe della scheda Esperti. |
| Impossibile aprire GUI_Graphic_Library.mqh con il compilatore. | Il file di inclusione non si trova nella cartella Include della stessa cartella dati del programma. |
| Impossibile caricare la libreria in fase di esecuzione. | Il file .ex5 o .ex4 non è presente nelle Librerie oppure il suo nome è stato modificato. |
| Un valore modificato nel codice non viene visualizzato | Chiama la funzione Gui_Update() alla fine del tuo gestore eventi. |
| La scheda Esperti indica che una proprietà non è supportata | Tale proprietà non esiste per quell'elemento. Consultare la documentazione API. |
| Due programmi si contendono la stessa classifica | Assegna a ciascuno un nome univoco in Gui_Create. |
| Le linee del grafico coprono l'interfaccia grafica | Chiama la funzione Gui_BringToFront() dopo aver creato gli oggetti del grafico. |
| Il testo è troppo piccolo o troppo grande | Imposta Gui_Set(0,GUI_PROP_SCALE,"",1.5), oppure riavvia il terminale dopo aver modificato la scala di Windows. |
| Vuoi vedere cosa sta facendo la biblioteca | Attiva Gui_Set(0,GUI_PROP_DEBUG,"",true) per la sovrapposizione di debug. |
11. Consigli
- Chiama Gui_Update() alla fine di ogni gestore. Ridisegna solo ciò che è cambiato.
- Le schede nascoste e le finestre compresse non richiedono un ridisegno, quindi aggiornarle tramite un timer è un'operazione poco costosa.
- Utilizza GUI_PROP_MAX_FPS per limitare la frequenza dei fotogrammi se esegui molti grafici.
- Utilizza GUI_PROP_CLEAR_EVENTS alla fine di OnInit per eliminare gli eventi accodati durante la creazione del pannello.
- Utilizza lo strumento "Image to Code" sul sito web per convertire un logo o un'icona PNG in un array per la funzione Gui_AddImage.
- I nuovi valori dell'enumerazione vengono aggiunti solo alla fine, in modo che i programmi compilati con un file di inclusione precedente continuino a funzionare dopo un aggiornamento. Sostituire contemporaneamente il file di libreria e il file di inclusione.
12. Dove andare dopo?
- Galleria degli elementi, installazione, guida, riferimento API, conversione da immagine a codice e aiuto: https://www.betasoft.dev/gui-graphic-library
- Versione MetaTrader 5: https://www.mql5.com/en/market/product/206761
- Versione MetaTrader 4: https://www.mql5.com/en/market/product/206760
La tua opinione è ben accetta. Per domande o suggerimenti di miglioramento, scrivi nei commenti del prodotto o inviami un messaggio su MQL5.com.





