Пользовательский индикатор, подключенный в качестве ресурса

 

Вопрос: "Правильно ли индикатор подключённый в качестве ресурса и добавленный на другой график, определяет идентификатор текущего графика?".

Последовательность действий:

  1. В эксперте подключаем пользовательский индикатор в качестве ресурса.
  2. Принтуем идентификатор текущего графика.
  3. Получаем хэндл пользовательского индикатора-ресурса для инструмента "EURUSD".
  4. Открываем новый  график для инструмента "EURUSD".
  5. Добавляем на этот новый график индикатор созданный в п.3.
  6. Индикатор на новом графике принтует идентификатор текущего графика.
В п.2 и в п.6 получается два одинаковых идентификатора графиков. Верно ли это? 

Прикрепляю файл советника и файл индикатора. Индикатор - это стандартный Custom Moving Average, только в него добавлена одна строчка:

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
  Print("Идентификатор графика на котором запущен индикатор: ",ChartID());
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//--- set accuracy

Индикатор нужно положить в ...\MQL5\Indicators\Examples\

Файлы:
 

Интересно.

long id=ChartOpen("EURUSD",_Period);
   if(id==0)
      Print("Не удалось открыть график ""EURUSD"". Код ошибки ",GetLastError());
//---
   Print("Открыт график с идентификатором= "+(string)id);
   ResetLastError();
   if(!ChartIndicatorAdd(id,0,iCustom("EURUSD",_Period,"::Custom_Moving_Average_1.ex5")))
      Print("Не удалось добавить индикатор ""Custom Moving Average 1"" на график. Код ошибки ",GetLastError());
//---
   Print("Всего индикаторов в новом окне="+(string)ChartIndicatorsTotal(id,0));

и результат

Идентификатор графика на котром запущен эксперт:        130726249372047000
Идентификатор графика на котором запущен индикатор:     130726249372047000
Открыт график с идентификатором=                        130726296275617000
Всего индикаторов в новом окне=1

Наверно, т.к индикатор-ресурс имеет название SampleEA::Custom Moving Average 1.ex5, он "помнит" место своего рождения.

 
fyords:

Интересно.

и результат

Наверно, т.к индикатор-ресурс имеет название SampleEA::Custom Moving Average 1.ex5, он "помнит" место своего рождения.

Вот в том-то и вопрос. Правильно-ли это? Ведь использование ресурсов - далее цитата:

...Включение индикаторов в качестве ресурсов позволяет упростить распространение программ....


Таким образом включая индикатор в ресурс я рассчитываю, что этот индикатор будет работать как обычный индикатор. И если такой индикатор прикрепить на график, то индикатор должен выдавать идентификатор графика на который его прикрепили, а не "родительский".

 
 barabashkakvn:

Вот в том-то и вопрос. Правильно-ли это? ...

Считаю нет. Бага.
Т.к. индикатор помещается на график, т.е. участвует в подсчете количества индикаторов, но в то же время "принадлежит другому графику" - отдает идентификатор не своего графика.

Можно было посчитать это не ошибкой при условии существования другого метода добавления индикатора на другой график.

 
fyords:

Считаю нет. Бага.
Т.к. индикатор помещается на график, т.е. участвует в подсчете количества индикаторов, но в то же время "принадлежит другому графику" - отдает идентификатор не своего графика.

Можно было посчитать это не ошибкой при условии существования другого метода добавления индикатора на другой график.

Ждемс, может ещё кто выскажется - в выходные всё равно на заявку в сервисдеск получить ответ маловероятно.
 

Ещё заметил, что индикатор из ресурса хотя и неправильно определяет идентификатор графика, но в тоже время этот индикатор правильно определяет название символа на котором находится.

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
  Print("Идентификатор графика на котором запущен индикатор: ",(string)ChartID(),", символ графика - ",Symbol());

//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);


Идентификатор графика на котором запущен индикатор: 130727027167967729, символ графика - EURUSD
Идентификатор графика на котром запущен эксперт:    130727027167967729

 
В общем заявку в сервисдеск оформил, жду результата.
 

Ситуация прояснилась. Ответ от сервисдеска:

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

Значит эту особенность подключения индикатора в виде ресурса нужно иметь ввиду
 
barabashkakvn:

Ситуация прояснилась. Ответ от сервисдеска:

Значит эту особенность подключения индикатора в виде ресурса нужно иметь ввиду

Т.е. если индикатор рисует какие-то трендовые линии, к примеру, то ему нужно передать идентификатор окна его будущего обитания.
Следовательно, нужно открывать чарт, и только потом создавать индикатор, либо через EventChartCustom сообщать индикатору идентификатор.

Так получается? 

 
fyords:

Т.е. если индикатор рисует какие-то трендовые линии, к примеру, то ему нужно передать идентификатор окна его будущего обитания.
Следовательно, нужно открывать чарт, и только потом создавать индикатор, либо через EventChartCustom сообщать индикатору идентификатор.

Так получается? 

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

 
barabashkakvn:

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

Понятно, спасибо. Пригодится такая информация.
Причина обращения: