
От новичка до эксперта: Создание анимированного советника для новостей в MQL5 (V) — Система напоминаний о событиях
Содержание:
Введение
Важные экономические новости могут спровоцировать резкие колебания цен, иногда принося большие выгоды, а иногда застигая трейдеров врасплох внезапными убытками. Наш советник «Заголовки новостей» уже предоставляет вам преимущество, отображая предстоящие события, информацию о технических индикаторах и комментарии, сгенерированные искусственным интеллектом, прямо на графике, так что вам не нужно переключаться между окнами. Но давайте посмотрим правде в глаза: никто не хочет весь день сидеть, приклеившись к экрану, в ожидании следующего выпуска данных.
Чтобы сделать этот рабочий процесс по-настоящему практичным, мы делаем следующий шаг, интегрируя интеллектуальную систему оповещения, которая будет заблаговременно уведомлять вас о каждом важном событии. Таким образом, вы можете оставаться сосредоточенным на своей стратегии, будучи уверенным, что не пропустите важные новости в тот момент, когда они наиболее важны.
Поскольку эта серия предназначена как для опытных разработчиков, так и для новичков в 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‑уведомления, поступающего на мой мобильный терминал.
Настройка советника «Заголовки новостей»
Тестирование Push-уведомления
Всякий раз, когда MetaTrader 5 устанавливается на поддерживаемое мобильное устройство, ему присваивается уникальный идентификатор MetaQuotes ID (MQID). Этот идентификатор имеет решающее значение для обеспечения связи между платформой MQL5 и терминалом MetaTrader 5 на стационарном компьютере. Чтобы разрешить мобильному терминалу получать push-уведомления, необходимо добавить свой MQID в терминал на компьютере и включить push-уведомления.
Это можно сделать, открыв диалоговое окно Настройки (Options) либо через меню Сервис (Tools), либо с помощью сочетания клавиш Ctrl + O. В этих настройках найдите раздел для уведомлений, найдите свой MQID в мобильном приложении и введите его в список идентификаторов, которые вы хотите использовать для оповещений. Посмотрим на изображение ниже для справки. Эта настройка очень важна — без нее вы не сможете получать никаких уведомлений на свое мобильное устройство.
В свою очередь, убедитесь, что на вашем мобильном устройстве уведомления для MetaTrader 5 разрешены и подумайте о том, чтобы настроить уникальный звуковой сигнал уведомления, который привлечет ваше внимание. Этот тип оповещений особенно ценен для трейдеров, поскольку люди обычно держат свои мобильные устройства под рукой, гарантируя, что они никогда не пропустят важный сигнал от советника «Заголовки новостей».
Настройка Push-уведомлений
На мой мобильный терминал MetaTrader 5 push-уведомления приходили, как и ожидалось. Ниже приведен отрывок из скриншота, показывающий эти оповещения, соответствующие приведенным выше примерам на графике.
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.mq5 | 1.07 | Экономический календарь, новости Alpha Vantage, аналитические индикаторы на графике (RSI, Stoch, MACD, CCI), полоса комментариев с помощью ИИ, а также оповещения о событиях и дополнительные push‑уведомления. |
download_model.py | 1.00 | Простой скрипт на Python, использующий клиент Hugging Face Hub для загрузки и кэширования квантованной модели GGUF, выводящей путь к ее локальному файлу. |
serve_insights.py | 1.00 | Приложение FastAPI, которое загружает модель GGUF через llama‑cpp, предоставляя конечную точку POST /insights, которая генерирует и возвращает аналитические данные искусственного интеллекта. |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/18750
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования