Как узнать, запущен ли экземпляр индикатора на графике MQL4?

 

Всем доброго!

Задача простая и в тоже время хотелось бы решить ее на верняка. Собственно вопрос по сабжу, добавлю что речь идет о том, чтобы не допустить старт еще одного экземпляра одного и того же индикатора.

Индикатор не имеет под окна в связи с чем функция типа int win_idx = WindowFind(shortname) не срабатывает, имя задаю собственно так IndicatorShortName(shortname).

Варианты с глобальными переменными или поиском графических объектов не рассматриваются, так не гарантируют надежность выявления наличия на графике индикатора. 

 
Farkhat Guzairov:

Всем доброго!

Задача простая и в тоже время хотелось бы решить ее на верняка. Собственно вопрос по сабжу, добавлю что речь идет о том, чтобы не допустить старт еще одного экземпляра одного и того же индикатора.

Индикатор не имеет под окна в связи с чем функция типа int win_idx = WindowFind(shortname) не срабатывает, имя задаю собственно так IndicatorShortName(shortname).

Варианты с глобальными переменными или поиском графических объектов не рассматриваются, так не гарантируют надежность выявления наличия на графике индикатора. 

Это?

ChartIndicatorName - Операции с графиками - Справочник MQL4
ChartIndicatorName - Операции с графиками - Справочник MQL4
  • docs.mql4.com
[in]  Индекс индикатора с списке индикаторов. Нумерация индикаторов начинается с нуля, то есть самый первый индикатор в списке имеет нулевой индекс. Количество индикаторов в списке можно получить функцией ChartIndicatorsTotal(). IndicatorSetString() записывается в...
 
Farkhat Guzairov:

Всем доброго!

Задача простая и в тоже время хотелось бы решить ее на верняка. Собственно вопрос по сабжу, добавлю что речь идет о том, чтобы не допустить старт еще одного экземпляра одного и того же индикатора.

Индикатор не имеет под окна в связи с чем функция типа int win_idx = WindowFind(shortname) не срабатывает, имя задаю собственно так IndicatorShortName(shortname).

Варианты с глобальными переменными или поиском графических объектов не рассматриваются, так не гарантируют надежность выявления наличия на графике индикатора. 

ChartIndicatorName

Возвращает короткое имя индикатора по номеру в списке индикаторов на указанном окна графика.

string  ChartIndicatorName( 
   long  chart_id,      // идентификатор графика 
   int   sub_window,    // номер подокна 
   int   index          // индекс индикатора в списке индикаторов, добавленных к данному подокну графика 
   );

Параметры

chart_id

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

sub_window

[in]  Номер подокна графика. 0 означает главное окно графика.

index

[in]  Индекс индикатора с списке индикаторов. Нумерация индикаторов начинается с нуля, то есть самый первый индикатор в списке имеет нулевой индекс. Количество индикаторов в списке можно получить функцией ChartIndicatorsTotal().

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

Короткое имя индикатора, которое задается в свойстве INDICATOR_SHORTNAME функцией IndicatorSetString(). Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если короткое наименование индикатора не задается явным образом, то при компиляции в нем указывается имя файла с исходным кодом индикатора.

Необходимо правильно формировать короткое имя индикатора, которое с помощью функции IndicatorSetString() записывается в свойство INDICATOR_SHORTNAME. Мы рекомендуем, чтобы короткое имя содержало значения входных параметров индикатора, так как идентификация удаляемого с графика индикатора в функции ChartIndicatorDelete() производится именно по короткому имени.


PS. Слово "верняк" в русском языке отсутствует, поэтому "наверняка" пишется слитно :) Ну просто - рассмешили феней :))

 
Vitaly Muzichenko:

Это?

Да.

 
Artyom Trishkin:

ChartIndicatorName

Возвращает короткое имя индикатора по номеру в списке индикаторов на указанном окна графика.

Параметры

chart_id

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

sub_window

[in]  Номер подокна графика. 0 означает главное окно графика.

index

[in]  Индекс индикатора с списке индикаторов. Нумерация индикаторов начинается с нуля, то есть самый первый индикатор в списке имеет нулевой индекс. Количество индикаторов в списке можно получить функцией ChartIndicatorsTotal().

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

Короткое имя индикатора, которое задается в свойстве INDICATOR_SHORTNAME функцией IndicatorSetString(). Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если короткое наименование индикатора не задается явным образом, то при компиляции в нем указывается имя файла с исходным кодом индикатора.

Необходимо правильно формировать короткое имя индикатора, которое с помощью функции IndicatorSetString() записывается в свойство INDICATOR_SHORTNAME. Мы рекомендуем, чтобы короткое имя содержало значения входных параметров индикатора, так как идентификация удаляемого с графика индикатора в функции ChartIndicatorDelete() производится именно по короткому имени.


PS. Слово "верняк" в русском языке отсутствует, поэтому "наверняка" пишется слитно :) Ну просто - рассмешили феней :))

Дали, что хотел :),  в 4-ке сделал так:

void OnDeinit(const int reason){
   IndicatorShortName("OnDeinit");
}

Соответственно при инициализации, я получаю это наименование, проверяю, выставляю корректное наименование, все хорошо. Остается только еще один момент, на сколько я помню эта функция IndicatorShortName("OnDeinit") в MQL5, работает только в Init() или я не прав? 

Или MQL5 в принципе нету с этим проблем, т.е. при выгрузки индикатора все что с ним связанно так же очищается? В 4-ке остается не мало мусора (я не об объектах и глобальных переменных).
 
Artyom Trishkin:

PS. Слово "верняк" в русском языке отсутствует, поэтому "наверняка" пишется слитно :) Ну просто - рассмешили феней :))

Как есть, никогда особо не страдал грамотностью, я конечно же возьму ваше замечание на заметку, но раз все еще не стал грамотным то скорее всего уже не стану. Так что запасайтесь терпением и крепче держите живот, а то смеяться придется долго и часто. :))

 
Farkhat Guzairov:

Дали, что хотел :),  в 4-ке сделал так:

Соответственно при инициализации, я получаю это наименование, проверяю, выставляю корректное наименование, все хорошо. Остается только еще один момент, на сколько я помню эта функция IndicatorShortName("OnDeinit") в MQL5, работает только в Init() или я не прав? 

Или MQL5 в принципе нету с этим проблем, т.е. при выгрузки индикатора все что с ним связанно так же очищается? В 4-ке остается не мало мусора (я не об объектах и глобальных переменных).

Ничего в четвёрке не остаётся кроме объектов и глобальных переменных терминала, если их не удалить при деинициализации.

 
Vitaly Muzichenko:

Ничего в четвёрке не остаётся кроме объектов и глобальных переменных терминала, если их не удалить при деинициализации.

Виталий, я извиняюсь сейчас еще раз попробую объяснить.

Согласен, если индикатор удалить с чарта, ничего не остается, "остается" когда вы не удаляете индикатор, к примеру изменяете настройки, срабатывает событие:

REASON_PARAMETERS

5

Входные параметры были изменены пользователем


В этом случае, все глобальные переменные остаются в текущих состояниях включая свойства INDICATOR_SHORTNAME и это хорошо, так как я по ней отслеживаю как мне завершать инициализацию, корректно(INIT_SUCCEEDED) или с ошибкой(INIT_FAILED). Спасибо вам за подсказку, проблема в MQL4 точно решена.

Теперь вопрос по MQL5, к сожалению сейчас нету возможности и времени его устанавливать и проверить, но ранее как то я пытался в теле функции OnCalculate вызвать  IndicatorShortName() (точно не IndicatorSetString()), в результате получил ошибку компилятора с сообщением, что данная функция может быть вызвана только в Init().

 
Farkhat Guzairov:

Виталий, я извиняюсь сейчас еще раз попробую объяснить.

Согласен, если индикатор удалить с чарта, ничего не остается, "остается" когда вы не удаляете индикатор, к примеру изменяете настройки, срабатывает событие:

REASON_PARAMETERS

5

Входные параметры были изменены пользователем


В этом случае, все глобальные переменные остаются в текущих состояниях включая свойства INDICATOR_SHORTNAME и это хорошо, так как я по ней отслеживаю как мне завершать инициализацию, корректно(INIT_SUCCEEDED) или с ошибкой(INIT_FAILED). Спасибо вам за подсказку, проблема в MQL4 точно решена.

Теперь вопрос по MQL5, к сожалению сейчас нету возможности и времени его устанавливать и проверить, но ранее как то я пытался в теле функции OnCalculate вызвать  IndicatorShortName() (точно не IndicatorSetString()), в результате получил ошибку компилятора с сообщением, что данная функция может быть вызвана только в Init().

Я это не проверял, всегда использую только в ините, это бережёт ресурсы

 
Farkhat Guzairov:

...

Теперь вопрос по MQL5, к сожалению сейчас нету возможности и времени его устанавливать и проверить, но ранее как то я пытался в теле функции OnCalculate вызвать  IndicatorShortName() (точно не IndicatorSetString()), в результате получил ошибку компилятора с сообщением, что данная функция может быть вызвана только в Init().

Проверил в МТ5

Похоже или баг, или такая задумка. 

Если установить индикатор на график, то срабатывает OnInit() как положено, но если установить повторно, то есть копию, то OnInit() уже не срабатывает, но индикатор при этом устанавливается и работает как положено

int OnInit()
  {
   string ShortName="Candles:";
   Print( ShortName );
  //---
   ...
   return(INIT_SUCCEEDED);
  }

Вопрос к знатокам: Почему так происходит?

 
Farkhat Guzairov:

Всем доброго!

Задача простая и в тоже время хотелось бы решить ее на верняка. Собственно вопрос по сабжу, добавлю что речь идет о том, чтобы не допустить старт еще одного экземпляра одного и того же индикатора.

Индикатор не имеет под окна в связи с чем функция типа int win_idx = WindowFind(shortname) не срабатывает, имя задаю собственно так IndicatorShortName(shortname).

Варианты с глобальными переменными или поиском графических объектов не рассматриваются, так не гарантируют надежность выявления наличия на графике индикатора. 

Это работает в мт4, но не работает в мт5:

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
 string ShortName="Numbering Candles:("+(string)InpSignal+")";
//---
  for(int i=0; i<ChartGetInteger(0,CHART_WINDOWS_TOTAL); i++) {
   for(int e=0; e<ChartIndicatorsTotal(0,i); e++) {
    Print( ChartIndicatorName(0,i,e) );
    if(ChartIndicatorName(0,i,e)==ShortName) {
     Alert(ChartIndicatorName(0,i,e)," Уже установлен на графике!!!");
     return(INIT_FAILED);
    }
   }
  }
//---
   ...
//---
   IndicatorSetString(INDICATOR_SHORTNAME,ShortName);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- delete graphics
  // ObjectsDeleteAll(0,"pref");
//---
   IndicatorSetString(INDICATOR_SHORTNAME,""); // добавим строку
//---
  }

Данный код ищет копии в подокнах

Причина обращения: