От новичка до эксперта: Создание анимированного советника для новостей в MQL5 (II)
Содержание:
- Введение
- Общие сведения
- Интеграция внешних новостных API
- Тестирование
- Заключение
- Основные уроки
- Содержимое вложения
Введение
В данном обсуждении мы опираемся на фундамент, заложенный в предыдущей статье, в которой создали горизонтальную полосу прокрутки на графике для отображения предстоящих новостных событий вместе с таймерами обратного отсчета, указывающими, сколько времени осталось до каждого выпуска в порядке важности. Мы завершили эту статью, создав заполнитель для новостной ленты в режиме реального времени, и теперь мы готовы воплотить эту функцию в жизнь.

Первая версия нового советника «Заголовки новостей» (без интеграции с API, только события экономического календаря на MQL5).
Сегодня мы сосредоточены на интеграции заголовков новостей из внешних источников API, чтобы решить проблему доступности новостей в платформе MetaTrader 5. Особое внимание мы уделим заголовкам — кратким заголовкам новостей, которые дают трейдерам краткое представление о том, что происходит в финансовом мире. Это позволяет им оставаться в курсе событий и решать, стоит ли углубляться в них с помощью веб-браузера или встроенной в терминал вкладки новостей.
Основные выводы из настоящей статьи:
- Изучить различные источники новостей финансового рынка
- Научиться пользоваться внешними новостными API
- Извлекать и анализировать новостные данные для удобства использования на MQL5
- Овладеть функцией WebRequest()
- Легко интегрировать внешние API-интерфейсы в инструменты на базе MQL5
Чтобы поддержать эту интеграцию, я приложил дополнительные усилия к изучению доступных новостных API. Для вашего удобства я составил список. Большинство из этих сервисов предлагают уровни бесплатного доступа с ограничениями на использование, которых по-прежнему достаточно для образовательных целей и тестирования. В таблице ниже приведены пять рекомендуемых источников новостей, хотя вы можете изучить гораздо больше.
| Провайдер | Ограничение по количеству | Специальные функции | Область данных |
|---|---|---|---|
| NewsAPI.org | 500 запросов в день | Фильтры поиска (ключевые слова, даты, издатели, языки), логические операторы, многоязычная поддержка (14 языков) | Глобальные общие новости (более 150 000+ источников в 55 странах) |
| Marketaux | 5 API Вызовов/запрос | Выделение объектов (акции/компании), оценка настроений для каждого объекта, анализ финансовых новостей с использованием искусственного интеллекта | Финансовые новости с показателями, характерными для конкретной компании |
| Alpha Vantage | 500 запросов в день, 5 запросов в минуту | более 60 экономических показателей (ВВП, инфляция), технические/фундаментальные данные, анализ настроений на рынке | Акции, форекс, криптовалюта, ETF |
| Finnhub | 60 вызовов в минуту | Потоковая трансляция веб-сайтов в режиме реального времени, экономический календарь, отчеты о доходах, анализ настроений с помощью искусственного интеллекта | Новости рынка, экономические показатели, корпоративная отчетность |
| EODHD | 20 вызовов в день (бесплатный тарифный план) | Ежедневные оценки настроений (от -1 до 1), более 50 тематических тегов (прибыль, IPO), полнотекстовые статьи с фильтрацией символов. | Акции, ETF, Форекс, новости о криптовалютах |
В этом проекте мы будем работать с Alpha Vantage, популярным и удобным API-сервисом, известным своими всеобъемлющими финансовыми данными и простыми методами доступа. Его хорошо документированные конечные точки и надежная бесплатная основа делают его отличным выбором для интеграции заголовков новостей в режиме реального времени в наш советник.
В следующем разделе мы опишем план нашего обсуждения, охватывающий ключевые этапы, такие как получение ключей API, выполнение веб-запросов, анализ ответов в формате JSON и отображение новостных данных на графике. Затем перейдем к практической реализации, чтобы воплотить эту функциональность в жизнь.
Общие сведения
Чтобы вам было легче следить за ходом обсуждения, давайте начнем с краткого пересмотра некоторых ключевых терминов, которые будем использовать на протяжении всего проекта:- API (программный интерфейс приложений): Набор правил, позволяющий одному программному приложению взаимодействовать с другим. В нашем случае это позволяет MetaTrader 5 извлекать данные из внешних источников, таких как Alpha Vantage.
- Документация API: Официальное руководство, предоставленное поставщиком API, в котором описываются доступные конечные точки, форматы запросов, параметры и структура ответов.
- Ключ API: Уникальный предоставляемый поставщиком API идентификатор, обеспечивающий доступ к их сервисам. Он помогает управлять использованием и обеспечивает безопасную связь.
- JSON (JavaScript Object Notation): Это облегченный формат обмена данными, который легко читать и записывать людям, а также легко парсить и генерировать машинам. JSON обычно используется для передачи данных между сервером и веб-сайтом или программным приложением, особенно в веб-API.
- Анализ: Процесс анализа структурированных данных (например, JSON) и извлечения из них полезной информации.
- WebRequest: Функция MQL5, используемая для отправки HTTP-запросов с терминала на внешние серверы.
- Интеграция: Процесс подключения и объединения данных API с нашим советником (EA) для бесперебойной работы на графике.
Поскольку наш базовый код — советник «Новостные заголовки» — уже готов, первым шагом является получение API-ключа от выбранного нами поставщика, Alpha Vantage. Чтобы получить свой API-ключ, посетите веб-сайт Alpha Vantage и зарегистрируйте бесплатную учетную запись. Вам будет предложено предоставить основную информацию, такую как ваше имя, адрес электронной почты и предполагаемое использование. После отправки формы ваш API-ключ будет отображен немедленно.
Следующий шаг включает в себя изучение документации по API, предоставленной Alpha Vantage. Это поможет нам понять формат запроса, доступные конечные точки новостей и структуру возвращаемых данных в формате JSON. Как только разберемся с этим, мы сможем разработать способ анализа данных и их интеграции в наш советник.
Структура кода в формате JSON из Alpha Vantage
Я уже получил свой API-ключ для этого проекта, а Vantage предлагает широкий спектр функций. Однако сейчас мы сосредоточимся именно на финансовых новостях.
Для просмотра ответа в формате JSON из API, можно воспользоваться этой ссылкой.
Перед реализацией логики для парсинга новостей от Alpha Vantage API, мы можем признать, что каждая новость в ответе в формате JSON содержит несколько полей, таких как "title", "summary", "url", а также "time_published". Однако на ранних этапах разработки этого советника мы отдаем предпочтение простоте и визуальной ясности, сосредоточившись только на извлечении поля "title". Заголовки - это лаконичные высокоуровневые дескрипторы, дающие представление о новостном контенте, что хорошо согласуется с целью советника обеспечить быструю прокрутку бегущей строки с минимальным количеством помех. Сосредоточившись только на "title", мы сокращаем затраты на анализ больших блоков текста и сохраняем четкое и компактное изображение на графике, что помогает трейдерам оставаться в курсе событий, не отвлекаясь. Ниже я поделился фрагментом кода в формате JSON, чтобы помочь вам понять структуру возвращаемых данных.
{
"items": "50",
"sentiment_score_definition": "x <= -0.35: Bearish; -0.35 < x <= -0.15: Somewhat-Bearish; -0.15 < x < 0.15: Neutral; 0.15 <= x < 0.35:
Somewhat_Bullish; x >= 0.35: Bullish",
"relevance_score_definition": "0 < x <= 1, with a higher score indicating higher relevance.",
"feed": [
{
"title": "How To Trade Tesla Today Using Technical Analysis - Tesla ( NASDAQ:TSLA ) ",
"url": "https://www.benzinga.com/markets/equities/25/06/45857951/how-to-trade-tesla-today-using-technical-analysis",
"time_published": "20250610T121929",
"authors": [
"RIPS"
],
"summary": "Good Morning Traders! In today's Market Clubhouse Morning Memo, we will discuss SPY, QQQ, AAPL, MSFT, NVDA, GOOGL, META, and TSLA.
Our proprietary formula, exclusive to Market Clubhouse, dictates these price levels. This dynamic equation takes into account price, volume, and options flow.",
"banner_image": "https://cdnwp-s3.benzinga.com/wp-content/uploads/2024/10/22181427/Paolo-and-Gali.jpg?optimize=medium&dpr=2&auto=webp&width=230",
"source": "Benzinga",
"category_within_source": "Trading",
"source_domain": "www.benzinga.com",
"topics": [
{
"topic": "Technology",
"relevance_score": "0.5"
},
{
"topic": "Financial Markets",
"relevance_score": "0.5855"
},
{
"topic": "Manufacturing",
"relevance_score": "0.5"
}
],
"overall_sentiment_score": 0.216021,
"overall_sentiment_label": "Somewhat-Bullish",
"ticker_sentiment": [
{
"ticker": "MSFT",
"relevance_score": "0.101012",
"ticker_sentiment_score": "0.303818",
"ticker_sentiment_label": "Somewhat-Bullish"
},
{
"ticker": "GOOG",
"relevance_score": "0.033751",
"ticker_sentiment_score": "0.075535",
"ticker_sentiment_label": "Neutral"
},
{
"ticker": "NVDA",
"relevance_score": "0.101012",
"ticker_sentiment_score": "0.346995",
"ticker_sentiment_label": "Somewhat-Bullish"
},
{
"ticker": "AAPL",
"relevance_score": "0.134402",
"ticker_sentiment_score": "0.077776",
"ticker_sentiment_label": "Neutral"
},
{
"ticker": "TSLA",
"relevance_score": "0.134402",
"ticker_sentiment_score": "0.111086",
"ticker_sentiment_label": "Neutral"
}
]
},Планируемый советник будет получать заголовки новостей один раз в торговый день и прокручивать их в виде непрерывной бегущей строки с помощью объекта canvas. Поле "title" будет проанализировано и обрезано из необработанной строки в формате JSON. Это позволит избежать необходимости полной десериализации JSON, что неэффективно на языке MQL5. Это позволяет советнику легко и надежно обрабатывать обновления в режиме реального времени. Поскольку эти заголовки по своей природе короткие и привлекательные, они идеально подходят для быстрого сканирования. В конечном счете, дополнительные поля, такие как "summary" или "url", могут быть проанализированы для получения подробного просмотра или всплывающих подсказок, но использование поля "title" на данном этапе обеспечивает быстрое решение с низкой задержкой, которое непосредственно вписывается в существующую визуальную структуру и структуру эффективности.
В следующих разделах мы расскажем вам о каждом из этих шагов — доступе к API, обработке данных и отображении их на графике MetaTrader 5 с помощью советника «Заголовки новостей».
Интеграция внешних новостных API с советником «Заголовки новостей»
Цель состоит в том, чтобы динамически извлекать релевантные финансовые заголовки и отображать их на графике в плавном режиме реального времени. Это значительно повышает ценность советника, обеспечивая информированность трейдеров о последних влияющих на настроения заголовках, непосредственно на графиках, не переключая платформы. В этом пошаговом руководстве мы подробно объясним, как работает каждая часть реализации, что она делает и почему мы структурируем ее таким образом.
Шаг 1: Добавление поля ввода ключа API для настройки пользователя
input string InpAlphaVantageKey = ""; // your Alpha Vantage API key
Здесь мы определяем настраиваемый пользователем входной параметр с именем InpAlphaVantageKey. Это позволяет пользователям вставлять свой персональный API-ключ Alpha Vantage непосредственно в панель настроек советника. Без действительного ключа никакие новостные данные не могут быть получены. Alpha Vantage выдает бесплатные API-ключи с ограничениями на использование (обычно 500 запросов в день), поэтому это поле предоставляет пользователям контроль над аутентификацией без жесткого кодирования учетных данных. Мы спроектировали остальную часть системы таким образом, чтобы корректно пропускать выборку новостей, когда это значение пусто, обеспечивая стабильность, даже если пользователи забывают ввести ключ.
Шаг 2: Объявление переменных состояния для хранения заголовков и логики управления
string newsHeadlines[]; // holds the extracted headline titles int totalNews = 0; // keeps track of how many headlines we’ve stored datetime lastNewsReload = 0; // helps ensure we fetch news only once per day
Эти переменные составляют ядро нашей системы управления новостями.
- newsHeadlines[] это динамический массив строк, который будет содержать заголовки новостей, проанализированные из ответа API. Каждая строка представляет собой один заголовок новостей.
- totalNews это целочисленный счетчик, записывающий, сколько заголовков мы сохранили — это важно для отображения корректного количества заголовков на графике.
- lastNewsReloadиспользуется для обеспечения соблюдения политики ежедневного обновления. Alpha Vantage может наказывать за чрезмерное использование, поэтому эта переменная гарантирует, что мы будем получать заголовки только один раз в день, если мы явно не изменим эту логику. Это также позволяет избежать избыточных сетевых запросов в течение одной и той же торговой сессии.
Шаг 3: Получение новостных данных от Alpha Vantage с помощью WebRequest
void FetchAlphaVantageNews() { if(StringLen(InpAlphaVantageKey) == 0) return;
Мы начинаем с проверки того, был ли ключ API введен пользователем. Если поле пустое, функция немедленно завершает работу. Эта проверка предотвращает ненужную сетевую активность и гарантирует, что система будет работать стабильно и бесшумно до тех пор, пока она не будет должным образом настроена. Это также позволяет избежать возврата неверных результатов или возникновения ошибок ограничения скорости на сервере API из-за неправильно сформированных запросов.
Здесь мы строим нормализованное значение datetime для начала текущего торгового дня (полночь по серверному времени). Это используется для сравнения с lastNewsReload , чтобы мы знали, были ли уже получены заголовки на сегодня. Используя этот метод вместо необработанных временных меток, мы гарантируем, что новости будут появляться только один раз в день, независимо от того, как часто ставит тики советник. Такой подход делает наше использование API эффективным и предсказуемым.
MqlDateTime tm; TimeToStruct(TimeTradeServer(), tm); tm.hour = tm.min = tm.sec = 0; datetime today = StructToTime(tm); if(lastNewsReload == today) return; lastNewsReload = today;
Мы динамически создаем URL-адрес запроса API, добавляя ключ API пользователя к базовой конечной точке. Этот URL-адрес это то, что мы передадим в WebRequest. Функция NEWS_SENTIMENT предназначена для возврата метаданных в формате JSON и заголовков, содержащих настроения рынка, из нескольких авторитетных источников новостей. Создавая эту строку во время выполнения, мы делаем наш советник модульным и независимым от API-ключей.
string url = "https://www.alphavantage.co/query?function=NEWS_SENTIMENT&apikey=" + InpAlphaVantageKey;
В этом разделе инициализируются параметры, необходимые для функции WebRequest:
char post[]; char response_data[]; string headers; int timeout = 5000; ResetLastError();
- post[] остается пустым, так как мы отправляем запрос GET, а не отправляем основное содержимое.
- response_data[] - это место, где будет сохранен необработанный байтовый ответ от сервера.
- headers оставлен в виде пустой строки, поскольку API Alpha Vantage не требует пользовательских HTTP-заголовков для этой конечной точки.
- timeout установлен на 5000 миллисекунд, чтобы мы не зависали слишком долго на медленных соединениях.
- Функция ResetLastError() удаляет все предыдущие коды ошибок, чтобы гарантировать, что любая ошибка, которую мы обнаружим в следующий раз, действительно связана с этим запросом, а не с чем-то другим.
int result = WebRequest("GET", url, headers, timeout, post, response_data, headers); if(result != 200) { Print("WebRequest failed with result: ", result, ", error: ", GetLastError()); return; }
Этот блок выполняет фактический HTTP-запрос. WebRequest возвращает код состояния HTTP (например, 200 для успешного выполнения, 403 для запрещенного и т.д.). Если результат не равен 200, это означает, что запрос не выполнен или был заблокирован, поэтому мы выводим диагностическое сообщение с кодом ошибки и завершаем работу досрочно. Это помогает нам диагностировать проблемы с подключением или аутентификацией без сбоев в работе советника или повреждения данных.
Непосредственно после подтверждения, что запрос выполнен успешно, мы преобразуем массив байтов response_data[] в удобочитаемую строку (resultStr). Теперь эта строка содержит полный ответ в формате JSON от Alpha Vantage. Прежде чем начинать извлекать заголовки, мы очистим массив newsHeadlines[], чтобы удалить все старые данные и освободить место для заголовков нового дня.
string resultStr = CharArrayToString(response_data, 0, WHOLE_ARRAY); ArrayResize(newsHeadlines, 0);
Мы настраиваем нашу логику синтаксического анализа. Переменная pos - это наш сканирующий указатель в строке JSON. Массив keys[] содержит два распространенных варианта ключа, который предшествует каждому заголовку в ответе JSON. Мы включаем как разделенные, так и не разделенные версии, чтобы обеспечить устойчивость к любым незначительным изменениям форматирования в ответе API.
int pos = 0; const string keys[2] = { "\"title\": \"", "\"title\":\"" };
Этот цикл просматривает строку JSON, чтобы найти и извлечь заголовок каждой новости.
while(true) { int start = -1; for(int k=0;k<ArraySize(keys);k++) { start = StringFind(resultStr, keys[k], pos); if(start >= 0) { start += StringLen(keys[k]); break; } } if(start < 0) break; int end = StringFind(resultStr, "\"", start); if(end < 0) break; string title = StringSubstr(resultStr, start, end - start); title = Trim(title);
Мы:
- Ищем следующий ключ "title",
- Устанавливаем начало в соответствии с началом фактического текстового содержимого,
- Ищем конец заключенной в кавычки строки заголовка,
- Извлекаем и очищаем заголовок с помощью функции Trim(), чтобы удалить все окружающие его пробелы.
Этот простой подход сопоставления паттернов позволяет избежать необходимости в полноценном синтаксическом анализаторе JSON и достаточно эффективен для нашего ограниченного и специфического случая использования.
Каждый раз, когда мы находим заголовок, мы динамически расширяем массив newsHeadlines[] и добавляем новый заголовок. Как только все заголовки будут обработаны, мы обновим totalNews, чтобы отразить, сколько записей мы собрали. Это дает нам четкое представление о том, с чем мы будем работать позже при составлении заголовков.
int idx = ArraySize(newsHeadlines); ArrayResize(newsHeadlines, idx + 1); newsHeadlines[idx] = title; } totalNews = ArraySize(newsHeadlines);
Шаг 4: Рисование бегущей строки новостей на графике
Здесь мы создаем визуальную бегущую строку, объединяя все выбранные заголовки в одну строку прокрутки.
- Для улучшения читаемости добавляем разделитель "|" между записями.
- Если заголовки недоступны, мы показываем сообщение-заполнитель, чтобы сохранить бегущую строку активной.
- Функция TextOut() отображает эту строку на холсте с определенным смещением offNews, чтобы создать эффект прокрутки.
- Строка offNews -= InpNewsSpeed; приводит к тому, что текст со временем смещается влево, создавая непрерывное движение. Как только он скроется из поля зрения, мы сбросим его в основном цикле рисования.
string ticker = ""; for(int i=0;i<totalNews;i++) { ticker += newsHeadlines[i]; if(i < totalNews - 1) ticker += " | "; } if(totalNews == 0) ticker = placeholder; newsCanvas.TextOut(offNews, yOff, ticker, XRGB(255,255,255), ALIGN_LEFT); offNews -= InpNewsSpeed;
Шаг 5: Планирование выборки новостей (News Fetch) с помощью Timer
Помещаем наш вызов FetchAlphaVantageNews() внутрь функции OnTimer(), чтобы убедиться, что она периодически запускается. Внутренняя логика даты гарантирует, что мы обращаемся к API только один раз в день. Такой дизайн дает советнику возможность обновляться самостоятельно, не требуя перезагрузки графика или действий пользователя. Здесь также вызывается функция DrawAll(), которая обновляет холст при каждом тике таймера, обеспечивая плавную прокрутку бегущей строки по экрану.
void OnTimer() { //...for the other code FetchAlphaVantageNews(); // only updates once daily //...for the rest of the code DrawAll(); // redraws canvas each timer tick }
Шаг 6: Очистка при удалении советника
Мы включаем процедуру очистки в функцию OnDeinit(), чтобы очистить массив newsHeadlines. Это помогает гарантировать, что после выгрузки советника память не будет занята, что является хорошей практикой для предотвращения утечки ресурсов и обеспечения чистого перезапуска при следующей загрузке советника.
void OnDeinit(const int reason) { //...our preivous code here ArrayResize(newsHeadlines,0); // clear stored headlines }
Теперь, когда все готово, у нас есть обновленная версия советника «Заголовки новостей», который успешно интегрирует внешний API (Alpha Vantage) и использует встроенный экономический календарь на MQL5. В совокупности эти функции обеспечивают возможность отображать новости и экономические события непосредственно на графике в режиме реального времени, предлагая трейдерам беспрепятственный и немедленный доступ к важной информации, не покидая платформу.
В конце этой статьи я приложу полный исходный код, включающий в себя все, что мы обсуждали до сих пор. Следующим шагом будет тщательное тестирование этих новых функций, чтобы убедиться, что концепция работает должным образом. Основываясь на наших наблюдениях, мы дадим окончательную оценку и расскажем о том, что будет дальше, в будущих обновлениях.
Тестирование
В терминале MetaTrader 5 убедитесь, что доступ через WebRequest включен, а URL-адрес сервера Alpha Vantage добавлен в список разрешенных URL-адресов. Доступ к этим настройкам можно получить, перейдя в меню Tools > Options > Expert Advisors или нажав Ctrl + O на клавиатуре. Посмотрите изображение ниже.

Разрешить WebRequest и добавить ссылку Alpha Vantage
Вы можете получить доступ к скомпилированному файлу советника из раздела “Expert Advisors” в окне «Навигатор» (сочетание клавиш: Ctrl + N). Чтобы загрузить его на график, просто щелкните правой кнопкой мыши на советнике и выберите “Прикрепить к графику” (“Attach to Chart”) или перетащите его непосредственно на нужный график. Краткое наглядное руководство приведено на изображении ниже.

Доступ к советнику «Заголовки новостей»
Благодаря недавней интеграции наши настройки ввода были расширены и включают в себя новые функции — в первую очередь, возможность получать заголовки новостей в режиме реального времени через внешний API. Для активации функции прокрутки новостей на графике, необходимо получить API-ключ от Alpha Vantage и ввести его в соответствующее поле ввода. На изображении ниже видно, как теперь выглядит интерфейс настроек ввода. Если ключ API не указан, советник будет отображать текст-заполнитель в разделе новостей вместо заголовков в режиме реального времени.

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

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

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

Настройка высокоскоростной прокрутки новостей и событий календаря
Заключение
Я искренне рад успешной реализации класса CCanvas, который эффективно решает очевидную проблему, с которой мы столкнулись. Нам удалось разработать альтернативный метод доступа к новостям и экономическим событиям непосредственно на графике. Хотя MetaTrader 5 действительно предоставляет доступ к этим обновлениям, их видимость и доступность во время активной торговли могут быть затруднительными. Оптимизировав отображение с помощью прокрутки заголовков, мы представили более удобное в использовании и визуально интегрированное решение.
Конечно, в текущей версии есть некоторые ограничения. Основные новости ограничены краткими заголовками, в отличие от нативной версии терминала, где можно нажать и прочитать полные статьи. Тем не менее, наше решение отлично справляется с событиями экономического календаря, позволяя трейдерам оставаться в курсе событий во время работы. Преимущество заголовков заключается в том, что вы можете быть в курсе актуальных тем, которые затем можно изучать за пределами терминала. Обычно вы читаете только те заголовки, которые вызывают интерес, поэтому их прокрутка по графику гарантирует, что вы не пропустите важные мировые финансовые новости, и все это без прерывания вашего обычного торгового процесса.
Одним из неоспоримых преимуществ является то, что вся эта информация ненавязчиво отображается непосредственно на графике, что позволяет принимать обоснованные торговые решения без ущерба для четкости графика.
Забегая вперед, можно отметить, что потенциальные улучшения могут включать в себя метки даты для каждого заголовка, динамическое изменение размера для адаптации к различным масштабам графика и систему оповещений, которая уведомляет трейдеров перед запланированными событиями. Я с нетерпением жду начала третьего этапа этого проекта, на котором мы планируем внедрить еще одну информационную полосу, адаптированную к потребностям трейдеров.
В конечном счете, одна из более широких целей этого проекта — сделать программирование на MQL5 более доступным, особенно для начинающих. Чтобы это закрепить, я намерен завершать каждый этап разработки кратким изложением ключевых используемых концепций программирования и собираюсь продолжить эту практику в будущих главах серии.
Основные уроки
Ниже приведена сводная таблица ключевых концепций программирования, продемонстрированных в ходе настоящего обсуждения. | Концепция | Подробности |
|---|---|
| Объектно-ориентированное проектирование | Инкапсуляция событий календаря в специальный класс со свойствами касательно времени, символа, названия и важности, улучшающая модульность и удобочитаемость |
| Динамическая память и массивы | Использование массивов с возможностью изменения размера и динамического распределения для управления различным количеством объектов event в отдельных коллекциях высокой, средней и низкой важности. |
| Управляемая событиями архитектура | Функции жизненного цикла для инициализации, своевременных обновлений и очистки, которые определяют поведение советника при запуске, при каждом тике таймера и при выключении |
| Интеграция API | Подключение к внешнему новостному сервису с помощью HTTP-запросов, обработка ответов и ошибок, а также извлечение текста заголовков из возвращаемых данных |
| Графическое программирование | Отрисовка текста и фигур на прозрачном оверлее с использованием объекта canvas для создания плавных полос прокрутки для событий и заголовков |
| Логика времени и даты | Преобразование времени сервера в границы дат для загрузки только сегодняшних будущих событий и обеспечения того, чтобы новости поступали один раз в день. |
| Модульное функциональное проектирование | Разделение задач на специализированные вспомогательные функции для позиционирования, загрузки данных, рисования полос и обрезки текста для обеспечения упорядоченности и удобства обслуживания кода. |
| Очистка ресурсов | Корректное уничтожение визуальных объектов и удаление динамически создаваемых объектов событий для предотвращения утечки памяти при удалении советника |
| Обработка пользовательского ввода | Отображение параметров скорости прокрутки, переключений дисплея, частоты таймера, настроек смещения, а также ввода ключа API для возможности настройки пользователем. |
| Эффективные методы перерисовки | Сведение к минимуму работы по перерисовке за счет удаления и обновления только необходимых частей холста и адаптации к изменениям размера диаграммы |
| Экономический календарь MQL5 | Получение календарных событий, фильтрация по дате, классификация по важности и сортировка по времени для отображения приоритетного списка предстоящих событий. |
Для справки, вот изображение, иллюстрирующее значение трех цветных прямоугольников, используемых для обозначения приоритета новостей. Основным индикатором служит цвет, хотя можно также использовать и фигуры, такие как круги.

Метки важности событий
Содержимое вложения
Найдите прикрепленный ниже исходный код советника, скомпилируйте его, протестируйте, а затем поделитесь своими отзывами и идеями по развитию в комментариях. Следите за нашей следующей статьей! | Имя файла | Версия | Описание |
|---|---|---|
| News Headline EA.mq5 | 1.03 | Советник, отображающий события экономического календаря и заголовки новостей рынка в режиме реального времени непосредственно на графике с помощью встроенных API - MQL5 Canvas и Alpha Vantage |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/18465
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Торговый робот на языковой GPT-модели
Передовые методы управления и оптимизации памяти в MQL5
От новичка до эксперта: Создание анимированного советника для новостей в MQL5 (III) — Анализ индикаторов
Нейросети в трейдинге: Модель адаптивной графовой диффузии (Окончание)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования