Всем доброго!
Задача простая и в тоже время хотелось бы решить ее на верняка. Собственно вопрос по сабжу, добавлю что речь идет о том, чтобы не допустить старт еще одного экземпляра одного и того же индикатора.
Индикатор не имеет под окна в связи с чем функция типа int win_idx = WindowFind(shortname) не срабатывает, имя задаю собственно так IndicatorShortName(shortname).
Варианты с глобальными переменными или поиском графических объектов не рассматриваются, так не гарантируют надежность выявления наличия на графике индикатора.
Это?
- docs.mql4.com
Всем доброго!
Задача простая и в тоже время хотелось бы решить ее на верняка. Собственно вопрос по сабжу, добавлю что речь идет о том, чтобы не допустить старт еще одного экземпляра одного и того же индикатора.
Индикатор не имеет под окна в связи с чем функция типа 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. Слово "верняк" в русском языке отсутствует, поэтому "наверняка" пишется слитно :) Ну просто - рассмешили феней :))
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-ке остается не мало мусора (я не об объектах и глобальных переменных).PS. Слово "верняк" в русском языке отсутствует, поэтому "наверняка" пишется слитно :) Ну просто - рассмешили феней :))
Как есть, никогда особо не страдал грамотностью, я конечно же возьму ваше замечание на заметку, но раз все еще не стал грамотным то скорее всего уже не стану. Так что запасайтесь терпением и крепче держите живот, а то смеяться придется долго и часто. :))
Дали, что хотел :), в 4-ке сделал так:
Соответственно при инициализации, я получаю это наименование, проверяю, выставляю корректное наименование, все хорошо. Остается только еще один момент, на сколько я помню эта функция IndicatorShortName("OnDeinit") в MQL5, работает только в Init() или я не прав?
Или MQL5 в принципе нету с этим проблем, т.е. при выгрузки индикатора все что с ним связанно так же очищается? В 4-ке остается не мало мусора (я не об объектах и глобальных переменных).Ничего в четвёрке не остаётся кроме объектов и глобальных переменных терминала, если их не удалить при деинициализации.
Ничего в четвёрке не остаётся кроме объектов и глобальных переменных терминала, если их не удалить при деинициализации.
Виталий, я извиняюсь сейчас еще раз попробую объяснить.
Согласен, если индикатор удалить с чарта, ничего не остается, "остается" когда вы не удаляете индикатор, к примеру изменяете настройки, срабатывает событие:
5 | Входные параметры были изменены пользователем |
В этом случае, все глобальные переменные остаются в текущих состояниях включая свойства INDICATOR_SHORTNAME и это хорошо, так как я по ней отслеживаю как мне завершать инициализацию, корректно(INIT_SUCCEEDED) или с ошибкой(INIT_FAILED). Спасибо вам за подсказку, проблема в MQL4 точно решена.
Теперь вопрос по MQL5, к сожалению сейчас нету возможности и времени его устанавливать и проверить, но ранее как то я пытался в теле функции OnCalculate вызвать IndicatorShortName() (точно не IndicatorSetString()), в результате получил ошибку компилятора с сообщением, что данная функция может быть вызвана только в Init().
Виталий, я извиняюсь сейчас еще раз попробую объяснить.
Согласен, если индикатор удалить с чарта, ничего не остается, "остается" когда вы не удаляете индикатор, к примеру изменяете настройки, срабатывает событие:
5 | Входные параметры были изменены пользователем |
В этом случае, все глобальные переменные остаются в текущих состояниях включая свойства INDICATOR_SHORTNAME и это хорошо, так как я по ней отслеживаю как мне завершать инициализацию, корректно(INIT_SUCCEEDED) или с ошибкой(INIT_FAILED). Спасибо вам за подсказку, проблема в MQL4 точно решена.
Теперь вопрос по MQL5, к сожалению сейчас нету возможности и времени его устанавливать и проверить, но ранее как то я пытался в теле функции OnCalculate вызвать IndicatorShortName() (точно не IndicatorSetString()), в результате получил ошибку компилятора с сообщением, что данная функция может быть вызвана только в Init().
Я это не проверял, всегда использую только в ините, это бережёт ресурсы
...
Теперь вопрос по MQL5, к сожалению сейчас нету возможности и времени его устанавливать и проверить, но ранее как то я пытался в теле функции OnCalculate вызвать IndicatorShortName() (точно не IndicatorSetString()), в результате получил ошибку компилятора с сообщением, что данная функция может быть вызвана только в Init().
Проверил в МТ5
Похоже или баг, или такая задумка.
Если установить индикатор на график, то срабатывает OnInit() как положено, но если установить повторно, то есть копию, то OnInit() уже не срабатывает, но индикатор при этом устанавливается и работает как положено
int OnInit() { string ShortName="Candles:"; Print( ShortName ); //--- ... return(INIT_SUCCEEDED); }
Вопрос к знатокам: Почему так происходит?
Всем доброго!
Задача простая и в тоже время хотелось бы решить ее на верняка. Собственно вопрос по сабжу, добавлю что речь идет о том, чтобы не допустить старт еще одного экземпляра одного и того же индикатора.
Индикатор не имеет под окна в связи с чем функция типа 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,""); // добавим строку //--- }
Данный код ищет копии в подокнах
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем доброго!
Задача простая и в тоже время хотелось бы решить ее на верняка. Собственно вопрос по сабжу, добавлю что речь идет о том, чтобы не допустить старт еще одного экземпляра одного и того же индикатора.
Индикатор не имеет под окна в связи с чем функция типа int win_idx = WindowFind(shortname) не срабатывает, имя задаю собственно так IndicatorShortName(shortname).
Варианты с глобальными переменными или поиском графических объектов не рассматриваются, так не гарантируют надежность выявления наличия на графике индикатора.