English Deutsch 日本語
preview
Разработка инструментария для анализа движения цен (Часть 4): Советник Analytics Forecaster

Разработка инструментария для анализа движения цен (Часть 4): Советник Analytics Forecaster

MetaTrader 5Интеграция |
148 0
Christian Benjamin
Christian Benjamin

Содержание


Введение

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

В этой статье мы сосредоточимся на интеграции нашей трансляции с Telegram для обеспечения более широкого доступа к анализируемой информации. Я выбрал Telegram для этой цели из-за его популярности и доступного интерфейса среди трейдеров. Интеграция обновлений графиков MetaTrader 5 с Telegram дает активным трейдерам значительные преимущества. Такая настройка обеспечивает немедленный доступ к важной рыночной информации, повышает удобство использования и улучшает коммуникацию. Следовательно, вы сможете разрабатывать более эффективные стратегии и оперативно реагировать на быстро меняющийся рынок. Благодаря такой интеграции вы сможете повысить свои шансы на успех и принимать более обоснованные и своевременные решения.


Обзор предыдущей статьи

Давайте вспомним наш предыдущий инструмент - советник Analytics Master. Мы интегрируем ту же аналитическую информацию из этого инструмента в Telegram. Подробности о нем можно узнать здесь - https://www.mql5.com/ru/articles/16434. Советник Analytics Master был разработан для анализа и расчета следующих ключевых показателей рынка:

  • Открытие и закрытие предыдущего дня
  • Объем предыдущего дня
  • Объем текущего дня
  • Максимум и минимум предыдущего дня
  • Ключевые уровни поддержки и сопротивления
  • Баланс счета
  • Эквити
  • Рыночный спред
  • Минимальный и максимальный размер лота
  • Рыночная волатильность

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

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

Результаты работы Analytics Master

Рис 1. Результат анализа

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


Обзор проекта

Telegram — сервис обмена сообщениями, позволяющий трейдерам получать мгновенные уведомления, оповещения и аналитику о своей торговой деятельности непосредственно в чате Telegram. Интеграция с MetaTrader 5 включает использование API Telegram Bot, обеспечивая автоматическую связь между торговым алгоритмом или советником (EA), работающим на MetaTrader 5, и чатом Telegram. Структура показана на диаграмме ниже.


Рис 2. Путь интеграции

Ключевые компоненты интеграции

  • Telegram-бот: Создайте бота Telegram с помощью BotFather в Telegram, который предоставляет токен доступа, необходимый для аутентификации запросов, отправляемых в API Telegram.
  • Идентификатор чата: Определите идентификатор чата, куда следует отправлять сообщения. Это может быть персональный чат или групповой чат, который используется для указания, куда будут отправляться оповещения.
  • MetaTrader 5: Используйте язык программирования MQL5 для разработки или модификации советников или скриптов, которые могут подключаться к API Telegram. Обычно это подразумевает использование HTTP-запросов POST для отправки сообщений.


Создание бота Telegram и получение идентификаторов графиков 

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

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

Шаг 1: Откройте Telegram

Убедитесь, что на вашем устройстве установлено приложение Telegram.

Шаг 2: Найдите BotFather

Шаг 2

Рис. 3. Botfather

В строке поиска приложения введите BotFather.

BotFather — официальный бот Telegram, который позволяет создавать и управлять другими ботами.

Шаг 3: Начните чат с BotFather

Шаг 3/4

Рис 4. Шаги 3 и 4

Нажмите на результат поиска BotFather, чтобы открыть чат.

Нажмите кнопку Start или введите /start, чтобы начать разговор.

Шаг 4: Создайте нового бота

Введите команду /newbot и отправьте ее.

BotFather предложит вам выбрать имя для вашего бота. Это имя, которое будут видеть пользователи.

После ввода имени вам будет предложено указать имя пользователя для вашего бота. Имя пользователя должно заканчиваться на "bot" (например, MyCoolBot).

Шаг 5: Получите токен бота

Шаг 4/5

Рис. 5. Шаг 5

После выполнения предыдущих шагов BotFather создаст вашего бота и предоставит вам уникальный токен API. Этот токен необходим для взаимодействия с API Telegram Bot, поэтому сохраните его в надежном месте.

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

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

Метод 1: Использование ботов Get ID

Всё просто. Вы можете находить и запускать таких ботов, как @get_id_bot или @userinfobot. После того, как вы запустите бота, нажав кнопку «Пуск» или введя команду /start, он ответит вам идентификатором чата, который вы затем можете записать.

Бот Get Id

Рис. 6. Get ID

Метод 2: С помощью веб-браузера

Начните с отправки любого сообщения вашему боту в Telegram. Затем откройте веб-браузер и введите следующий URL-адрес, заменив <YourBotToken> реальным токеном вашего бота: 

https://api.telegram.org/bot<YourBotToken>/getUpdates

После нажатия Enter проверьте ответ, возвращенный API. Ваш идентификатор будет указан в разделе result.


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

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

Код Analytics Master был улучшен за счет включения команд, которые позволяют ему передавать проанализированные показатели в приложение Telegram. Я предоставлю вам полный интегрированный код MQL5 и проведу вас шаг за шагом через процесс интеграции.

Код Analytics Forecaster

//+-------------------------------------------------------------------+
//|                                        Analytics Forecaster EA.mq5|
//|                                 Copyright 2024, Christian Benjamin|
//|                                               https://www.mql5.com|
//+-------------------------------------------------------------------+
#property copyright   "2024, MetaQuotes Software Corp."
#property link        "https://www.mql5.com/en/users/lynnchris"
#property description "EA for market analysis,commenting and Telegram Integeration"
#property version     "1.1"
#property strict

// Inputs for risk management
input double RiskPercentage = 1.0;        // Percentage of account balance to risk per trade
input double StopLossMultiplier = 1.0;    // Multiplier for determining the stop loss distance
input int ATR_Period = 14;                // Period for ATR calculation

// Telegram configuration
input string TelegramToken = "YOUR BOT TOKEN"; // Your Telegram bot token
input string ChatID = "YOUR CHART ID"; // Your chat ID
input bool SendTelegramAlerts = true; // Option to enable/disable Telegram notifications

// Global variables for storing values
datetime lastUpdateTime = 0;
double previousDayOpen, previousDayClose, previousDayHigh, previousDayLow;
double previousDayVolume;
double currentDayVolume;
double support, resistance;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   lastUpdateTime = 0; // Set the initial update time
   return INIT_SUCCEEDED;
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0); // Clean up any drawn objects on the current chart
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   UpdateMetrics(); // Call to the function that fetches and displays the metrics
  }

//+------------------------------------------------------------------+
//| Update metrics and display them                                  |
//+------------------------------------------------------------------+
void UpdateMetrics()
  {
// Check if 2 hours have passed since the last update
   if(TimeCurrent() - lastUpdateTime >= 2 * 3600)
     {
      // Fetch previous day's data
      datetime prevDay = iTime(NULL, PERIOD_D1, 1);
      previousDayOpen = iOpen(NULL, PERIOD_D1, 1);
      previousDayClose = iClose(NULL, PERIOD_D1, 1);
      previousDayHigh = iHigh(NULL, PERIOD_D1, 1);
      previousDayLow = iLow(NULL, PERIOD_D1, 1);
      previousDayVolume = iVolume(NULL, PERIOD_D1, 1);

      // Fetch current day's volume
      currentDayVolume = iVolume(NULL, PERIOD_D1, 0); // Volume for today

      // Calculate support and resistance
      support = previousDayLow - (previousDayHigh - previousDayLow) * 0.382; // Fibonacci level
      resistance = previousDayHigh + (previousDayHigh - previousDayLow) * 0.382; // Fibonacci level

      // Determine market direction
      string marketDirection = AnalyzeMarketDirection(previousDayOpen, previousDayClose, previousDayHigh, previousDayLow);

      // Calculate possible lot size based on risk management
      double lotSize = CalculateLotSize(support, resistance);

      // Retrieve account metrics
      double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
      double accountEquity = AccountInfoDouble(ACCOUNT_EQUITY);

      // Calculate market spread manually
      double marketBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
      double marketAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      double marketSpread = marketAsk - marketBid; // Calculate spread

      double minLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
      double maxLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);

      // Calculate market volatility using ATR
      int atrHandle = iATR(NULL, PERIOD_H1, ATR_Period); // Get the ATR handle
      double atrValue = 0.0;

      if(atrHandle != INVALID_HANDLE)   // Check if the handle is valid
        {
         double atrBuffer[]; // Array to hold the ATR values
         if(CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0)   // Copy the latest ATR value
           {
            atrValue = atrBuffer[0]; // Retrieve the ATR value from the buffer
           }
         IndicatorRelease(atrHandle); // Release the indicator handle
        }

      // Create the output string, including pair name and last update time
      string pairName = Symbol(); // Get the current symbol name
      string lastUpdateStr = TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES);
      string infoStr = StringFormat("Pair: %s\nPrev Day Open: %.2f\nPrev Day Close: %.2f\nPrev Day High: %.2f\nPrev Day Low: %.2f\n"
                                    "Prev Day Volume: %.0f\nCurrent Day Volume: %.0f\nMarket Direction: %s\n"
                                    "Support: %.2f\nResistance: %.2f\nAccount Balance: %.2f\nAccount Equity: %.2f\n"
                                    "Market Spread: %.2f\nMin Lot Size: %.2f, Max Lot Size: %.2f\n"
                                    "Market Volatility (ATR): %.2f\nLast Update Time: %s\nPossible Lot Size: %.2f",
                                    pairName, previousDayOpen, previousDayClose, previousDayHigh, previousDayLow,
                                    previousDayVolume, currentDayVolume, marketDirection,
                                    support, resistance, accountBalance, accountEquity, marketSpread,
                                    minLotSize, maxLotSize, atrValue, lastUpdateStr, lotSize);

      // Log the information
      Print(infoStr);

      // Display information on the chart
      Comment(infoStr);

      // Send Telegram notification
      if(SendTelegramAlerts)
         SendTelegramMessage(infoStr);

      // Remove old trend lines and create new ones for previous day's high/low
      ObjectsDeleteAll(0);

      // Draw continuous trend lines
      DrawContinuousTrendLine("PrevDayHigh", previousDayHigh);
      DrawContinuousTrendLine("PrevDayLow", previousDayLow);

      // Update last update time
      lastUpdateTime = TimeCurrent();
     }
  }

//+------------------------------------------------------------------+
//| Analyze market direction                                         |
//+------------------------------------------------------------------+
string AnalyzeMarketDirection(double open, double close, double high, double low)
  {
   string direction;

   if(close > open)
     {
      direction = "Bullish";
     }
   else
      if(close < open)
        {
         direction = "Bearish";
        }
      else
        {
         direction = "Neutral";
        }

// Include current trends or patterns based on high and low for further analysis
   if(high > open && high > close)
     {
      direction += " with bullish pressure"; // Example addition for context
     }
   else
      if(low < open && low < close)
        {
         direction += " with bearish pressure"; // Example addition for context
        }

   return direction;
  }

//+------------------------------------------------------------------+
//| Draw a continuous trend line to the left on the chart            |
//+------------------------------------------------------------------+
void DrawContinuousTrendLine(string name, double price)
  {
   datetime startTime = TimeCurrent() - 720 * 3600; // Extend 24 hours into the past
   ObjectCreate(0, name, OBJ_TREND, 0, startTime, price, TimeCurrent(), price);
   ObjectSetInteger(0, name, OBJPROP_COLOR, (StringFind(name, "High") >= 0) ? clrRed : clrBlue);
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 2); // Set thickness of the line
   ObjectSetInteger(0, name, OBJPROP_XSIZE, 0); // Set this property to extend the line infinitely to the left
  }

//+------------------------------------------------------------------+
//| Calculate the lot size based on risk management                  |
//+------------------------------------------------------------------+
double CalculateLotSize(double support, double resistance)
  {
   double stopLossDistance = MathAbs((support - resistance) * StopLossMultiplier);
   double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * (RiskPercentage / 100.0);

// Get the tick size for the current symbol
   double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);

// Calculate the lot size based on the stop loss and tick size
   double lotSize = riskAmount / (stopLossDistance / tickSize); // Adjusted for the correct pip size
   lotSize = NormalizeDouble(lotSize, 2); // Normalize the lot size to two decimal places

// Ensure lot size is above minimum lot size allowed by broker
   double minLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   if(lotSize < minLotSize)
      lotSize = minLotSize;

   return lotSize;
  }

//+------------------------------------------------------------------+
//| Send message to Telegram API                                     |
//+------------------------------------------------------------------+
void SendTelegramMessage(string message)
  {
   string url = StringFormat("https://api.telegram.org/bot%s/sendMessage", TelegramToken);
   string headers = "Content-Type: application/json\r\n"; // Content type for JSON
   int timeout = 1000; // Timeout in milliseconds

// Format the data as JSON
   string postData = StringFormat("{\"chat_id\":\"%s\",\"text\":\"%s\"}", ChatID, message);

// Convert the string to a char array
   char dataArray[];
   StringToCharArray(postData, dataArray);

// Prepare the result buffer and response headers
   char result[];
   string responseHeaders;

// Perform the web request
   int responseCode = WebRequest("POST", url, headers, timeout, dataArray, result, responseHeaders);
   if(responseCode == 200)   // HTTP 200 OK
     {
      Print("Message sent successfully!");
     }
   else
     {
      PrintFormat("Error sending message. HTTP Response Code: %d. Error: %s", responseCode, GetLastError());
     }
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

1. Объявляем входные переменные:

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

input string TelegramToken = "YOUR_BOT_API_TOKEN"; // Replace with your actual bot token
input string ChatID = "YOUR_CHAT_ID"; // Replace with your actual chat ID
input bool SendTelegramAlerts = true; // Control whether alerts are sent

 Не забудьте заменить YOUR_BOT_API_TOKEN и YOUR_CHAT_ID фактическими значениями.

2. Создаем функцию отправки сообщений:

Функция SendTelegramMessage эффективно создает структурированный HTTP-запрос POST к API Telegram, отправляя уведомление в указанный чат. Подготавливая URL-адрес API, устанавливая заголовки, форматируя данные сообщения как JSON, выполняя запрос и обрабатывая ответ, эта функция позволяет советнику мгновенно отправлять обновления пользователям через Telegram. Эта оптимизированная логика обеспечивает быструю передачу сделок и оповещений, а также повышает общую функциональность советника как торгового помощника, легко информируя пользователя.

  • Цель функции: Управление взаимодействием с API Telegram. Функция инкапсулирует логику, необходимую для отправки сообщения нашему Telegram-боту. Создавая повторно используемые функции, мы обеспечиваем ясность кода и сокращаем дублирование.
  • Обработка ошибок. Каждый раз, когда мы отправляем сообщение, мы должны регистрировать не только успешные отправки, но и любые возникающие ошибки. Такая практика способствует отладке и обеспечивает обратную связь.
void SendTelegramMessage(string message)
{
    string url = StringFormat("https://api.telegram.org/bot%s/sendMessage", TelegramToken);
    string headers = "Content-Type: application/json\r\n";
    int timeout = 1000;

    string postData = StringFormat("{\"chat_id\":\"%s\",\"text\":\"%s\"}", ChatID, message);

    char dataArray[];
    StringToCharArray(postData, dataArray);

    char result[];
    string responseHeaders;

    int responseCode = WebRequest("POST", url, headers, timeout, dataArray, result, responseHeaders);
    if (responseCode == 200)
    {
        Print("Message sent successfully! Response: ", CharArrayToString(result));
    }
    else
    {
        PrintFormat("Error sending message. HTTP Response Code: %d. Error: %s", responseCode, GetLastError());
    }
}

  • Разбор WebRequest: Функция WebRequest имеет решающее значение, поскольку она позволяет нашему советнику отправлять HTTP-запросы к API. Для корректной работы убедитесь, что в свойствах советника включена опция "Разрешить автоматическую торговлю".

3. Запуск сообщения Telegram

  • Проверка времени и получение данных

Первая часть кода инициирует проверку времени, чтобы определить, прошло ли два часа с момента последнего обновления рыночных показателей. Используя функцию TimeCurrent(), код извлекает текущее время и сравнивает его с переменной lastUpdateTime. Если прошло более двух часов, советник приступает к сбору последних данных о рыночных условиях. Эта проверка крайне важна для предотвращения переполнения чата Telegram сообщениями от советника.

// Check if 2 hours have passed since the last update
if (TimeCurrent() - lastUpdateTime >= 2 * 3600)
{
    // ... [Code that fetches data and calculates support/resistance, etc.]
}

  • Создание выходной строки

Во второй части создается подробная выходная строка infoStr для консолидации рыночных показателей, собранных в ходе работы советника. Код извлекает текущий торговый символ с именем пары, а также форматирует текущее время сообщения, используя lastUpdateStr. Функция StringFormat используется для построения сообщения, включающего различные заполнители, которые будут заменены определенными показателями, такими как максимум, минимум, открытие и закрытие предыдущего дня, объем текущего дня, направление рынка и другие данные счета. Эта отформатированная строка является неотъемлемой частью операции, поскольку она представляет собой четкое и структурированное резюме текущих рыночных условий, которое впоследствии будет отправлено через Telegram.

// Create the output string, including pair name and last update time
string pairName = Symbol(); // Get the current symbol name
string lastUpdateStr = TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES);
string infoStr = StringFormat("Pair: %s\nPrev Day Open: %.2f\nPrev Day Close: %.2f\n"
                               "Prev Day High: %.2f\nPrev Day Low: %.2f\n"
                               "Prev Day Volume: %.0f\nCurrent Day Volume: %.0f\n"
                               "Market Direction: %s\nSupport: %.2f\nResistance: %.2f\n"
                               "Account Balance: %.2f\nAccount Equity: %.2f\n"
                               "Market Spread: %.2f\nMin Lot Size: %.2f, Max Lot Size: %.2f\n"
                               "Market Volatility (ATR): %.2f\nLast Update Time: %s\nPossible Lot Size: %.2f",
                               pairName, previousDayOpen, previousDayClose, previousDayHigh,
                               previousDayLow, previousDayVolume, currentDayVolume,
                               marketDirection, support, resistance, accountBalance,
                               accountEquity, marketSpread, minLotSize, maxLotSize,
                               atrValue, lastUpdateStr, lotSize);

  •  Регистрация и отображение информации

Третья часть посвящена регистрации и отображению сконструированной информации. Функция Print (infoStr); служит для регистрации сообщения на вкладке "Эксперты" платформы MetaTrader, позволяя просматривать информацию, отправляемую через Telegram. Это дает полезный инструмент отладки, позволяющий подтвердить правильность формулирования показателей. Кроме того, команда Comment(infoStr); отображает ту же информацию непосредственно на торговом графике, предлагая трейдерам визуальное подтверждение показателей без необходимости обращения к журналу. Эти шаги информируют пользователя о предоставленных показателях и проверяют точность данных перед их отправкой в Telegram.

// Log the information
Print(infoStr); // Here the information is logged for debugging

// Display information on the chart
Comment(infoStr); // Display the same information on the chart

  • Отправка Telegram-уведомления

В заключительной части код управляет фактической отправкой Telegram-уведомления. Оператор (SendTelegramAlerts) проверяет, включена ли опция отправки оповещений, что позволяет пользователям легко отключать уведомления без необходимости внесения изменений в код. Если оповещения включены, вызывается функция SendTelegramMessage(infoStr), которая отправляет тщательно сформированное сообщение в указанный Telegram-чат. Этот шаг имеет решающее значение, поскольку именно на нем рыночные показатели эффективно доводятся до пользователя. После этого код обновляет переменную lastUpdateTime к текущему времени с помощью lastUpdateTime = TimeCurrent();, тем самым отмечая завершение этого цикла обновления и гарантируя, что время следующего обновления будет соответствовать двухчасовому интервалу, установленному ранее.

// Send Telegram notification
if (SendTelegramAlerts) // Check if sending alerts is enabled
    SendTelegramMessage(infoStr); // Send the constructed message

// Update last update time
lastUpdateTime = TimeCurrent();

  • Имя текущей пары

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

// Create the output string, including pair name and last update time
      string pairName = Symbol(); // Get the current symbol name

Ниже показано, как информация будет выглядеть в Telegram:

Имя пары

Рис. 7. Результат


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

Перед тестированием необходимо внести несколько изменений в ваш MetaTrader 5, чтобы обеспечить бесперебойную передачу информации в Telegram.

Разрешить веб-запросы:

  • Откройте MetaTrader 5 и перейдите в "Сервис" > "Настройки" > "Советники".

Включение веб-запросов

Рис. 8. Настройка веб-запросов

  • Поставьте галочку в "Разрешить WebRequest для следующих URL" и добавьте https://api.telegram.org в список. Этот параметр позволяет советнику отправлять запросы к API Telegram.

Настройка веб-запросов

Рис. 9. Настройка веб-запросов

В целях тестирования вы также можете настроить частоту обновления на более низкую. В этом случае я сокращу ее с 2 часов до 15 секунд.

//+------------------------------------------------------------------+
//| Update metrics and display them                                  |
//+------------------------------------------------------------------+
void UpdateMetrics()
  {
// Check if 15 seconds have passed since the last update
   if(TimeCurrent() - lastUpdateTime >= 15)

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

Результат

Рис. 10. Результат

Скриншот ниже также показывает, что информация, представленная на графике MetaTrader 5, аналогична информации, относящейся к Telegram.

Результат

Рис. 11. Результаты тестирования



Заключение

Успех советника Analytics Forecaster, как показывают представленные выше скриншоты, кроется в его продуманном подходе к анализу рынка и своевременных уведомлениях посредством интеграции с Telegram. Используя различные торговые показатели, такие как данные предыдущего дня, сравнение текущих объемов, направление рынка и принципы управления рисками, советник предоставляет трейдерам ценную информацию. Рассчитанные уровни поддержки и сопротивления в сочетании с автоматическим определением размера лота позволяют принимать более обоснованные торговые решения, гарантируя, что как начинающие, так и опытные трейдеры смогут адаптировать стратегии к рыночным условиям, эффективно управляя своими рисками.

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

Дата Название инструмента  Описание Версия  Обновления  Примечания
01/10/24 Chart Projector Скрипт для наложения эффекта призрака на движение цены за предыдущий день. 1.0 Первоначальная версия Первый инструмент в Lynnchris Tools Chest
18/11/24 Analytical Comment Предоставляет информацию за предыдущий день в табличном формате, а также прогнозирует будущее направление рынка. 1.0 Первоначальная версия Второй инструмент в Lynnchris Tools Chest
27/11/24 Analytics Master Регулярное обновление рыночных показателей каждые два часа  1.01 Вторая версия Третий инструмент в Lynnchris Tools Chest
02/12/2024 Analytics Forecaster  Регулярное обновление рыночных показателей каждые два часа с интеграцией с Telegram 1.1 Третья версия Инструмент номер 5

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

Прикрепленные файлы |
Нейросети в трейдинге: Сквозная многомерная модель прогнозирования временных рядов (Окончание) Нейросети в трейдинге: Сквозная многомерная модель прогнозирования временных рядов (Окончание)
Представляем вашему вниманию заключительную часть цикла, посвящённого GinAR — нейросетевому фреймворку для прогнозирования временных рядов. В этой статье мы анализируем результаты тестирования модели на новых данных и оцениваем её устойчивость в условиях реального рынка.
От новичка до эксперта: Индикатор силы уровней поддержки и сопротивления (SRSI) От новичка до эксперта: Индикатор силы уровней поддержки и сопротивления (SRSI)
В настоящей статье мы поделимся информацией о том, как использовать программирование на MQL5 для точного определения уровней рынка, различая более слабые и самые сильные уровни цен. Мы в полном объеме разработаем действующий Индикатор силы уровней поддержки и сопротивления (SRSI).
Новый подход к пользовательским критериям при оптимизациях (Часть 1): Примеры функций активации Новый подход к пользовательским критериям при оптимизациях (Часть 1): Примеры функций активации
Это первая из серии статей, посвященных математическим аспектам создания пользовательских критериев с особым акцентом на нелинейных функциях, применяемых в нейросетях, MQL5-коде для реализации, а также на использования целевых и корректирующих смещений.
WebSocket для MetaTrader 5 — Асинхронные клиентские соединения с помощью Windows API WebSocket для MetaTrader 5 — Асинхронные клиентские соединения с помощью Windows API
В данной статье подробно описывается разработка пользовательской динамически подключаемой библиотеки, предназначенной для упрощения асинхронных клиентских соединений по протоколу WebSocket для программ MetaTrader.