English Русский 中文 Deutsch 日本語
preview
Creación de un Panel de administración de operaciones en MQL5 (Parte XI): Interfaz moderna de funciones de comunicación (I)

Creación de un Panel de administración de operaciones en MQL5 (Parte XI): Interfaz moderna de funciones de comunicación (I)

MetaTrader 5Ejemplos |
58 0
Clemence Benjamin
Clemence Benjamin

Contenido:


Introducción

La terminal MetaTrader 5 está evolucionando rápidamente hacia un entorno de trading más eficiente y compacto. Gracias a la reciente integración de la función de chat, los operadores ahora pueden comunicarse de forma privada con sus amigos de MQL5, unirse a grupos y suscribirse a canales, todo ello directamente desde la terminal. Esto representa un importante avance en la conexión segura de la comunidad MQL5 a través de la API de MQL5.

Para utilizar estas funciones, los usuarios deben haber iniciado sesión en sus cuentas MQL5 dentro del terminal, tener amigos conectados y formar parte de canales o grupos activos. Estas comunidades son valiosas fuentes de información para operar en los mercados financieros, donde los expertos comparten con frecuencia ideas, capturas de pantalla y debates en directo, todo ello integrado a la perfección sin interrumpir la visualización de los gráficos.

Sin embargo, existe una limitación actual: la comunicación se limita al ecosistema MQL5. Lo que falta es la capacidad de conectar MetaTrader 5 con plataformas sociales externas. Afortunadamente, la API del terminal, combinada con WebRequest, nos permite conectarnos a servidores de comunicación de terceros, como Telegram, WhatsApp y otros.

Nuestro panel de administración de operaciones tiene como objetivo ampliar esta funcionalidad mediante la introducción de un panel de comunicaciones moderno: una interfaz fácil de usar inspirada en las aplicaciones de mensajería que todos utilizamos a diario. Estamos pasando de un prototipo similar a una calculadora a un diseño más intuitivo y pulido. Si bien la base original funcionó bien para las pruebas iniciales, la próxima versión admitirá una verdadera comunicación bidireccional.

Ya no es solo el administrador quien envía los mensajes; los destinatarios también podrán responder. Este cambio requiere la implementación de un sistema de contactos adecuado, utilizando identificadores de chat únicos para gestionar los destinatarios de la comunicación externa.

La imagen siguiente muestra cómo acceder a la Comunidad MQL5 y a los chats desde la plataforma de negociación MetaTrader 5. El icono de la cuenta de usuario suele estar situado cerca de la esquina superior derecha de la interfaz del terminal, como se muestra en la imagen.

Cuenta MQL5

Acceso a la comunidad y los chats de MQL5 desde la terminal MetaTrader 5

Si ya ha añadido su cuenta de MQL5, la terminal suele mostrar un resumen en el diario de inicio, indicando que la cuenta de la comunidad MQL5 y los chats están activados. A continuación se muestra el registro de inicio de mi terminal del 16 de abril de 2025.

2025.04.16 08:44:10.343 Network '40538052': previous successful authorization performed from 197.221.254.8 on 2025.04.16 03:48:48
2025.04.16 08:44:10.461 Experts expert New_Admin_Panel- (Volatility 75 (1s) Index.0,M5) loaded successfully
2025.04.16 08:44:12.323 Experts expert New_Admin_Panel- (Volatility 10 (1s) Index.0,M1) loaded successfully
2025.04.16 08:44:12.324 Network '40538052': terminal synchronized with Deriv.com Limited: 0 positions, 0 orders, 150 symbols, 0 spreads
2025.04.16 08:44:12.324 Network '40538052': trading has been enabled - hedging mode
2025.04.16 08:44:14.354 Trades  use MetaTrader VPS Hosting Service to speed up the execution: 2.26 ms via 'MQL5 Frankfurt FRA8 01' instead of 212.79 ms
2025.04.16 08:44:14.776 MQL5.community  activated for 'Billionaire2024', balance: 
0.00 
2025.04.16 08:44:15.826 MQL5.chats      activated for 'Billionaire2024'

En la descripción general que se presenta a continuación, profundizaremos en el diseño propiamente dicho y describiremos cómo planeamos lograr esta próxima evolución en el Panel de Comunicaciones.


Descripción general

Ahora, la capacidad de expansión del programa se hace más evidente gracias a las recientes mejoras en la organización del código. Como pueden ver, ahora podemos centrarnos específicamente en el Panel de Comunicaciones sin distraernos con otros componentes del proyecto en general. Este enfoque modular nos permite maximizar nuestra creatividad y productividad.

Hoy damos otro paso importante con el Panel de Comunicaciones, similar al que dimos al mejorar y simplificar la interfaz de inicio del administrador. Actualmente, el Panel de Comunicaciones carece de atractivo visual y no es muy fácil de usar, lo que significa que tenemos trabajo por delante para perfeccionarlo y mejorarlo.

Si bien continuaremos utilizando la biblioteca estándar MQL5, esta versión también introducirá nuevas clases personalizadas adaptadas a nuestras necesidades. Para garantizar un camino claro a seguir, comenzaremos con un diseño conceptual de la interfaz, identificaremos los componentes principales y describiremos sus propósitos individuales. Después de eso, pasaremos a la fase de codificación e implementación.


Características de una interfaz de mensajería basada en las aplicaciones más populares.

Antes de adentrarnos en el diseño de nuestra propia interfaz, dediquemos un momento a repasar las características generales de las interfaces de mensajería utilizadas por las aplicaciones más populares de la actualidad. Al examinar estos patrones de diseño comunes, podemos inspirarnos y adaptar, añadir o eliminar características en función de lo que se ajuste a nuestros objetivos actuales.

A continuación, he recopilado y descrito diez características clave para que las analicemos. Una vez que los hayamos revisado, echaremos un vistazo a algunas imágenes de referencia que he preparado para visualizar cómo se combinan estos elementos en aplicaciones del mundo real.

1. Diseño limpio y minimalista:

  • Interfaz de usuario plana con esquemas de color modernos (modos claro/oscuro).
  • Espaciado y alineación uniformes
  • Burbujas de mensaje redondeadas y transiciones suaves.
  • Iconos sencillos (clip, emoji, micrófono, etc.) con una ubicación intuitiva.

2. Área de conversación (ventana principal de chat):

  • Área desplazable que muestra el historial de mensajes
  • Marcas de tiempo en los mensajes
  • Agrupación de mensajes por remitente
  • Indicadores visuales: entregado, leído, editado, fijado
  • Compatibilidad con multimedia (imágenes, vídeo, voz, archivos)

 3. Barra lateral – Contactos o canales:

  • Lista de usuarios, grupos o canales
  • Indicadores de estado en línea (puntos verdes, última conexión)
  • Vista previa de mensajes recientes
  • Opciones de búsqueda y filtrado

4. Barra de navegación superior:

  • Título del chat o nombre del contacto
  • Avatares de usuario o iconos de grupo
  • Menú desplegable de Ajustes/Opciones (silenciar, archivar, eliminar, etc.)
  • Botón de información para ver el perfil del usuario o del grupo.

 5. Área de entrada de mensajes (panel inferior):

  • Cuadro de entrada de texto con marcador de posición (“Escriba un mensaje…”)
  • Botones:
  • Enviar (icono de avión de papel)
  • Adjuntar archivo (clip)
  • Selector de emojis (emoticono)
  • Entrada de voz (icono de micrófono)
  • Atajos de teclado (Intro para enviar, Mayús+Intro para salto de línea)

6. Vista previa de archivos multimedia y adjuntos:

  • Vista previa en línea de imágenes, vídeos y archivos.
  • Ampliar/contraer vista
  • Compatibilidad con la carga de archivos mediante arrastrar y soltar.

 7. Notificaciones y alertas:

  • Notificaciones dentro de la aplicación y del sistema
  • Interruptor de sonido/vibración
  • Menciones destacadas (@nombredeusuario)
  • Mensajes emergentes o insignias (contador de mensajes no leídos)

 8. Sincronización entre dispositivos:

  • Aplicaciones web, móviles y de escritorio que se sincronizan en tiempo real.
  • Historial de chat persistente entre sesiones
  • Compatibilidad con el modo sin conexión con sincronización automática al volver a estar en línea.

9. Características de seguridad y privacidad:

  • Cifrado de extremo a extremo (por ejemplo, WhatsApp)
  • Temporizador/autodestrucción de mensajes (Telegram)
  • Autenticación de dos factores y sesiones de inicio de sesión seguras

10. Extensibilidad y bots:

  • Soporte para bots y automatización
  • Complementos/integraciones con otras herramientas (calendario, gestor de tareas, terminal de negociación)
  • API avanzadas y compatibilidad con WebSocket
A continuación, nos remitimos a la imagen que aparece más abajo para validar algunos de los puntos mencionados anteriormente. Si recuerdan, cuando presentamos el concepto de autenticación de dos factores, mencionamos la recepción del código de autenticación a través de un bot de Telegram específico. Si bien parte del historial de chat aún está disponible, el propósito de la imagen a continuación es resaltar los componentes clave de la interfaz de mensajería. Basándome en mis observaciones y en la disposición de Telegram, he marcado algunas secciones destacadas:
  • El área de entrada de mensajes está bordeada de rojo.
  • La sección del historial de chat está bordeada de azul.
  • La parte superior, bordeada en verde, incluye el nombre del contacto, el botón de búsqueda y el menú de tres puntos.
Consulte la imagen a continuación para una referencia visual.

Imagen de referencia del chat de Telegram

Otra referencia cercana es la interfaz de mensajería MQL5, que tuve la oportunidad de capturar de un canal MQL5 que creé hace un tiempo. Echa un vistazo al diseño que aparece a continuación: notarás algunas similitudes y ligeras variaciones en el diseño en comparación con la imagen anterior de Telegram. Podemos extraer algunas conclusiones útiles de este diseño general de interfaz de mensajería.

Referencia de mensajería MQL5

Los ejemplos que podemos utilizar como referencia son prácticamente inagotables. Muchos siguen un diseño similar, ya sean sistemas de mensajería de correo electrónico con botones de respuesta y funciones adicionales, interfaces de chatbot u otros. Todos estos ejemplos ofrecen información valiosa sobre lo que normalmente requiere una interfaz de comunicación. A partir de estas referencias, podemos avanzar y considerar el diseño más adecuado para nuestro panel de comunicaciones de trading, teniendo en cuenta sus limitaciones y el tipo específico de comunicación que gestionará.


Diseño e implementación del código

Aquí es donde comienza la migración: del panel actual al nuevo. Pero antes de eso, debemos considerar las necesidades clave de comunicación del administrador de operaciones al interactuar con otros operadores. Estos suelen incluir:

1. Instrucciones especiales para los operadores

Ya habíamos implementado la idea de botones de mensajes rápidos para reducir el tiempo entre la redacción y el envío de un mensaje. Esto garantiza que los operadores reciban información importante lo más rápido posible. Sin embargo, el administrador también necesita la capacidad de enviar mensajes personalizados, y el área de entrada de mensajes está diseñada para ello. Mejoraremos la forma en que se accede a los mensajes rápidos.

2. Comunicación unidireccional frente a comunicación bidireccional

Normalmente, solo el administrador tiene permiso para enviar mensajes, lo que lo convierte en un sistema de comunicación unidireccional. Sin embargo, existen situaciones en las que podría ser útil que la comunidad de traders respondiera. Deberíamos considerar la posibilidad de fomentar este tipo de interacción en los nuevos diseños de paneles.

3. Compartir capturas de pantalla y análisis visual

Compartir imágenes, especialmente gráficos con anotaciones o capturas de pantalla, está adquiriendo cada vez más importancia. La terminal MQL5 ya incluye una herramienta de captura de pantalla que permite subir archivos directamente a los gráficos de la comunidad MQL5. Nos gustaría incorporar un botón que capture una captura de pantalla y la adjunte a un mensaje para compartirla rápidamente. Esto permitirá al administrador comunicar visualmente la información sobre las operaciones de forma más eficaz.

4. Gestión de contactos

Dado que Telegram ofrece múltiples modos de comunicación, como chats individuales, canales y grupos, podemos usar identificadores de chat únicos para asignar contactos y organizar las comunicaciones en categorías individuales y grupales. Esto también significa que debemos gestionar eficazmente cómo se almacenan y recuperan los contactos dentro de nuestra aplicación.

Este es nuestro diseño conceptual; a partir de aquí podemos pasar a la implementación del código:

Panel de comunicaciones de nuevo diseño

Nuevo diseño: Panel de comunicaciones

Actualmente, nuestra prioridad es perfeccionar el diseño de la interfaz. En las siguientes secciones de este artículo, partiremos de esta base, añadiendo nuevas funciones y mejorando aún más la experiencia del usuario.

La biblioteca estándar de MQL5 ofrece varias directivas #include que utilizaremos para diseñar nuestra interfaz. La tabla que aparece a continuación resume los archivos de cabecera relevantes y describe su uso previsto en el proyecto.

Archivo de encabezado Objetivo
Dialog.mqh Proporciona la clase base para ventanas de diálogo, gestionando componentes de la interfaz de usuario, el manejo de eventos y la representación gráfica.
Panel.mqh Se utiliza para agrupar y organizar visualmente los controles, lo que permite crear secciones de diseño como el área principal y el panel de composición.
Label.mqh Muestra texto no editable, como etiquetas de campos de entrada y encabezados de sección como "Nombre de usuario" o "ID de chat".
Edit.mqh Proporciona cuadros de texto editables para que el usuario introduzca datos, incluyendo la redacción de mensajes y las credenciales de Telegram.
Button.mqh Permite la creación de botones en los que se puede hacer clic para acciones del usuario como enviar, adjuntar archivo, hacer una captura de pantalla o cambiar de tema.
VirtualKeys.mqh Define constantes para gestionar eventos de entrada de teclado, como la detección de pulsaciones de la tecla Enter en el campo de mensaje.
Telegram.mqh Gestiona la lógica para el envío de mensajes a través de la API de Telegram Bot, incluyendo las solicitudes de URL y la comunicación HTTP.

El encabezado de la clase CommunicationsDialog (CommunicationsDialog.mqh)

En esta sección, explicaré cómo funciona nuestro código y destacaré las ventajas de organizarlo en partes específicas y reutilizables. Al aislar la lógica de cada panel en su propio encabezado —con definiciones, enumeraciones, declaraciones de clases e implementaciones de métodos— mantenemos nuestro programa principal simple, fácil de mantener y de compartir entre múltiples EA. No es necesario preocuparse por los detalles internos de la interfaz gráfica de usuario cuando se incluye uno de estos encabezados; simplemente se llama a su interfaz. Ahora, vamos a explorar paso a paso cómo mejorar nuestro Panel de Comunicaciones.

Estructura del encabezado de clase

En la parte superior del archivo, protegemos contra inclusiones múltiples e incorporamos todas las dependencias necesarias: 

  • Incluye: Controles de interfaz de usuario estándar de MQL5 (Dialog, Panel, Edit, Button, Label), además de VirtualKeys (para códigos de teclas) y nuestro complemento personalizado Telegram.mqh.

  • Constantes y enumeraciones: macros de geometría de paneles, márgenes de la interfaz de usuario y dos enumeraciones para los tipos de mensajes (OUTGOING, INCOMING, SYSTEM) y los estados (SENT, FAILED).

  • Definición de clase: CCommunicationDialog hereda de CAppDialog y declara:

    1. Propiedades privadas para paneles, botones, etiquetas, campos de edición y un indicador de modo oscuro.
    2. Métodos públicos, entre los que se incluyen el constructor, InitCredentials, CreatePanel, la gestión de eventos (OnEvent) y los controladores de acciones (OnSendMessage, etc.).
    3. Métodos auxiliares privados para crear cada área de la interfaz de usuario, la personalización de temas, la gestión de la entrada y salida del historial y el formato de los mensajes.

#ifndef COMMUNICATIONS_MQH
#define COMMUNICATIONS_MQH

#include <Controls\Dialog.mqh>
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <VirtualKeys.mqh>
#include "Telegram.mqh"

#define COMM_PANEL_LEFT    80enum ENUM_UI_CONSTANTS { UI_INDENT=10, UI_GAP=5, … };
enum ENUM_MESSAGE_TYPE   { MSG_OUTGOING, MSG_INCOMING, MSG_SYSTEM };
enum ENUM_MESSAGE_STATUS { STATUS_SENT,   STATUS_FAILED };

class CCommunicationDialog : public CAppDialog
{
private:
   CPanel  m_mainPanel, m_composePanel;
   CButton m_toggleSidebar, m_sendButton, m_attachButton, m_screenshotButton;
   CLabel  m_usernameLabel, m_chatIdLabel, m_tokenLabel, m_mainUserLabel;
   CEdit   m_usernameInput, m_chatIdInput, m_tokenInput, m_messageThread, m_messageInput;
   bool    m_isDarkMode;

public:
   CCommunicationDialog():m_isDarkMode(false){}
   bool CreatePanel(...);
   virtual bool OnEvent(...);
   void OnSendMessage();
   …  
private:
   bool CreateSidebar();
   bool CreateMainContent();
   bool CreateComposeArea();
   void ApplyTheme();
   void LoadChatHistory(string);
   void SaveMessageToHistory(...);
   string FormatMessage(...);
   void AddMessageToHistory(...);
};
#endif // COMMUNICATIONS_MQH

1. CreatePanel: Montaje del cuadro de diálogo

Este método coordina toda la configuración del cuadro de diálogo. En primer lugar, inicia la creación del cuadro de diálogo básico y, a continuación, genera sucesivamente la barra lateral, la pantalla principal de mensajes y el área de redacción. Se comprueba si cada paso se ha completado correctamente; en caso de error, el cuadro de diálogo se cierra inmediatamente. Una vez que todas las regiones están en su sitio, se aplica el tema actual, se carga el historial guardado y se vuelve a dibujar el gráfico para mostrar la interfaz completa.

bool CCommunicationDialog::CreatePanel(const long chart,const string name,const int subwin,
                                       const int x1,const int y1,const int x2,const int y2)
{
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) return(false);
   if(!CreateSidebar())     { Destroy(); return(false); }
   if(!CreateMainContent()) { Destroy(); return(false); }

   Add(m_mainPanel);
   Add(m_messageThread);
   Add(m_mainUserLabel);

   if(!CreateComposeArea()){ Destroy(); return(false); }
   Add(m_composePanel);
   Add(m_messageInput);
   Add(m_screenshotButton);
   Add(m_attachButton);
   Add(m_sendButton);

   ApplyTheme();
   LoadChatHistory(m_chatIdInput.Text());
   ChartRedraw();
   return(true);
}

2. CreateSidebar: Credenciales y cambio de tema

En la configuración de la barra lateral, colocamos un botón para alternar el tema en la parte superior, seguido de tres campos de entrada etiquetados: nombre de usuario, ID de chat y token del bot. Estos campos permiten introducir manualmente las credenciales de Telegram. Aunque actualmente funciona manualmente, este panel sienta las bases para un futuro sistema de gestión de contactos donde los usuarios podrán almacenar y seleccionar identificadores de chat guardados en lugar de tener que volver a escribirlos.

bool CCommunicationDialog::CreateSidebar()
{
   int x=UI_INDENT, y=UI_INDENT, w=UI_SIDEBAR_WIDTH-2*UI_INDENT, h=16;

   m_toggleSidebar.Create(m_chart_id,m_name+"_Toggle",m_subwin,x,y,x+h,y+h);
   m_toggleSidebar.Text("🌙"); Add(m_toggleSidebar);
   y+=h+UI_GAP;

   m_usernameLabel.Create(...); m_usernameLabel.Text("Username:");
   m_usernameInput.Create(...); Add(m_usernameLabel); Add(m_usernameInput);
   y+=h+UI_GAP;

   m_chatIdLabel.Create(...); m_chatIdLabel.Text("Chat ID:");
   m_chatIdInput.Create(...); Add(m_chatIdLabel); Add(m_chatIdInput);
   y+=h+UI_GAP;

   m_tokenLabel.Create(...); m_tokenLabel.Text("Bot Token:");
   m_tokenInput.Create(...); Add(m_tokenLabel); Add(m_tokenInput);

   return(true);
}

3. CreateMainContent: Visualización del historial de mensajes

Esta sección inicializa el panel central y su control de edición de solo lectura, que muestra el hilo de la conversación. Una etiqueta en la parte superior indica el nombre del usuario actual. Los usuarios no pueden editar directamente los mensajes anteriores; los mensajes nuevos se añaden mediante programación, lo que proporciona una vista clara y lineal del historial de chat.

bool CCommunicationDialog::CreateMainContent()
{
   int x1=UI_SIDEBAR_WIDTH, y1=0;
   int x2=ClientAreaWidth(), y2=ClientAreaHeight()-UI_COMPOSE_HEIGHT;

   m_mainPanel.Create(...);
   m_messageThread.Create(...);
   m_messageThread.ReadOnly(true);
   m_messageThread.FontSize(9);
   m_messageThread.TextAlign(ALIGN_LEFT);

   m_mainUserLabel.Create(...);
   m_mainUserLabel.Text(m_usernameInput.Text());
   return(true);
}

4. CreateComposeArea: Botones de escritura y acción

Aquí construimos el área de redacción inferior donde los usuarios ingresan nuevos mensajes. Incluye un campo de texto de marcador de posición y tres botones de acción: captura de pantalla, adjuntar archivo y enviar. El campo comienza con un texto de ayuda y un color tenue, que guía al usuario para que escriba su mensaje antes de pulsar uno de los botones de acción.

bool CCommunicationDialog::CreateComposeArea()
{
   int caW=ClientAreaWidth(), caH=ClientAreaHeight();
   int y1=caH-UI_COMPOSE_HEIGHT, y2=caH;
   int x1=UI_SIDEBAR_WIDTH, x2=caW;

   m_composePanel.Create(...);

   m_screenshotButton.Create(...); m_screenshotButton.Text(StringFormat("%c",58));
   m_attachButton.    Create(...); m_attachButton.   Text(StringFormat("%c",49));
   m_sendButton.      Create(...); m_sendButton.     Text(StringFormat("%c",216));

   m_messageInput.Create(...);
   m_messageInput.Text("Type here...");
   m_messageInput.Color(clrGray);

   return(true);
}

5. Captura de pantalla: Instantánea GIF

Al hacer clic en el botón de captura de pantalla, el método captura el gráfico actual como un archivo GIF con una marca de tiempo, lo guarda en la carpeta Archivos MQL5 y registra un mensaje del sistema que indica si la operación se realizó correctamente o no. Esto ofrece a los operadores una forma rápida de compartir capturas de gráficos directamente a través de Telegram.

void CCommunicationDialog::OnCaptureScreenshot()
{
   datetime ts=TimeCurrent();
   string tstr=TimeToString(ts, TIME_DATE|TIME_MINUTES|TIME_SECONDS);
   StringReplace(tstr,":","");  

   string path=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\";
   string fn=path+"shot_"+tstr+".gif";

   bool ok=ChartScreenShot(m_chart_id,fn,0,0);
   m_messageThread.Text(
      FormatMessage(ok ? "Screenshot saved: "+fn : "Screenshot failed",
                    MSG_SYSTEM, ok ? STATUS_SENT : STATUS_FAILED, ts));
   ChartRedraw();
}

6. OnSendMessage: Envío e historial

Este controlador valida que el mensaje introducido no esté vacío y que se hayan proporcionado las credenciales. Llama a nuestra función de envío de Telegram, registra el resultado en un archivo de historial y añade el nuevo mensaje, con un icono de marca de verificación o de cruz, a la visualización del hilo de conversación. Finalmente, restablece el campo de entrada a su estado de marcador de posición y activa un redibujado.

void CCommunicationDialog::OnSendMessage()
{
   string txt=m_messageInput.Text();
   if(txt==""||txt=="Type here...") { /* show error */ return; }

   string chatId=m_chatIdInput.Text(), token=m_tokenInput.Text();
   if(chatId==""||token=="")        { /* show error */ return; }

   datetime ts=TimeCurrent();
   bool sent = SendMessageToTelegram(txt, chatId, token);
   SaveMessageToHistory(chatId, ts, MSG_OUTGOING,
                        sent ? STATUS_SENT : STATUS_FAILED, txt);

   m_messageThread.Text(FormatMessage(txt, MSG_OUTGOING,
                                     sent ? STATUS_SENT : STATUS_FAILED, ts));

   m_messageInput.Text("Type here...");
   m_messageInput.Color(clrGray);
   ChartRedraw();
}

7. Métodos auxiliares para la gestión de temas y el formato

Los métodos de soporte gestionan la aplicación de temas dinámicos y el formato de los mensajes. ApplyTheme cambia los colores de fondo y del texto para el modo oscuro o claro. FormatMessage crea líneas con marca de tiempo, prefijos de usuario o del sistema e iconos de enviado/fallido. Los métodos de entrada/salida del historial guardan y cargan las conversaciones en archivos de datos por chat, lo que garantiza la persistencia entre sesiones.

void CCommunicationDialog::ApplyTheme()
{
   color bg = m_isDarkMode ? (color)0x2E2E35 : clrWhite;
   color txt= m_isDarkMode ? clrWhite       : clrBlack;
   m_mainPanel.ColorBackground(bg);
   m_composePanel.ColorBackground(bg);
   m_messageThread.Color(txt);
   m_messageInput.Color(txt);
   …
}

string CCommunicationDialog::FormatMessage(const string message,
                                           ENUM_MESSAGE_TYPE type,
                                           ENUM_MESSAGE_STATUS status,
                                           datetime ts)
{
   string user = (type==MSG_OUTGOING ? m_mainUserLabel.Text()
                                     : type==MSG_INCOMING ? "Them" : "System");
   string ico = (status==STATUS_SENT ? ShortToString(0x2713)
                                     : ShortToString(0x2717));
   return StringFormat("[%s] %s: %s %s",
                       TimeToString(ts,TIME_MINUTES), user, message,
                       (type==MSG_SYSTEM ? "" : ico));
}

Integración de la clase CommunicationsDialog en el EA

En el EA principal (New_Admin_Panel.mq5), el encabezado Communications.mqh se implementa en la rutina HandleCommunications. Cuando el usuario hace clic en el botón Comunicaciones, el código activa o desactiva la visibilidad de una instancia existente de CCommunicationDialog o, en el primer uso, instancia el diálogo, lo inicializa con el ID de chat y el token del bot almacenados y crea su interfaz de usuario llamando a CreatePanel. Finalmente, llama a show() para mostrar el panel en el gráfico. Este patrón —creación diferida al primer clic, seguida de una lógica simple de mostrar/ocultar— mantiene el uso de recursos al mínimo y separa claramente la interfaz CommunicationsDialog del resto de EA.

// handle showing/hiding communications panel
void HandleCommunications()
{
   if(g_commPanel)
   {
      // toggle visibility if already created
      if(g_commPanel.IsVisible()) g_commPanel.Hide();
      else                        g_commPanel.Show();
      ChartRedraw();
      return;
   }

   // first‐time creation
   g_commPanel = new CCommunicationDialog();

   // build the UI
   if(!g_commPanel.CreatePanel(g_chart_id,
                               "CommunicationsPanel",
                               g_subwin,
                               80, 100, 430, 500))
   {
      delete g_commPanel;
      g_commPanel = NULL;
      Print("CommPanel creation failed: ", GetLastError());
      return;
   }

   // pre‐fill credentials and display
   g_commPanel.InitCredentials(TwoFactorChatID, TwoFactorBotToken);
   g_commPanel.Show();
   ChartRedraw();
}


Pruebas y resultados

Comencé compilando el EA en MetaTrader 5 sin errores ni advertencias. En el momento del lanzamiento, la interfaz principal apareció como se esperaba, con los botones de alternancia, Comercio, Comunicaciones, Análisis y Mostrar todo/Ocultar todo.

1. Presentación del Panel de Comunicaciones

Al hacer clic en el botón «Comunicaciones», se creó el cuadro de diálogo CCommunicationDialog. El cuadro de diálogo apareció en el área del gráfico asignada, lo que confirma que la rutina CreatePanel y sus secciones de barra lateral, hilo principal y composición se construyeron correctamente.

2. Introducción de credenciales

Probé ambos métodos para introducir las credenciales: colocar valores en los parámetros de entrada de EA (TwoFactorChatID y TwoFactorBotToken) y editarlos directamente a través de los campos ID de chat y Token de bot de la barra lateral. En ambos casos, InitCredentials rellenó correctamente los campos y actualizó la etiqueta "You".

3. Enviar un mensaje

Tras introducir las credenciales válidas, escribí un mensaje de ejemplo en el cuadro de redacción y pulsé Intro o hice clic en el botón Enviar. El mensaje apareció en el hilo con un icono ✓, y recibí el mismo mensaje en mi chat de Telegram, lo que demuestra que la lógica de WebRequest y el escape de JSON funcionan según lo previsto.

4. Alternar tema

Al pulsar el botón de la luna/sol, se alternaba instantáneamente entre el modo claro y el oscuro. Los colores de fondo y del texto del panel se actualizaron, y se añadió un mensaje del sistema ("Modo oscuro activado" o "Modo claro activado") al hilo de conversación.

5. Captura de pantalla y botones para adjuntar

Al pulsar el botón de captura de pantalla, se espera que se capture y guarde un archivo GIF en la carpeta MQL5\Files, se imprima un mensaje de confirmación y se informe del fallo. Actualmente, el botón para adjuntar archivos muestra un mensaje del sistema como marcador de posición ("Adjunto TBD"), lo que indica que la funcionalidad completa de carga de archivos aún no se ha implementado.

Probando la actualización del panel de comunicaciones


Conclusión

Es perfectamente factible crear un panel de mensajes moderno y funcional totalmente integrado en un Asesor Experto, pero los controles actuales de la biblioteca estándar imponen algunas limitaciones; en particular, el control CEdit integrado solo admite una única línea y un número limitado de caracteres. En esta primera fase, hemos entregado una estructura básica sólida con entrada de credenciales, redacción de mensajes, personalización del tema e integración con Telegram. Mediante mi investigación, también he identificado extensiones desarrolladas por la comunidad que superan estas mismas limitaciones; compartiré esas referencias en la próxima actualización.

De cara al próximo artículo, estos son nuestros objetivos clave:

1. Historial de chat multilínea

  • Los mensajes entrantes se alinean a la izquierda; los salientes, a la derecha.
  • Ajuste automático de texto y barra de desplazamiento cuando el contenido excede el área de visualización.

2. Sistema de gestión de contactos

  • Una sencilla libreta de direcciones con almacenamiento persistente y recuperación por nombre de usuario o ID de chat.

3. Compatibilidad fiable con capturas de pantalla y archivos adjuntos.

  • Flujos de trabajo garantizados para la creación y carga de archivos.
  • Esto ayudará a los operadores a compartir información sobre gráficos en tiempo real al instante, lo cual es fundamental para la colaboración en equipo y el análisis de las operaciones. 

4. Atajos de teclado mejorados

  • Asignaciones de envío rápido para mensajes y comandos comunes

Estas son solo algunas de las mejoras previstas en nuestra hoja de ruta. Sus comentarios y sugerencias siempre son bienvenidos; este es un proceso continuo de aprendizaje, colaboración y mejora. Próximamente, ofreceremos una experiencia de mensajería mediante API externa mucho más pulida dentro de MetaTrader 5. Espero que este artículo aporte al menos una idea nueva a tu forma de pensar como programador.

Felices operaciones y no se pierdan el próximo artículo.

Archivo Especificaciones
New_Admin_Panel.mq5 Un sistema integrado de asesores expertos de múltiples paneles para la gestión avanzada de operaciones en MetaTrader 5.
CommunicationsDialog.mqh Módulo del panel de comunicaciones:
Define un panel de interfaz de mensajes moderno (basado en Telegram) para los asesores expertos de MetaTrader 5. Colócalo en la carpeta include de la terminal.
All Modules.zip  Contiene todos los encabezados necesarios. Añádelos a la carpeta MQL5/Include.

Volver a la introducción


Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/17869

Archivos adjuntos |
All_Modules.zip (17.78 KB)
Utilizando redes neuronales en MetaTrader Utilizando redes neuronales en MetaTrader
En el artículo se muestra la aplicación de las redes neuronales en los programas de MQL, usando la biblioteca de libre difusión FANN. Usando como ejemplo una estrategia que utiliza el indicador MACD se ha construido un experto que usa el filtrado con red neuronal de las operaciones. Dicho filtrado ha mejorado las características del sistema comercial.
Del básico al intermedio: Eventos en Objetos (II) Del básico al intermedio: Eventos en Objetos (II)
En este artículo, veremos cómo funcionan los tres últimos tipos de eventos que puede disparar un objeto. Entender esto será muy divertido, ya que, al final, haremos algo que, para muchos, puede parecer una especie de locura, pero que es perfectamente posible y tiene un resultado bastante sorprendente.
Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
Del básico al intermedio: Eventos en objetos (I) Del básico al intermedio: Eventos en objetos (I)
En este artículo, veré tres de los seis eventos que MetaTrader 5 puede disparar cuando algo sucede con un objeto presente en el gráfico. Estos eventos son muy útiles cuando se trata de interacción con el usuario. Esto se debe a que, sin entender estos eventos, tendrás mucho más trabajo para mantener cierta configuración en el gráfico, al intentar controlar objetos con finalidades específicas.