✔️ Biblioteca gráfica GUI MT4©: https://www.mql5.com/en/market/product/206760
✔️ Biblioteca gráfica GUI MT5©: https://www.mql5.com/en/market/product/206761
✔️ Documentación completa, galería de elementos y herramienta de conversión de imagen a código5: https://www.betasoft.dev/gui-graphic-library
Una tabla de posiciones, un ticket de pedido y un gráfico en tiempo real.
La biblioteca gráfica GUI proporciona a sus asesores expertos e indicadores una interfaz completa: ventanas, pestañas, menús, tablas, gráficos, selectores, diálogos y widgets de trading. Todo se dibuja en un mismo lienzo, el mismo código funciona en MetaTrader 4 y MetaTrader 5, y la API completa consta de 15 funciones.
Esta guía te acompaña desde la descarga hasta tu primer panel de control, y luego a las tareas que realizarás con mayor frecuencia. Cada ejemplo de código utiliza únicamente el archivo de inclusión público, por lo que puedes copiarlo y pegarlo en tu propio programa.
Una pequeña parte de los 78 elementos: botones, campos de entrada, controles deslizantes y pestañas.
1. Antes de empezar
- MetaTrader 4 o MetaTrader 5 en Windows. Las fuentes y los iconos siguen la escala de visualización de Windows (100, 125, 150 y 200 por ciento).
- MetaEditor, para compilar las demostraciones y tus propios programas.
- No hay nada que permitir en las opciones del terminal: la biblioteca no utiliza ninguna DLL, no realiza solicitudes web y no utiliza variables globales del terminal.
- Las versiones MT4 y MT5 son productos independientes. Instale la que corresponda a su terminal.
2. Instalación
- En la terminal, seleccione Archivo y luego Abrir carpeta de datos.
- Abra la carpeta MQL5 (MetaTrader 5) o la carpeta MQL4 (MetaTrader 4).
- Copie cada archivo en la carpeta que se muestra en la tabla anterior: Bibliotecas, Incluir, Expertos e Indicadores.
- Abra cada demo en MetaEditor y pulse F7. El resultado debería mostrar 0 errores y 0 advertencias.
- De vuelta en la terminal, actualiza el Navegador (clic derecho, Actualizar) para que aparezcan los nuevos programas.
Las carpetas deberían verse así:
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
No cambie el nombre del archivo de la biblioteca. El archivo de inclusión lo carga con ese nombre.
Comprobaciones después de la instalación
| Controlar | Dónde |
|---|---|
| El archivo .ex5 (o .ex4) se encuentra en Bibliotecas. | Carpeta de datos |
| El archivo .mqh se encuentra en Include | Carpeta de datos |
| La demo se compila sin errores. | MetaEditor |
| La demostración muestra una ventana en el gráfico. | Cuadro |
| La pestaña Expertos no tiene líneas "no compatibles". | Terminal, Caja de herramientas |
¿Qué contiene GUI_Graphic_Library.mqh?
El archivo de inclusión es pequeño a propósito. Encima del bloque de importación, declara las enumeraciones (tipos de objeto, propiedades, eventos, temas e iconos). El bloque de importación inferior carga la biblioteca compilada y enumera sus 15 funciones. MetaTrader 5 carga el archivo .ex5 y MetaTrader 4 carga el archivo .ex4, elegido por el compilador. Solo tienes que incluir el archivo y no editarlo.
#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
Las 15 funciones en el orden en que aparecen:
| Función | Lo que hace | ¿Dónde lo llamas? |
|---|---|---|
| Versión de la interfaz gráfica | Devuelve la versión de la biblioteca como texto. | En cualquier lugar |
| Gui_Create | Inicia la interfaz gráfica de usuario en un gráfico. Pase 0 para el gráfico actual, un nombre para su programa y un número de subventana para los indicadores. Devuelve verdadero si se ejecuta correctamente. | En el inicio |
| Gui_Destroy | Elimina la interfaz gráfica de usuario y todo lo que dibujaba. | OnDeinit |
| Evento de gráfico de la interfaz gráfica | Proporciona a la biblioteca el evento del gráfico (ratón, teclas, clics). | Evento OnChart |
| Temporizador de interfaz gráfica | Ejecuta los temporizadores de la biblioteca: animaciones, mensajes emergentes y contadores. | En temporizador |
| Actualización de la interfaz gráfica de usuario | Repinta lo que ha cambiado. Pasa "verdadero" para repintar todo. | Fin de cada controlador |
| Gui_NextEvent | Toma el siguiente evento de la cola (clic, cambio, resultado de diálogo, solicitud de intercambio). Devuelve falso cuando la cola está vacía. | Bucle de eventos |
| Agregar a la interfaz gráfica | Crea un elemento y devuelve su ID. Debes especificar el tipo, el elemento padre, un nombre, el texto y las coordenadas x, y, ancho y alto. | En el inicio |
| Conjunto de interfaz gráfica | Modifica una propiedad o ejecuta una acción en un elemento. Devuelve -1 y registra una línea si el elemento no lo admite. | En cualquier lugar |
| Gui_Get | Lee una propiedad como texto. | En cualquier lugar |
| Gui_GetNum | Lee una propiedad como un número. | En cualquier lugar |
| Gui_SetArray | Envía una lista de números a un elemento, por ejemplo, una serie completa de gráficos. | En cualquier lugar |
| Gui_AddImage | Registra una imagen a partir de una matriz de píxeles ARGB, para que los elementos puedan mostrarla. La herramienta Imagen a Código del sitio web crea esta matriz a partir de un archivo PNG. | En el inicio |
| Gui_Find | Busca un elemento por su nombre. | En cualquier lugar |
| Gui_BringToFront | Mueve la interfaz gráfica de usuario por encima de los objetos del gráfico que dibujaste después. | Después de crear objetos de gráfico |
Esa es toda la interfaz. Todo lo demás en esta guía es una combinación de estas 15 llamadas.
3. Ejecuta la demostración completa.
- Abra un gráfico. Una ventana grande, por ejemplo de 1280 por 720 píxeles o más, muestra la mayor cantidad de información.
- Arrastre GUI_Graphic_Library_FullDemo desde el Navegador al gráfico.
- Utilice las pestañas de sección en la parte superior: Inicio, Casos de uso, Botones, Entradas, Selectores, Datos, Gráficos, Diseño, Comentarios, Operaciones y Configuración.
La cuenta demo nunca envía órdenes a menos que configure la opción InpLiveTrading como verdadera. En una cuenta real, déjela desactivada. Si cierra la ventana principal, el Asesor Experto se eliminará automáticamente.
Utilice GUI_Graphic_Library_ElementTests cuando desee examinar un elemento a la vez: haga clic en un grupo en su ventana de selección.
Un panel de control construido únicamente con elementos de la biblioteca.
4. Tu primer panel
Se trata de un Asesor Experto completo: una ventana con un cuadro para introducir el tamaño del lote, un botón de compra y una línea de estado. No realiza operaciones; simplemente muestra un mensaje.
#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(); }
El patrón nunca cambia:
- OnInit crea la interfaz gráfica de usuario y los elementos.
- OnChartEvent y OnTimer envían eventos a la biblioteca, leen la cola y llaman a Gui_Update.
- OnDeinit destruye la interfaz gráfica de usuario.
5. Cómo piensa la biblioteca
- Ids. Gui_Add devuelve un ID entero. Guarda los IDs que necesites o busca uno más tarde por nombre con Gui_Find("nombre"). El ID 0 es la interfaz gráfica de usuario (GUI): tema, notificaciones, diálogos, contadores.
- Elementos principales. Cada elemento se agrega a un elemento principal, ya sea una ventana o un contenedor. Las ventanas, los menús y las etiquetas de precio utilizan el elemento principal 0. Para una pestaña, el elemento principal es el elemento de pestañas y el ID devuelto es la página a la que se agregan los elementos secundarios.
- Propiedades. Gui_Set(id, propiedad, texto, a, b, c, d) modifica una propiedad o ejecuta una acción. El texto se introduce en el argumento texto; los números, colores y enumeraciones se introducen en los argumentos a a d. Gui_Get lee texto y Gui_GetNum lee números.
- Eventos. La biblioteca pone en cola las acciones del usuario. Lea la cola con Gui_NextEvent.
- Las coordenadas están en píxeles a una escala del 100 %. La biblioteca las multiplica automáticamente por la escala de visualización de Windows.
Si se pasa una propiedad que un elemento no admite, no ocurre nada: la llamada devuelve -1 y se escribe una línea en el registro de Expertos.
6. Las tareas que realizará con mayor frecuencia
Lee lo que el usuario escribió o eligió.
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);
Cortina a la italiana
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 );
Tablas
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 );
Al hacer clic en una celda de botón, se envía GUI_EVENT_CELL_BUTTON con la fila en lparam y la columna en dparam.
Gráficos
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 );
Diálogos y mensajes emergentes
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 );
Temas y colores
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 );
Recuerde ventanas y valores
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
Ambos utilizan archivos de texto pequeños. No se utilizan variables globales de terminal.
Haz algo cada segundo
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 panel de negociación con su propia función de órdenes.
El ticket de órdenes, el panel de posiciones y la calculadora de riesgos leen la cuenta y el símbolo, y luego generan eventos. Nunca envían órdenes. Usted decide qué sucede cuando el usuario hace clic en Comprar o Vender.
#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(); }
Pruébalo primero en una cuenta demo. Antes de enviar órdenes reales, verifica también el tamaño del lote con respecto al mínimo, máximo y paso del símbolo, y la distancia del stop con respecto al nivel de stop del bróker.
Las posiciones funcionan de la misma manera: agregue GUI_OBJ_POSITIONS y luego reaccione a GUI_EVENT_POSITION (lparam es el ticket, dparam es 1 para Cerrar y 2 para Modificar).
8. Usarlo en un indicador
Un indicador puede dibujar la interfaz gráfica de usuario en su propia subventana. Pase el número de esa ventana 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 ; }
Para dibujar en el gráfico de precios desde un indicador, utilice la subventana 0. Las dos demostraciones de indicadores son ejemplos completos. Hay una interfaz gráfica de usuario (GUI) por programa y gráfico, así que asigne a cada programa su propio nombre de GUI.
9. MetaTrader 4 y MetaTrader 5
| Tema | MetaTrader 4 | MetaTrader 5 |
|---|---|---|
| Archivo de biblioteca | .ex4 | .ex5 |
| Menú contextual | Mantén pulsado el botón izquierdo o pulsa Ctrl + clic. | clic derecho |
| rueda del ratón | No se envía desde la terminal. Utilice las barras de desplazamiento. | Obras |
| Profundidad del mercado | Añade tú mismo los niveles | Lee el libro del mercado |
| Calendario económico | Añade las filas tú mismo | Cargas desde la terminal |
| Mecanografía | Mapa de claves de EE. UU. integrado | Cualquier distribución de teclado funciona |
10. Si algo no funciona
| Problema | ¿Qué hacer? |
|---|---|
| No aparece nada en el gráfico. | Comprueba que Gui_Create haya devuelto true y lee las últimas líneas de la pestaña Expertos. |
| El compilador no puede abrir GUI_Graphic_Library.mqh | El archivo de inclusión no se encuentra en la carpeta Include de la misma carpeta de datos que su programa. |
| El programa no puede cargar la biblioteca en tiempo de ejecución. | El archivo .ex5 o .ex4 no se encuentra en la carpeta Bibliotecas, o bien se le ha cambiado el nombre. |
| Un valor cambiado en el código no se muestra | Llama a Gui_Update() al final de tu controlador. |
| La pestaña Expertos indica que una propiedad no es compatible. | Esa propiedad no existe para ese elemento. Consulta la documentación de la API. |
| Dos programas compiten en un mismo gráfico. | En Gui_Create, asigna un nombre a cada uno. |
| Las líneas del gráfico cubren la interfaz gráfica de usuario. | Llama a Gui_BringToFront() después de crear los objetos del gráfico. |
| El texto es demasiado pequeño o demasiado grande. | Establezca Gui_Set(0,GUI_PROP_SCALE,"",1.5), o reinicie la terminal después de cambiar la escala de Windows. |
| Quieres ver qué está haciendo la biblioteca. | Active Gui_Set(0,GUI_PROP_DEBUG,"",true) para la superposición de depuración. |
11. Consejos
- Llama a Gui_Update() al final de cada controlador. Solo repinta lo que ha cambiado.
- Las pestañas ocultas y las ventanas colapsadas no provocan ningún cambio de color, por lo que actualizarlas mediante un temporizador resulta económico.
- Utilice GUI_PROP_MAX_FPS para limitar la velocidad de fotogramas si ejecuta muchos gráficos.
- Utilice GUI_PROP_CLEAR_EVENTS al final de OnInit para descartar los eventos que se pusieron en cola mientras construía el panel.
- Utilice la herramienta "Imagen a código" del sitio web para convertir un logotipo o icono PNG en una matriz para la función Gui_AddImage.
- Los nuevos valores de enumeración solo se agregan al final, por lo que los programas creados con un archivo de inclusión antiguo seguirán funcionando después de una actualización. Reemplace el archivo de la biblioteca y el archivo de inclusión simultáneamente.
12. ¿Adónde ir después?
- Galería de elementos, instalación, guía, referencia de API, conversión de imagen a código y ayuda: https://www.betasoft.dev/gui-graphic-library
- Versión MetaTrader 5: https://www.mql5.com/en/market/product/206761
- Versión MetaTrader 4: https://www.mql5.com/en/market/product/206760
Tu opinión es bienvenida. Si tienes preguntas o ideas para mejorar, escribe en los comentarios del producto o envíame un mensaje a través de MQL5.com.





