Как создать кастомный график Ренко в MetaTrader 5

Как создать кастомный график Ренко в MetaTrader 5 MQL4 / MQL5 (MetaTrader)
Пошаговое руководство по созданию кастомных графиков Ренко (Renko) в MT5 с использованием Custom Symbols и независимого потока тиков.
Суть: Для создания кастомного графика Ренко в MetaTrader 5 используется API пользовательских символов (CustomSymbol*). Мы создаем виртуальный инструмент, транслируем в него независимый поток тиков базового актива и программно формируем бары Ренко фиксированного размера с помощью функции CustomRatesAdd. Это позволяет анализировать Ренко-графики стандартными индикаторами без задержек и ограничений автономных графиков.

Исходный код

Ниже представлен готовый код советника (EA), который создает кастомный символ и в реальном времени строит бары Ренко на основе входящих тиков текущего графика. Код необходимо сохранить в папку MQL5/Experts.

//+------------------------------------------------------------------+
//|                                                   RenkoGenEA.mq5 |
//|                                                   Quant Developer|
//+------------------------------------------------------------------+
#property copyright "Quant Developer"
#property link      "https://finfluct.com"
#property version   "1.00"

input int BoxSize = 100; // Размер коробки Ренко (в пунктах)
input string CustomSymbolName = "EURUSD_Renko"; // Имя кастомного символа

double last_renko_close = 0;
double last_renko_open = 0;
datetime last_bar_time = 0;

int OnInit()
{
   if(!SymbolExist(CustomSymbolName))
   {
      if(!CustomSymbolCreate(CustomSymbolName, "Renko", _Symbol))
      {
         Print("Ошибка создания символа: ", GetLastError());
         return(INIT_FAILED);
      }
   }
   
   CustomSymbolSetInteger(CustomSymbolName, SYMBOL_DIGITS, _Digits);
   CustomSymbolSetDouble(CustomSymbolName, SYMBOL_POINT, _Point);
   CustomSymbolSetInteger(CustomSymbolName, SYMBOL_TRADE_MODE, SYMBOL_TRADE_MODE_DISABLED);
   
   if(!SymbolSelect(CustomSymbolName, true))
   {
      Print("Ошибка выбора символа");
      return(INIT_FAILED);
   }
   
   MqlTick last_tick;
   if(SymbolInfoTick(_Symbol, last_tick))
   {
      last_renko_close = last_tick.bid;
      last_renko_open = last_tick.bid;
      last_bar_time = TimeCurrent();
   }
   
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   MqlTick tick;
   if(!SymbolInfoTick(_Symbol, tick)) return;
   
   double price = tick.bid;
   double point = _Point;
   double box_size_price = BoxSize * point;
   
   if(price >= last_renko_close + box_size_price)
   {
      while(price >= last_renko_close + box_size_price)
      {
         double open = last_renko_close;
         double close = open + box_size_price;
         datetime bar_time = last_bar_time + 60;
         
         AddRenkoBar(open, close, open, close, bar_time);
         
         last_renko_open = open;
         last_renko_close = close;
         last_bar_time = bar_time;
      }
   }
   else if(price <= last_renko_close - box_size_price)
   {
      while(price <= last_renko_close - box_size_price)
      {
         double open = last_renko_close;
         double close = open - box_size_price;
         datetime bar_time = last_bar_time + 60;
         
         AddRenkoBar(open, open, close, close, bar_time);
         
         last_renko_open = open;
         last_renko_close = close;
         last_bar_time = bar_time;
      }
   }
}

void AddRenkoBar(double open, double high, double low, double close, datetime time)
{
   MqlRates rates[1];
   rates[0].open = open;
   rates[0].high = high;
   rates[0].low = low;
   rates[0].close = close;
   rates[0].time = time;
   rates[0].tick_volume = 1;
   rates[0].spread = 0;
   rates[0].real_volume = 0;
   
   CustomRatesAdd(CustomSymbolName, rates, 1);
}

Разбор параметров

  • BoxSize: Размер коробки (кирпича) Ренко в пунктах. Определяет минимальное движение цены, необходимое для формирования нового бара.
  • CustomSymbolName: Имя создаваемого кастомного символа (например, EURUSD_Renko), который появится в Обзоре рынка терминала MetaTrader 5.

Как запустить

1. Откройте MetaEditor в MetaTrader 5, создайте новый советник и вставьте в него представленный выше код.

2. Скомпилируйте код и вернитесь в терминал MT5.

3. Откройте график базового актива (например, EURUSD) и перетащите на него созданный советник.

4. В настройках укажите желаемый размер коробки BoxSize и имя кастомного символа.

5. В окне «Обзор рынка» (Market Watch) появится новый символ. Кликните по нему правой кнопкой мыши и выберите «Открыть график».

6. Теперь у вас есть полноценный, обновляемый в реальном времени график Ренко! Вы можете накладывать на него любые индикаторы, например, адаптивные скользящие средние. О том, как работают подобные алгоритмы сглаживания, читайте в статье Реализация адаптивного скользящего среднего Кауфмана (KAMA) в MQL4.

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

Если вам потребуется оптимизировать математические расчеты при обработке огромных массивов тиков, рекомендуем изучить статью Как вызвать C++ DLL в MQL5: Ускорение расчетов для Квантов.

Оцените статью
FinFluct