Discusión sobre el artículo "Creación de una interfaz gráfica de usuario interactiva en MQL5 (Parte 1): Creación del panel"

 

Artículo publicado Creación de una interfaz gráfica de usuario interactiva en MQL5 (Parte 1): Creación del panel:

Este artículo explora los pasos fundamentales en la elaboración e implementación de un panel de Interfaz Gráfica de Usuario (GUI) utilizando MetaQuotes Language 5 (MQL5). Los paneles de utilidades personalizados mejoran la interacción del usuario en la negociación simplificando las tareas habituales y visualizando la información esencial de la negociación. Al crear paneles personalizados, los operadores pueden agilizar su flujo de trabajo y ahorrar tiempo durante las operaciones.

Vamos a crear un panel GUI que incluya las herramientas de utilidad más comunes que cualquier operador puede necesitar, y por lo tanto queremos resumir y cubrir todo en esta serie. Por tanto, el número de elementos que deben tratarse es amplio, pero los agruparemos para facilitar su comprensión. Utilizaremos 4 elementos para el desarrollo de nuestra GUI y es a través de esto que la crearemos. El panel incluirá la creación de botones de negociación, rectángulos afilados, actualizaciones en directo, el uso de emojis, distintos estilos de fuente, etiquetas, partes móviles del panel y efectos hover. Para ilustrar todo esto, hemos utilizado un ejemplo a continuación.

EXAMPLE GUI

Autor: Allan Munene Mutiiria

 
Grandes tutoriales...Buen trabajo
 
Isaac Amo #:
Grandes tutoriales...Buen trabajo

@Isaac Amo Agradezco los comentarios y el reconocimiento. Me siento halagado. Thank you.

 

Wow muy amable por compartir este articulo. Afortunado hallazgo

 
Malcolm Campbell #:

Wow muy amable por compartir este articulo. Afortunado hallazgo

Gracias @Malcolm Campbell por la amable reseña y los comentarios.

 
Un poco de byte. En la portada es una hermosa interfaz de colores, y aquí es una ventana de Windows XP)
El artículo es útil, gracias.
 
Petr Zharuk #:
Un poco de byte. En la portada es una hermosa interfaz de colores, y aquí es una ventana de Windows XP)
El artículo es útil, gracias.
Hola. Gracias por su amable comentario. Realmente lo aprecio. Gracias también y bienvenido.
 

¿Es posible hacer que este panel se mueva libremente? ¿Es posible hacer que este panel se mueva libremente?

 
Hasta ahora lo he leído en diagonal desde mi teléfono....
Voy a leer más a fondo en mi ordenador y también voy a hacer una interfaz de comercio basado en su artículo. Hasta ahora sólo he hecho botones de compra y venta. Tengo una idea de cómo funciona. ¡Voy a leer más y hacer una interfaz gráfica en mi ordenador también! Llevo mucho tiempo queriendo utilizar una utilidad muy útil para optimizar las órdenes comerciales.
 

Como principiante en MQL5, me ha gustado mucho el artículo. Gracias por el artículo. Pero pensé que la función de desinicialización se puede reducir significativamente si ObjectDelete se ejecuta en un bucle a través de todos los nombres creados y guardados de objetos gráficos. Para ello, es necesario añadir un array de cadenas, un contador de objetos gráficos y operadores para pasar nombres al array en las funciones de creación e inicialización de parámetros de objetos gráficos. Yo lo he hecho así:

#define  ADDOBJ ArrayResize(objectsArray, objectCount+1);\
   objectsArray[objectCount] = objName;\
   objectCount++;

string objectsArray[];
int objectCount = 0;
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
// Borrar los objetos gráficos creados
   for(int i = 0; i < objectCount; i++)
     {
      if(ObjectFind(0, objectsArray[i]) >= 0)
        {
         ObjectDelete(0, objectsArray[i]);
         // Print("Objeto eliminado: ", objectsArray[i]);
        }
     }
  }

También he añadido:

input int base_x = 300;  // Sangría izquierda
input int base_y = 100;  // Sangría superior
input bool Include_DropDown = false; // Mostrar desplegable
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   CreatPanel();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|    Function to create Panel                                      |
//+------------------------------------------------------------------+
void CreatPanel()
  {
   createRecLabel("MAIN_REC",10,30,250,400,clrWhite,1,clrBlack);
   createRecLabel("MAIN_SUB_REC",15,35,240,390,C'245,245,245',1,clrNONE);
   createRecLabel("MAIN_LINE_UP",15,35,240,1,C'245,245,245',1,clrNONE,BORDER_RAISED);
...

   if(Include_DropDown)
     {
      createDropDown();
     }
   ChartRedraw(0);
  }
Y en la función de creación lo he refinado así:

 

Y he cambiado un poco las funciones de creación de objetos gráficos:

//+------------------------------------------------------------------+
//| Función para crear etiqueta de texto|
//+------------------------------------------------------------------+
bool createLabel(string objName, int xD, int yD,
                 string txt, color clrTxt = clrBlack, int fontSize = 12,
                 string font = "Arial Rounded MT Bold")
  {
   ResetLastError();

   if(!ObjectCreate(0, objName, OBJ_LABEL, 0, 0, 0))
     {
      Print(__FUNCTION__, ": failed to create the label! Error code = ", _LastError);
      return (false);
     }

   ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, base_x + xD); // Añadir base_x +
   ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, base_y + yD); // Añadir base_y +
   ObjectSetInteger(0, objName, OBJPROP_CORNER, CORNER_LEFT_UPPER); 
   ObjectSetString(0, objName, OBJPROP_TEXT, txt);
   ObjectSetInteger(0, objName, OBJPROP_COLOR, clrTxt);
   ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, fontSize);
   ObjectSetString(0, objName, OBJPROP_FONT, font);
   ObjectSetInteger(0, objName, OBJPROP_BACK, false);
   ObjectSetInteger(0, objName, OBJPROP_STATE, false);
   ObjectSetInteger(0, objName, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0, objName, OBJPROP_SELECTED, false);

   ADDOBJ 

   return (true);
  }