English 中文 Deutsch 日本語
preview
Создание панели администратора торговли на MQL5 (Часть XI): Современный интерфейс мессенджера в платформе (I)

Создание панели администратора торговли на MQL5 (Часть XI): Современный интерфейс мессенджера в платформе (I)

MetaTrader 5Примеры |
78 0
Clemence Benjamin
Clemence Benjamin

Содержание:


Введение

Терминал MetaTrader 5 стремительно развивается и превращается в более эффективное и компактное рабочее пространство для трейдинга. Добавленный относительно недавно функционал чатов позволяет трейдерам общаться с друзьями из MQL5, присоединяться к группам и подписываться на каналы — и все это непосредственно внутри терминала. На мой взгляд, это значительный шаг вперед в развитии сообщества MQL5.

Чтобы получить доступ к этой удобной функции, нужно авторизоваться со своим MQL5-аккаунтом в терминале, добавить друзей и подписаться на активные каналы или группы. Эти сообщества представляют собой ценный источник торговых инсайтов: эксперты регулярно делятся идеями, скриншотами и проводят обсуждения в реальном времени. Более того, как я уже сказал, это органично интегрировано прямо в терминал без необходимости покидать график.

Однако все-таки существует некое ограничение: вся коммуникация замкнута внутри экосистемы MQL5. Не хватает возможности связать MetaTrader 5 с внешними социальными платформами. К счастью, API терминала и возможности WebRequest позволяют подключаться к сторонним серверам для обмена сообщениями — таким как Telegram, WhatsApp и другим.

Собственно такой функционал, среди прочих, и призвана решить наша панель администратора через отдельную современную панель коммуникации с удобным интерфейсом, вдохновленным привычными мессенджерами, которые мы используем ежедневно. И сейчас мы переходим от прототипа, напоминающего калькулятор, к более интуитивному и профессионально оформленному дизайну. Хотя первоначальная основа хорошо послужила для начального тестирования, новая версия будет поддерживать полноценную двустороннюю коммуникацию.

Теперь сообщения отправляет не только администратор — получатели также смогут отвечать. Этот переход требует реализации корректной системы контактов с использованием уникальных идентификаторов для управления внешними адресатами.

На рисунке ниже показано, как найти MQL5 Community и чаты из торговой платформы MetaTrader 5. Значок аккаунта располагается в правом верхнем углу интерфейса терминала, как показано на изображении.

Аккаунт MQL5

Доступ к MQL5 Community и чатам из терминала MetaTrader 5

Если вы уже добавили MQL5-аккаунт, терминал обычно отображает соответствующее уведомление в журнале запуска, подтверждая активацию учетной записи MQL5 Community и чатов. Вот как выглядит журнал запуска моего терминала от 16 апреля 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'

Далее в обзоре мы подробно рассмотрим фактический дизайн и как планируем реализовать следующий этап развития нашей Коммуникационной панели.


Обзор

Замечу, что благодаря последним улучшениям в организации кода добавлять новый функционал в программу стало проще. И теперь мы можем изолированно работать с панелью коммуникации, не затрагивая другие компоненты нашего масштабного проекта. Такой модульный подход помогает нам максимально раскрыть нашу креативность.

И сегодняшние изменения на панели коммуникации будут похожи на то, что мы делали ранее для нашей главной панели. Пока нашу коммуникационную панель нельзя назвать привлекательной и удобной, поэтому нам предстоит серьезная работа по ее доработке и улучшению.

Мы продолжим использовать стандартную библиотеку MQL5, но в данной версии также будут представлены новые пользовательские классы, адаптированные под наши задачи. Чтобы понять направление разработки, начнем с концептуального проектирования интерфейса, определим ключевые компоненты и опишем их назначение. После этого перейдем к написанию кода и реализации.


Характеристики интерфейса обмена сообщениями на основе популярных приложений

Прежде чем приступить к проектированию собственного интерфейса, рассмотрим общие характеристики интерфейсов мессенджеров, используемых в самых популярных современных приложениях. Мы можем почерпнуть идеи из существующих решений и адаптировать их, добавляя или убирая функционал, под наши текущие цели.

Ниже приведены десять ключевых характеристик для анализа. Рассмотрим их а потом посмотрим на изображения, чтобы визуально оценить, как эти элементы реализуются в реальных приложениях.

1. Чистый и минималистичный дизайн:

  • Плоский интерфейс с современной цветовой схемой (светлый/темный режим)
  • Единообразные отступы и выравнивание
  • Закругленные облачка сообщений и плавные переходы
  • Простые иконки (скрепка, эмодзи, микрофон и т.д.) с интуитивным расположением

2. Область ветки сообщений (основное окно чата):

  • Прокручиваемая область с историей сообщений
  • Временные метки в сообщениях
  • Группировка сообщений по отправителю
  • Визуальная обратная связь: доставлено, прочитано, отредактировано, закреплено
  • Поддержка мультимедиа (изображения, видео, голосовые сообщения, файлы)

 3. Боковая панель — контакты или каналы:

  • Список пользователей, групп или каналов
  • Индикаторы онлайн-статуса (зеленые точки, последнее посещение)
  • Предпросмотр последних сообщений
  • Поиск и фильтрация

4. Верхняя панель навигации:

  • Название чата или имя контакта
  • Аватары пользователей или иконки групп
  • Выпадающее меню настроек/опций (отключить звук, архивировать, удалить и т.д.)
  • Кнопка информации для просмотра профиля пользователя или группы

 5. Область ввода сообщения (нижняя панель):

  • Поле ввода текста с подсказкой (Введите сообщение…)
  • Описание кнопок:
  • Отправить (иконка бумажного самолетика)
  • Прикрепить файл (скрепка)
  • Выбор эмодзи (смайлик)
  • Голосовой ввод (иконка микрофона)
  • Горячие клавиши (Enter — отправка, Shift+Enter — новая строка)

6. Предпросмотр медиа и вложений:

  • Встроенный просмотр изображений, видео и файлов
  • Развернуть/свернуть
  • Поддержка drag-and-drop загрузки

 7. Уведомления и оповещения:

  • Внутренние и системные уведомления
  • Переключатель звука/вибрации
  • Упоминания с подсветкой (@username)
  • Всплывающие сообщения или бейджи (счетчик непрочитанных)

 8. Синхронизация между устройствами:

  • Веб-, мобильные и десктопные приложения с синхронизацией в реальном времени
  • Постоянная история чатов между сессиями
  • Поддержка офлайн-режима с автоматической синхронизацией при подключении

9. Функции безопасности и конфиденциальности:

  • Сквозное шифрование (например, в WhatsApp)
  • Таймер сообщений/самоуничтожение (в Telegram)
  • Двухфакторная аутентификация и защищенные сессии входа

10. Расширяемость и боты:

  • Поддержка ботов и автоматизации
  • Плагины/интеграции с другими инструментами (календарь, менеджер задач, торговый терминал)
  • Развитые API и поддержка WebSocket
Теперь посмотрим на изображения, чтобы визуально все это оценить. Напомним, что при внедрении концепции двухфакторной аутентификации мы упоминали получение кода подтверждения через специализированного Telegram-бота. Выделим ключевые компоненты интерфейса обмена сообщениями. Исходя из моих наблюдений и компоновки Telegram, я отметил следующие элементы:
  • Область ввода сообщения выделена красной рамкой.
  • История чата выделена синей рамкой.
  • Верхняя часть, выделенная зеленой рамкой, включает имя контакта, кнопку поиска и меню из трех точек.
См. изображение ниже.

Пример чата в Telegram

Еще одним близким примером является интерфейс обмена сообщениями MQL5 — этот из созданного ранее канала на MQL5. Обратите внимание на компоновку ниже — можно заметить сходства и некоторые отличия по сравнению с предыдущим изображением Telegram. Из этой общей структуры интерфейса можно извлечь полезные идеи.

Пример чата в MQL5 Chats

Количество возможных эталонных примеров практически неограниченно. Многие из них следуют схожей структуре — системы электронной почты с кнопками ответа и дополнительными функциями, интерфейсы чат-ботов или другие решения. Все они дают ценные представления о том, какие элементы обычно требуются коммуникационному интерфейсу. На основе этих примеров мы можем перейти к выбору наиболее подходящего дизайна для нашей торговой коммуникационной панели с учетом ее ограничений и специфики предполагаемого использования.


Проектирование и реализация кода

Именно здесь начинается переход от текущей панели к новой. Однако прежде необходимо определить ключевые потребности администратора торговли при взаимодействии с другими трейдерами. Обычно они включают:

1. Специальные инструкции для трейдеров

Ранее мы уже реализовали идею кнопок быстрых сообщений для сокращения времени между составлением и отправкой сообщения. Это позволяет оперативно передавать важную информацию. Однако администратору также необходима возможность отправлять произвольные сообщения, и область ввода сообщения предназначена именно для этого. Мы улучшим механизм доступа к быстрым сообщениям.

2. Односторонняя и двусторонняя коммуникация

Обычно отправка сообщений разрешена только администратору, что делает систему односторонней. Однако существуют ситуации, когда сообщество трейдеров должно иметь возможность отвечать. В новых версиях панели мы должны предусмотреть такую возможность.

3. Обмен скриншотами и визуальный анализ

Нам важно добавить возможность обмена изображениями — особенно графиками или скриншотами с подписями. Терминал MQL5 уже включает инструмент создания скриншотов с возможностью загрузки в графики сообщества MQL5. Нам нужно добавить кнопку, которая будет создавать скриншот и прикреплять его к сообщению для быстрой отправки. Это позволит более эффективно передавать торговые идеи визуально.

4. Управление контактами

Поскольку Telegram поддерживает различные режимы коммуникации — личные чаты, каналы и группы — можно использовать уникальные chat ID для разделения контакты и организации по категориям (индивидуальные и групповые). Это также подразумевает необходимость эффективного хранения и извлечения контактов в нашем приложении.

Ниже представлен наш концептуальный дизайн. Далее мы перейдем к реализации кода.

NewDesignCommunicationsPanel

Новый дизайн: Коммуникационная панель

В настоящий момент наш приоритет — доработка дизайна интерфейса. В следующих разделах статьи мы будем развивать эту основу, добавляя новые функции и совершенствуя пользовательский опыт.

Будем использовать директивы #include из стандартной библиотеки MQL5 для проектирования интерфейса. В таблице перечислены файлы и их назначение в проекте.

Header File Назначение
Dialog.mqh Базовый класс для диалоговых окон, управление UI-компонентами, обработку событий и отрисовку.
Panel.mqh Используется для группировки и визуального размещения элементов управления, формируя секции макета (основная область и панель ввода).
Label.mqh Отображает нередактируемый текст, например подписи полей ввода и заголовки разделов (Username, Chat ID).
Edit.mqh Редактируемые текстовые поля для ввода пользователем, включая составление сообщений и ученые данные Telegram.
Button.mqh Обеспечивает создание кликабельных кнопок для действий пользователя (Send, Attach File, Screenshot, Theme Toggle).
VirtualKeys.mqh Определяет константы для обработки событий клавиатуры, например обнаружение нажатия клавиши Enter в поле сообщения.
Telegram.mqh Реализует логику отправки сообщений через Telegram Bot API, включая формирование URL-запросов и HTTP-коммуникацию.

Заголовочный файл класса CommunicationsDialog (CommunicationsDialog.mqh)

В этом разделе разберем, как работает код. Также рассмотрим преимущества организации кода в виде изолированных, повторно используемых компонентов. Изолируя логику каждой панели в отдельном файле с нужными определениями, перечислениями, объявлениями классов и реализациями методов, мы сохраняем основной код простым, его легко поддерживать и использовать в разных советниках. Вам не нужно погружаться в детали интерфейса при подключении такого файла; достаточно вызвать сам интерфейс. Давайте рассмотрим все изменения по шагам.

Структура заголовочного файла класса

В начале файла реализована защита от множественного подключения inlcude?, добавлены необходимые зависимости: 

  • Includes: стандартные элементы UI MQL5 (Dialog, Panel, Edit, Button, Label), VirtualKeys (коды клавиш) и наш пользовательский Telegram.mqh.

  • Константы и перечисления: макросы геометрии панели, отступы UI и два перечисления для типов сообщений (OUTGOING, INCOMING, SYSTEM) и статусов (SENT, FAILED).

  • Определение класса: CCommunicationDialog наследуется от CAppDialog и объявляет:

    1. Приватные члены для панелей, кнопок, подписей, полей ввода и флага темного режима.
    2. Публичные методы: конструктор, InitCredentials, CreatePanel, обработчик событий (OnEvent) и методы действий (OnSendMessage и др.).
    3. Приватные вспомогательные методы для построения UI-секций, применения темы, работы с историей и форматирования сообщений.

#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— сборка диалога

Этот метод координирует создание всего диалога. Сначала вызывается базовое создание окна, затем последовательно формируются боковая панель, основная область сообщений и зона ввода. На каждом этапе у нас есть проверка, и в случае ошибки немедленно завершаем работу. После того, как все все области построены, применяется текущая тема, загружается сохраненная история и выполняется перерисовка графика для отображения всего интерфейса.

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 — учетные данные и переключатель темы

В боковой панели размещается кнопка переключения темы в верхней части, затем три подписанных поля ввода: username, chat ID и bot token. Эти поля позволяют вручную вводить учетные данные Telegram. Это основа для будущей системы управления контактами, где пользователи смогут сохранять и выбирать chat ID без повторного ввода.

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 — отображение истории сообщений

Здесь у нас инициализируется центральная панель и связанный с ней read-only элемент Edit, отображающий ветку диалога. Подпись в верхней части показывает имя текущего пользователя. Пользователь не может редактировать предыдущие сообщения напрямую — новые сообщения добавляются программно для чистого и линейного представления истории.

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 — ввод текста и кнопки действий

Здесь формируется нижняя область ввода сообщений. Она включает текстовое поле с подсказкой и три кнопки: скриншот, прикрепление файла и отправка. Поле начинается с текста-подсказки и приглушенного цвета. Пользователь должен ввести сообщение перед использованием кнопок действий.

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. OnCaptureScreenshot — создание GIF-снимка

При нажатии кнопки метод делает скриншот текущего графика в виде GIF-файла с именем на основе временной метки, сохраняет его в папке MQL5\Files и добавляет системное сообщение - удалась операция или нет. Это полезная функция для быстрой отправки скриншотов графиков через 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 — отправка и история

Этот обработчик проверяет, что сообщение не пустое и что учетные данные заполнены. Затем вызывается функция отправки через Telegram, результат записывается в файл истории, а новое сообщение с иконкой галочки или крестика добавляется в поток диалога. После этого поле ввода возвращается в исходное состояние.

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. Вспомогательные методы для тем и форматирования

Эти методы обеспечивают динамическое переключение темы и форматирование сообщений. ApplyTheme меняет цвета фона и текста для светлого или темного режима. FormatMessage формирует строки с временными метками, префиксами пользователя или системы и иконками статуса отправки. Методы работы с историей сохраняют и загружают переписку в файлы данных для каждого чата, так они не теряются между сессиями.

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));
}

Интеграция класса CommunicationsDialog в советник

В основном файле советника (New_Admin_Pane.mq5) файл Communications.mqh активируется в методе HandleCommunications. При нажатии пользователем кнопки Communications код либо переключает видимость существующего экземпляра CCommunicationDialog, либо — при первом использовании — создает новый экземпляр, инициализирует его сохраненными значениями chat ID и bot token, и строит интерфейс вызовом CreatePanel. Затем вызывается show() для отображения панели на графике. Такое ленивое создание при первом клике с последующей логикой показа/скрытия минимизирует потребление ресурсов и обеспечивает четкое разделение интерфейса CommunicationsDialog и остальной части советника.

// 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();
}


Тестирование и результаты

Сначала я скомпилировал советник — там было без ошибок и предупреждений. После запуска советника основной интерфейс отобразился корректно: кнопки Toggle, Trade, Communications, Analytics и Show All/Hide All на месте.

1. Запуск Коммуникационной панели

При нажатии кнопки Communications был создан экземпляр CCommunicationDialog. Диалог отобразился в выделенной области графика, то есть CreatePanel работает корректно, а также построились ее боковая панель, область сообщений и зона ввода.

2. Ввод данных для авторизации

Я протестировал оба способа ввода: через входные параметры советника (TwoFactorChatID и TwoFactorBotToken) и через поля Chat ID и Bot Token на боковой панели. В обоих случаях InitCredentials корректно заполнил поля и обновил подпись You.

3. Отправка сообщения

После указания данных я напечатал тестовое сообщение и нажал Enter или кнопку Send. Сообщение появилось в ветке с иконкой ✓, и я получил его в чате Telegram. Это подтверждает корректную работу WebRequest и экранирования JSON.

4. Переключение темы

Нажатие кнопки с иконкой месяца/солнца переключает светлый и темный режим. Цвета фона и текста обновились, в ветке появлялось системное сообщение (Dark mode enabled или Light mode enabled).

5. Кнопки Screenshot и Attach

При нажатии кнопки скриншота создается и сохраняется GIF-файл в папке MQL5\Files, также в журнал выводится соответствующее сообщение. Кнопка прикрепления файла пока выводит системное сообщение-заглушку (Attachment TBD), что указывает на необходимость реализации полной поддержки загрузки файлов.

Тестирование обновления Коммуникационной панели


Заключение

Создание современной панели обмена сообщениями, полностью интегрированной в Expert Advisor, абсолютно реализуемо, однако элементы стандартной библиотеки накладывают определtнные ограничения. В частности, встроенный CEdit поддерживает только одну строку и ограниченное количество символов. На данном первом этапе мы реализовали базовую архитектуру с вводом учетных данных, компоновкой сообщений, поддержкой тем и интеграцией с Telegram. В ходе работы над статьей я также обнаружил расширения, разработанные сообществом, которые устраняют указанные ограничения. Я дам ссылки на них в следующем обновлении.

Цели для следующей статьи:

1. Многострочная история чата

  • Выравнивание входящих сообщений по левому краю, исходящих — по правому
  • Автоматический перенос строк и скролл при превышении области просмотра

2. Система управления контактами

  • Простая адресная книга с постоянным хранением и доступом по username или chat ID

3. Поддержка скриншотов и вложений

  • Создание и загрузка файлов
  • Это позволит трейдерам мгновенно делиться аналитикой графиков в реальном времени. Именно это критически важно для работы в команде и анализа сделок. 

4. Расширенные возможности горячих клавиш

  • Быстрая отправка типовых сообщений и команд

Это лишь часть планируемых улучшений. Ваши отзывы и предложения приветствуются, они помогают дальше развиваться. Думаю, уже скоро мы сможем отпраздновать полноценную интеграцию внешнего API обмена сообщениями внутри MetaTrader 5. Надеюсь, эта статья вдохновит читателей на новые идеи.

Успешной торговли и до встречи в следующей статье!

Файл Описание
New_Admin_Panel.mq5 Советник с интегрированной системой панелей для расширенного управления торговлей в MetaTrader 5.
CommunicationsDialog.mqh Модуль панели коммуникации:
Современная панель интерфейса сообщений (на основе Telegram) для советников MetaTrader 5. Поместите файл в папку include терминала.
All Modules.zip  Все необходимые header-файлы. Сохраните их в папку MQL5/Include.

Назад к введению


Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/17869

Прикрепленные файлы |
All_Modules.zip (17.78 KB)
От новичка до эксперта: Ориентирование в непредсказуемой стихии рынка От новичка до эксперта: Ориентирование в непредсказуемой стихии рынка
Рыночные правила постоянно развиваются, а многие некогда надежные принципы постепенно теряют свою эффективность. То, что работало в прошлом, с течением времени больше не работает стабильно. Сегодняшнее обсуждение сосредоточено на диапазонах вероятностей и на том, как их можно использовать для навигации по рыночным нерегулярностям. Мы будем использовать MQL5 для разработки алгоритма, способного эффективно торговать даже в самых нестабильных рыночных условиях. Присоединяйтесь к этой дискуссии, чтобы узнать больше.
Конвейеры обработки данных (пайплайны) в MQL5 Конвейеры обработки данных (пайплайны) в MQL5
В этой статье рассмотрим ключевой этап подготовки данных для машинного обучения, который быстро приобретает все большее значение. Конвейеры предварительной обработки данных. По сути, это упрощенная последовательность этапов преобразования данных, на которых происходит подготовка исходных данных перед их передачей в модель. Какой бы неинтересной она ни показалась непосвященным на первый взгляд, такая «стандартизация данных» не только экономит время обучения и затраты на выполнение, но и в значительной степени способствует более качественному обобщению. В этой статье сосредоточимся на некоторых функциях предварительной обработки SCIKIT-LEARN и, хотя мы не будем использовать Мастер MQL5, вернемся к нему в последующих статьях.
Нейросети в трейдинге: Масштабируемые трансформеры со структурной декомпозицией признаков (FAT) Нейросети в трейдинге: Масштабируемые трансформеры со структурной декомпозицией признаков (FAT)
Статья объясняет, как структурная декомпозиция признаков в Field-Aware Transformer улучшает моделирование взаимодействий между полями рыночных данных и сохраняет вычислительную управляемость. Детально разобраны структурированная токенизация, поле‑зависимые проекции внимания и разреженный Top‑K механизм выбора параметров на общем базисе. Приведена реализация на MQL5, включающая эмбеддинги полей и генератор параметров. Практическая польза — снижение переобучения и контролируемый рост сложности при расширении признаков.
Разработка инструментария для анализа движения цен (Часть 21): Поиск разворотов рыночной структуры Разработка инструментария для анализа движения цен (Часть 21): Поиск разворотов рыночной структуры
Советник для поиска разворотов на рынке Market Structure Flip Detector позволяет отслеживать изменения рыночных настроений. Он использует пороговые значения, вычисленные на основе ATR, чтобы отслеживать изменения структуры. Советник помечает каждый более высокий и более низкий максимум. Благодаря быстрому выполнению кода и гибкому API, этот инструмент предлагает анализ в реальном времени, визуализирует информацию на графике и содержит интерактивную панель мониторинга для отслеживания количества и времени разворотов. Кроме того, можно настроить звуковые и push-уведомления, чтобы не пропустить ни один важный сигнал и строить действенные стратегии на основе простых входных данных и вспомогательных функций.