ChartIndicatorAdd

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

bool  ChartIndicatorAdd(
   long  chart_id,                 // идентификатор графика
   int   sub_window                // номер подокна
   int   indicator_handle          // хэндл индикатора
   );

Параметры

chart_id

[in]  Идентификатор графика. 0 означает текущий график.

sub_window

[in]  Номер подокна графика. 0 означает главное окно графика. Чтобы добавить индикатор в новое окно, параметр должен быть на единицу больше, чем индекс последнего существующего окна, то есть равен CHART_WINDOWS_TOTAL. Если значение параметра превышает значение CHART_WINDOWS_TOTAL, то новое окно создано не будет, индикатор не будет добавлен.

indicator_handle

[in]  Хэндл индикатора.

Возвращаемое значение

Возвращает true в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Ошибка 4114 означает, что график и добавляемый индикатор отличаются по символу или таймфрейму.

Примечание

Если на главное окно графика добавляется индикатор, который должен быть отрисован в отдельном подокне (например, встроенный iMACD или пользовательский индикатор с указанным свойством #property indicator_separate_window), то такой индикатор может оказаться невидимым, хотя и будет присутствовать в списке индикаторов. Это означает, что масштаб данного индикатора отличается от масштаба графика цен и значения добавленного индикатора не попадают в отображаемый диапазон ценового графика. При этом GetLastError() вернет нулевой код, означающий отсутствие ошибки. Значения такого "невидимого" индикатора можно будет наблюдать в "Окне данных" и получать из других MQL5-программ.

Пример:

#property description "Эксперт для демонстрации работы с функцией ChartIndicatorAdd()."
#property description "После запуска на графике (и получения ошибки в Журнал) откройте"
#property description "свойства советника и задайте правильные параметры <symbol> и <period>."
#property description "На график будет добавлен индикатор MACD."
 
//--- input parameters
input string          symbol="AUDUSD";    // имя символа
input ENUM_TIMEFRAMES period=PERIOD_M12;  // таймфрейм
input int    fast_ema_period=12;          // период быстрой средней MACD
input int    slow_ema_period=26;          // период медленной средней MACD
input int      signal_period=9;           // период усреднения разности
input ENUM_APPLIED_PRICE apr=PRICE_CLOSE// тип цены для расчета MACD
 
int indicator_handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
//--- попробуем добавить индикатор на график
   if(!AddIndicator())
     {
      //--- функция AddIndicator() отказалась добавить индикатор на график
      int answer=MessageBox("Всё равно попытаться добавить MACD на график?",
                            "Неправильно задан символ и/или таймфрейм для добавления индикатора",
                            MB_YESNO // будут показаны кнопки выбора "Yes" и "No"
                            );
      //--- если пользователь все равно настаивает на неправильном использовании ChartIndicatorAdd()
      if(answer==IDYES)
        {
         //--- сначала сообщим об этом в Журнал
         PrintFormat("Внимание! %s: Попробуем добавить индикатор MACD(%s/%s) на график %s/%s. Получим ошибку 4114",
                     __FUNCTION__,symbol,EnumToString(period),_Symbol,EnumToString(_Period));
         //--- получим номер нового подокна, в которое попытаемся добавить индикатор
         int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
         //--- теперь сделаем попытку, обреченную на ошибку
         if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
            PrintFormat("Не удалось добавить индикатор MACD на окно %d графика. Код ошибки  %d",
                        subwindow,GetLastError());
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// эксперт ничего не делает
  }
//+------------------------------------------------------------------+
//| Функция проверки и добавления индикатора на график               |
//+------------------------------------------------------------------+
bool AddIndicator()
  {
//--- выводимое сообщение
   string message;
//--- проверим на совпадение символ индикатора и символ графика
   if(symbol!=_Symbol)
     {
      message="Демонстрация использования функции Demo_ChartIndicatorAdd():";
      message=message+"\r\n";
      message=message+"Нельзя на график добавить индикатор, рассчитанный на другом символе.";
      message=message+"\r\n";
      message=message+"Укажите в свойствах эксперта символ графика - "+_Symbol+".";
      Alert(message);
      //--- досрочный выход, не будем добавлять индикатор на график
      return false;
     }
//--- проверим на совпадение таймфрейм индикатора и таймфрейм графика
   if(period!=_Period)
     {
      message="Нельзя на график добавить индикатор, рассчитанный на другом таймфрейме.";
      message=message+"\r\n";
      message=message+"Укажите в свойствах эксперта таймфрейм графика - "+EnumToString(_Period)+".";
      Alert(message);
      //--- досрочный выход, не будем добавлять индикатор на график
      return false;
     }
//--- все проверки прошли, символ и период индикатора соответствуют графику
   if(indicator_handle==INVALID_HANDLE)
     {
      Print(__FUNCTION__,"  Создаем индикатор MACD");
      indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
      if(indicator_handle==INVALID_HANDLE)
        {
         Print("Не удалось создать индикатор MACD. Код ошибки ",GetLastError());
        }
     }
//--- сбросим код ошибки
   ResetLastError();
//--- накладываем индикатор на график
   Print(__FUNCTION__,"  Добавляем индикатор MACD на график");
   Print("MACD построен на ",symbol,"/",EnumToString(period));
//--- получим номер нового подокна, в которое добавим индикатор MACD
   int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   PrintFormat("Добавляем индикатор MACD на окно %d графика",subwindow);
   if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
     {
      PrintFormat("Не удалось добавить индикатор MACD на окно %d графика. Код ошибки  %d",
                  subwindow,GetLastError());
     }
//--- добавление индикатора на график прошло успешно
   return(true);
  }

Смотри также

ChartIndicatorDelete(), ChartIndicatorName(), ChartIndicatorsTotal(), iCustom(), IndicatorCreate()