Робот создает много индикаторов при переключении таймфреймов. - страница 4

 
Sunriser #:
ind_subwindow определяется заранее при добавлении индикатора на график в OnInit().

ind_subwindow на самом деле это не идентификатор. Это номер окна и он влёгкую меняется.

В OnDeinit его надо искать заново

 
Maxim Kuznetsov #:

ind_subwindow на самом деле это не идентификатор. Это номер окна и он влёгкую меняется.

В OnDeinit его надо искать заново

Я не писал, что это идентификатор. В предыдущем посте я написал про "искать заново".

Без рабочего примера кода можно, что угодно утверждать, уж простите.

 
Sunriser #:

Я не писал, что это идентификатор. В предыдущем посте я написал про "искать заново".

Без рабочего примера кода можно, что угодно утверждать, уж простите.

вот вырезка из рабочего кода (со стандартным ATR, который в OnInit создаётся и аттачится к чарту):

// метод OnDeinit()
      if (highATRHandle!=INVALID_HANDLE) {
         string atrShortName=StringFormat("ATR(%d)",highATRPeriod);
         int atrWindow=ChartWindowFind(0,atrShortName);
         if (atrWindow!=-1) {
            ChartIndicatorDelete(0,atrWindow,atrShortName);
         }
      }
      .....
      ChartRedraw()
// деструктор ~
     if (highATRHandle!=INVALID_HANDLE) {
        IndicatorRelease(highATRHandle);
        highATRHandle=INVALID_HANDLE;
     }
 
Maxim Kuznetsov #:

вот вырезка из рабочего кода (со стандартным ATR, который в OnInit создаётся и аттачится к чарту):

Ну хорошо, эта ваша мысль понятна.

А теперь если на графике один ATR добавлен ботом, а второй добавлен вручную, тогда оба индикатора будут иметь имя вида ATR(14) и как отличить какой из них создан ботом?

 
Sunriser #:

Ну хорошо, эта ваша мысль понятна.

А теперь если на графике один ATR добавлен ботом, а второй добавлен вручную, тогда оба индикатора будут иметь имя вида ATR(14) и как отличить какой из них создан ботом?

это просто вырезка про ATR, чтобы copy-paste помешьше. Со своими индикаторами тоже самое, только бот передаёт имя name+magick_бота, индикатор себе в своём OnInit его присваивает. 

различия кода (моего/вашего) - у меня есть ChartRedraw и IndicatorRelease (и поиск окна при удалении). В индикаторах кстати тоже ChartRedraw есть в OnInit/Deinit, не для того конечно сделан, но возможно влияет.

PS/ И по мелочи, переменные всегда инициализируются и всегда очищаются. без принудительного присваивания в OnInit и обнуления в OnDeinit int foo=default_value в глобальной секции это эпичная ошибка.

 
Maxim Kuznetsov #:

тогда получается что на каждый период создаёте индикатор. Сами. Очень качественный исходник :-)

решение проблемы на виду, не надо заниматься овер-инжинирингом. При раскрутке советника придумал индикатору имя, создал+приаттачил, в OnDeinit отцепил от чарта по уникальному имени и удалил хендл. ВСЁ. По классике: "я тебя породил, я тебя и убью"

а вы начали мудрить с "не удалять при смене ТФ" и городить код. При "неудалении" индикатор сохраняется во внутренний шаблон и перезагражается по нему уже в чарте (отличительная особенность - начинает получать OnChartEvent). Причём перезагрузка происходит параллельно с перезагрузкой советника и чей OnInit на какой стадии впереди кому как повезёт. 

PS/ там есть другие вопросы без ответов - что происходит при изменении пользователем параметров приаттаченого к чарту индикатора. Старый сгинет и будет новый с новыми параметрами или поменяются опции работающего с советником, или это неопределённое поведение от билда-к-билду 

Вы не разобрались в проблеме совершенно. Никто ничего специально не мудрит, а использует штатный способ - на текущем графике размещается эксперт, который под свои нужны создает индикатор - ВСЁ. После этого пользователь переключает таймфрейм и получает задвоенные подокна индикаторов - одно нормальное, второе "зомби" - либо с полным дубликатом параметров первого индикатора (что не может быть в МТ5 по определению - это баг), либо с непроинициализированным именем, то есть без сработавшего OnInit.

В приложенных исходниках MQL5 инициализация и деинициализация производятся по лучшим стандартам. Потрудились бы изучить что ли тестовый пример, прежде чем писать лабуду.

Что происходит при изменении параметров приатаченного индикатора (ТФ - один из неявных параметров индикатора), доподлинно известно и постоянно - старая копия удаляется, а новая создается, и это видно даже в прилагаемых логах - там выведены все хендлы.

 
Sunriser #:

Ну хорошо, эта ваша мысль понятна.

А теперь если на графике один ATR добавлен ботом, а второй добавлен вручную, тогда оба индикатора будут иметь имя вида ATR(14) и как отличить какой из них создан ботом?

Это будет один и тот же экземпляр индикатора. Более того, встроенные индикаторы кешируются даже между графиками (если совпадает символ/ТФ). См.книгу.
Учебник по MQL5: Дескрипторы и счетчики владельцев индикаторов / Создание прикладных программ
Учебник по MQL5: Дескрипторы и счетчики владельцев индикаторов / Создание прикладных программ
  • www.mql5.com
Итак, для программной работы с индикаторами требуется оперировать дескрипторами. Здесь можно провести параллель с дескрипторами файлов (см. раздел...
 
Maxim Kuznetsov #:

это просто вырезка про ATR, чтобы copy-paste помешьше. Со своими индикаторами тоже самое, только бот передаёт имя name+magick_бота, индикатор себе в своём OnInit его присваивает. 

различия кода (моего/вашего) - у меня есть ChartRedraw и IndicatorRelease (и поиск окна при удалении). В индикаторах кстати тоже ChartRedraw есть в OnInit/Deinit, не для того конечно сделан, но возможно влияет.

PS/ И по мелочи, переменные всегда инициализируются и всегда очищаются. без принудительного присваивания в OnInit и обнуления в OnDeinit int foo=default_value в глобальной секции это эпичная ошибка.

Я для вас сделал другие максимально упрощенные тестовые файлы в соответствии с вашим примером. (но без ChartRedraw).

Ожидаемо он работает в случае стандартного индикатора (нужно раскоментировать #define ATR //использовать iATR)

И не работает для пользовательского индикатора с передеваемым magic.

Просто хочу чтобы вы у себя воспроизвели проблему - индикатор не найден в OnDeinit при смене ТФ.

Файлы:
 
Stanislav Korotky #:
Это будет один и тот же экземпляр индикатора. Более того, встроенные индикаторы кешируются даже между графиками (если совпадает символ/ТФ). См.книгу.

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

Здесь имеется в виду, что расчетная часть всегда будет одна, а добавить условный MACD я могу 10 раз в 10 подокон одного графика? Ведь вручную это получается.

 
Sunriser #:

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

Здесь имеется в виду, что расчетная часть всегда будет одна, а добавить условный MACD я могу 10 раз в 10 подокон одного графика? Ведь вручную это получается.

Да, расчетная часть. Но может что-то изменилось и внешне - книга-то 3 года назад писалась.