English
preview
От новичка до эксперта: Создание анимированного советника для новостей в MQL5 (V) — Система напоминаний о событиях

От новичка до эксперта: Создание анимированного советника для новостей в MQL5 (V) — Система напоминаний о событиях

MetaTrader 5Примеры |
70 1
Clemence Benjamin
Clemence Benjamin

Содержание:


Введение

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

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

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

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


Концепция

В этом разделе мы сначала рассмотрим возможности MQL5 в области оповещений и обсудим план интеграции. В следующем параграфе вы познакомитесь с оповещениями в MetaTrader 5.

Ознакомление с оповещениями на MOL5

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

Однако MQL5 предоставляет мощные функции для создания настраиваемых оповещений, включая Alert(), PlaySound(), SendMail() и SendNotification(). Эти функции генерируют всплывающие диалоговые окна, звуковые сигналы и сообщения, которые можно получать как на рабочий стол, так и на мобильных терминалах MetaTrader 5. Даже без использования явной функции оповещения вы все равно можете регистрировать важные события с помощью функции Print() для вывода сообщений на вкладку Journal (Журнал).

Дальнейшая интеграция возможна за счет расширения встроенного механизма Alert() для работы с внешними сервисами уведомлений, такими как Telegram, Discord и другими, посредством вызовов API. Хотя сегодняшняя дискуссия не касается этих внешних интеграций, они были рассмотрены на некоторых наших предыдущих сессиях.

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

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

ФункцияОписание Адаптивность к советнику «Заголовки новостей»
Alert()Отображает всплывающее диалоговое окно с сообщением в терминале MetaTrader 5. Оно прерывает работу пользователя, показывая ему немедленную информацию на экране, а также регистрирует сообщение в журнал эксперта. Отлично подходит для оповещения трейдеров о предстоящих важных событиях или внезапных изменениях, обнаруженных советником, обеспечивая привлечение внимания пользователя даже во время торговых сессий в режиме реального времени.
PlaySound()Воспроизводит пользовательский звуковой файл (формат WAV) на рабочем столе терминала. Нужен для подачи звукового сигнала, не требуя от пользователя смотреть на экран. Идеально подходит для добавления звукового сигнала при появлении в советнике заголовков новых новостей, сигналов индикаторов или аналитики от искусственного интеллекта, помогая трейдерам оставаться в курсе событий даже в режиме многозадачности.
SendMail()Отправляет электронное сообщение через SMTP-сервер, настроенный в настройках MetaTrader 5. Электронное письмо может содержать тему и основной текст с соответствующими торговыми подробностями. Полезно для предоставления подробных сводок новостей или оповещений о важных событиях трейдерам, которые предпочитают получать обновления за пределами терминала, особенно когда они находятся вдали от своего стационарного рабочего места.
SendNotification()Отправляет push-уведомление в мобильное приложение MetaTrader 5, позволяя трейдерам получать краткие сообщения на смартфоны или планшеты в режиме реального времени. Идеально подходит для мгновенного оповещения трейдеров о критических событиях, обновлениях основных новостей или важной информации от искусственного интеллекта, обнаруженных советником, что позволяет им оставаться на связи независимо от их физического местоположения.

Как видно из приведенной выше таблицы, опции, которые привлекают немедленное внимание, такие как всплывающие в терминале уведомления и звуковые сигналы, особенно ценны, поскольку нам надо заранее получать уведомления о предстоящих событиях, чтобы вовремя подготовиться. В этом контексте оповещения на терминале будут иметь более высокий приоритет, в то время как SendMail() и sendNotification() будут использоваться в качестве дополнительных опций. Хотя электронное письмо и push—уведомления приводят к небольшой задержке при передаче сообщений, как правило, она минимальна, но все же важно учитывать, когда время имеет решающее значение.

Расширяемость

Как упоминалось ранее, мы можем расширить возможности советника для поддержки внешних уведомлений на других платформах, интегрировав API. Это включает в себя создание пользовательских функций, которые собирают информацию об оповещениях и передают ее через WebRequest на внешние серверы, обеспечивая связь и уведомления через такие сервисы, как Slack, Telegram, SMS-шлюзы или пользовательские веб-приложения. Такой подход делает советника «Заголовки новостей» очень гибким и способным органично вписываться в различные торговые процессы и экосистемы уведомлений.

План интеграции

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


Реализация

Шаг 1: Конфигурация входных данных 

Интеграция начинается с определения всех связанных с оповещениями параметров в одном месте: глобальные переключатели для оповещений и push‑уведомлений, отдельные переключатели для высокого/среднего/ низкого уровня воздействия и параметр “за несколько минут до”. Такая централизованная настройка не только упрощает пользовательский интерфейс — трейдеры могут точно определять, какие события вызывают всплывающие окна или push-уведомления, ‑ но и упрощает условную логику советника. При инициализации советник считывает эти входные данные, а затем просто проверяет каждые из них перед запуском любого оповещения, избегая жестко заданных значений или скрытых флагов в коде.

//--- ALERT INPUTS ---------------------------------------------------
input bool   InpEnableAlerts        = true; //Enable Alerts
input bool   InpAlertHigh           = true; //High Impact Alerts
input bool   InpAlertMed            = false; // Medium Impact Alerts
input bool   InpAlertLow            = false; // Low Impact Alerts
input int    InpAlertMinutesBefore  = 5; //Alert Minutes Before Event

//--- PUSH NOTIFICATIONS INPUTS -------------------------------------
input bool   InpEnablePush          = false; //Enable Push Notifications
input bool   InpPushHigh            = true;  //High Impact Push
input bool   InpPushMed             = false;  //Medium Impact Push
input bool   InpPushLow             = false;  //Low impact Push

Шаг 2: Отслеживание состояния события

Каждое событие календаря заключено в объект CEvent, который содержит собственное логическое значение alerted, инициализированное значением false. Когда программа определяет, что пришло время уведомлять, советник сам вызывает Alert() (для всплывающего окна на экране) и, если включено, sendNotification() (для мобильного push‑уведомления), а затем немедленно устанавливает флаг оповещения об этом событии в значение true. Этот паттерн предотвращает дублирование без каких-либо внешних структур поиска. Небольшое предостережение: всегда обновляйте состояние вашего события сразу после вызова уведомления, чтобы гарантировать ровно одно оповещение на событие.

// Event storage
class CEvent : public CObject
{
public:
  datetime time;
  string   sym, name;
  int      imp;
  bool     alerted;

  CEvent(datetime t,const string &S,const string &N,int I)
  {
    time    = t;
    sym     = S;
    name    = N;
    imp     = I;
    alerted = false;
  }
};

Шаг 3: Логика отправки уведомлений

Отправка всех уведомлений происходит внутри функции CheckAndAlertEvents(), которая выполняется каждый тик таймера. Процедура сначала проверяет переключатель главного оповещения, вычисляет одну временную метку крайнего срока (сейчас + minutesBefore * 60), а затем по очереди выполняет перебор массивов с высокой, средней и низкой важностью. При обнаружении события, о котором еще не сообщено, которое укладывается в установленные сроки и соответствует выбранным пользователем уровням воздействия, советник создает краткое сообщение и запускает вызовы уведомлений. Централизация этой логики упрощает добавление альтернативных каналов, таких как электронная почта или SMS, путем расширения этой единственной функции, а не изменения нескольких частей советника.

//+------------------------------------------------------------------+
//| CheckAndAlertEvents: popups and optional push                    |
//+------------------------------------------------------------------+
void CheckAndAlertEvents()
{
  if(!InpEnableAlerts) return;
  datetime now = TimeTradeServer();
  datetime threshold = now + InpAlertMinutesBefore * 60;
  string msg;

  for(int i=0;i<ArraySize(highArr);i++)
  {
    CEvent *e=highArr[i];
    if(!e.alerted && e.time<=threshold && InpAlertHigh)
    {
      msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name;
      Alert(msg);
      if(InpEnablePush && InpPushHigh) SendNotification(msg);
      e.alerted = true;
    }
  }
  for(int i=0;i<ArraySize(medArr);i++)
  {
    CEvent *e=medArr[i];
    if(!e.alerted && e.time<=threshold && InpAlertMed)
    {
      msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name;
      Alert(msg);
      if(InpEnablePush && InpPushMed) SendNotification(msg);
      e.alerted = true;
    }
  }
  for(int i=0;i<ArraySize(lowArr);i++)
  {
    CEvent *e=lowArr[i];
    if(!e.alerted && e.time<=threshold && InpAlertLow)
    {
      msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name;
      Alert(msg);
      if(InpEnablePush && InpPushLow) SendNotification(msg);
      e.alerted = true;
    }
  }

 Шаг 4: OnTimer

Чтобы обеспечить плавную анимацию графика, советник запускает функцию CheckAndAlertEvents() в начале OnTimer(), перед любой выборкой данных или рисованием. Поскольку в MQL5 и Alert(), и sendNotification() не блокируются, последующие 20‑миллисекундные операции перерисовки и прокрутки выполняются непрерывно. Это полезная тактика: сначала запустите свои побочные процедуры в цикле, чтобы последующий рендеринг оставался плавным.

void OnTimer()
{
  CheckAndAlertEvents();   // fire alerts and pushes first
  ReloadEvents();
  FetchAlphaVantageNews();
  FetchAIInsights();
  DrawAll();
  // … remaining drawing and scrolling …
}

Под все это заложена модульная конструкция: конфигурация обработки входных данных, ReloadEvents и FetchAlphaVantageNews управляют извлечением данных, CheckAndAlertEvents заботится об уведомлениях, а DrawAll плюс её вспомогательные программы управляют отрисовкой графика. Такое четкое разделение задач позволяет заменить или усовершенствовать механизм уведомлений — добавить SMS, электронную почту, веб—хуки и т.д. - изменив только одну функцию, оставив остальные функции советника нетронутыми. Создание вашего советника таким слабо связанным, хорошо документированным способом значительно упрощает его поддержку, расширение и отладку с течением времени.


Тестирование

Чтобы протестировать новые возможности оповещения, мы загрузили обновленный советник «Заголовки новостей» на «живой» график и настроили ввод “за несколько минут до” для нацеливания на следующие запланированные события. Панель ввода позволяет точно указать, за сколько минут вы хотите получать каждое оповещение, гарантируя, что вы будете уведомлены в нужный момент. Ниже приведены скриншоты из моего практического тестирования: на одном показаны входные настройки советника, на другом ‑ всплывающее окно на экране, появляющееся за несколько минут до события, и финальное изображение соответствующего push‑уведомления, поступающего на мой мобильный терминал.

Configuring alerts News Headline EA

Настройка советника «Заголовки новостей»

Тестирование Push-уведомления

Всякий раз, когда MetaTrader 5 устанавливается на поддерживаемое мобильное устройство, ему присваивается уникальный идентификатор MetaQuotes ID (MQID). Этот идентификатор имеет решающее значение для обеспечения связи между платформой MQL5 и терминалом MetaTrader 5 на стационарном компьютере. Чтобы разрешить мобильному терминалу получать push-уведомления, необходимо добавить свой MQID в терминал на компьютере и включить push-уведомления.

Это можно сделать, открыв диалоговое окно Настройки (Options) либо через меню Сервис (Tools), либо с помощью сочетания клавиш Ctrl + O. В этих настройках найдите раздел для уведомлений, найдите свой MQID в мобильном приложении и введите его в список идентификаторов, которые вы хотите использовать для оповещений. Посмотрим на изображение ниже для справки. Эта настройка очень важна — без нее вы не сможете получать никаких уведомлений на свое мобильное устройство.

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

Setting PushNotifications

Настройка Push-уведомлений

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

Push notifications receve on Android Mobile MetaTrader 5 

Push-уведомления, полученные на мобильном приложении MetaTrade 5 на Android


Заключение

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

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

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

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


Основные уроки

УрокОписание
Централизованная конфигурацияГруппируем все настраиваемые пользователем параметры: переключатели, пороговые значения, ключи API в верхней части кода, чтобы настройки было легко находить, документировать и изменять, не вникая в логику.
Управляемая таймером архитектура:Используем миллисекундные таймеры (OnTimer) для выполнения периодических задач, таких как выборка данных, проверка оповещений и обновление холста, балансируя скорость отклика с нагрузкой на ЦП.
Двойная буферизация холстаПеред вызовом функции Update все операции рисования отображаем в виде растрового изображения за пределами экрана (холст), что предотвращает мерцание и обеспечивает плавную анимацию на графике.
Неблокирующие уведомленияВызываем функции Alert() и sendNotification() на ранней стадии цикла; поскольку они не являются блокирующими, они не приостанавливают перерисовку или обработку данных.
Объекты событий с отслеживанием состоянияУстанавливаем флажок “оповещено” непосредственно в каждом объекте event, чтобы отслеживать, какие события уже вызвали уведомления, устраняя дублирование оповещений без внешних преобразований.
Модульное разделение задачРазделяем свой советник на четкие разделы — настройка, вывод данных, логика оповещений и отрисовка — чтобы упростить обслуживание и будущие расширения.
Логика ограничения скоростиРеализуем простые проверки по времени (например, пороговые значения “за несколько минут до”), чтобы предотвратить чрезмерные или преждевременные оповещения и контролировать частоту вызовов внешнего API.
Интеграция WebRequestИспользуем WebRequest MQL5 для вызова внешних сервисов (новостных API, серверов ИИ), обработки заголовков, таймаутов и анализа ответов в своём советнике.
Методы синтаксического анализа JSONИзвлекаем только необходимые поля из возвращаемых строк JSON (например, заголовков или аналитического текста), используя операции StringFind и substring, сохраняя логику синтаксического анализа надежной, но простой.
Очистка и управление ресурсамиВсегда уничтожаем созданные объекты (Canvas, таймеры) и удаляем динамическую память в OnDeinit, чтобы предотвратить утечки памяти и сохранить стабильность платформы.


Содержимое вложения

Имя файлаВерсияОписание
News Headline EA.mq51.07Экономический календарь, новости Alpha Vantage, аналитические индикаторы на графике (RSI, Stoch, MACD, CCI), полоса комментариев с помощью ИИ, а также оповещения о событиях и дополнительные push‑уведомления.
download_model.py1.00Простой скрипт на Python, использующий клиент Hugging Face Hub для загрузки и кэширования квантованной модели GGUF, выводящей путь к ее локальному файлу.
serve_insights.py1.00Приложение FastAPI, которое загружает модель GGUF через llama‑cpp, предоставляя конечную точку  POST /insights, которая генерирует и возвращает аналитические данные искусственного интеллекта.

К содержанию

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

Прикрепленные файлы |
download_model.py (0.28 KB)
serve_insights.py (1.77 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
Jason Smith
Jason Smith | 11 июл. 2025 в 08:41
Очень хорошо. Спасибо
Упрощаем торговлю на новостях (Часть 6): Совершаем сделки (III) Упрощаем торговлю на новостях (Часть 6): Совершаем сделки (III)
В этой статье будет реализована сортировка новостей для отдельных новостных событий на основе их идентификаторов. Кроме того, предыдущие запросы SQL будут улучшены для предоставления дополнительной информации или сокращения времени выполнения запроса. Код, созданный в предыдущих статьях, станет работоспособным.
Управление рисками (Часть 3): Создание основного класса для управления рисками Управление рисками (Часть 3): Создание основного класса для управления рисками
В этой статье мы начнем создание основного класса управления рисками, который будет ключевым для контроля рисков в системе. Мы сосредоточимся на построении основ, определении основных структур, переменных и функций. Кроме того, мы внедрим необходимые методы для присвоения значений максимальной прибыли и убытков, тем самым заложив основу для управления рисками.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
От новичка до эксперта: Создание анимированного советника для новостей в MQL5 (IV) - Анализ рынка локально размещенными моделями с использованием ИИ От новичка до эксперта: Создание анимированного советника для новостей в MQL5 (IV) - Анализ рынка локально размещенными моделями с использованием ИИ
В сегодняшнем обсуждении мы рассмотрим, как самостоятельно размещать модели искусственного интеллекта с открытым исходным кодом и использовать их для получения информации о рынке. Это является частью наших постоянных усилий по расширению советника «Заголовки новостей» путем внедрения раздела «Анализ искусственного интеллекта» (AI Insights), который превращает советник в мультиинтеграционный вспомогательный инструмент. Обновленный советник предназначен для информирования трейдеров о событиях календаря, последних финансовых новостях, технических индикаторах, а теперь и о перспективах рынка, генерируемых искусственным интеллектом, тем самым, предлагая своевременную, разнообразную и интеллектуальную поддержку при принятии торговых решений. Присоединяйтесь к разговору, в ходе которого мы рассмотрим практические стратегии интеграции и то, как MQL5 может взаимодействовать с внешними ресурсами для создания мощного и интеллектуального торгового рабочего терминала.