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

[Удален]  
Робот создает много экземпляров составных в нем индикаторов при переключении таймфреймов. Стоит на паре EURUSD H1 и при смене на любой другой ТФ к имеющимся индикаторам добавляются еще партия этих же  индикаторов, при переключении обратно на изначальный, появляется 3 дублирующаяся партия индикаторов.
[Удален]  
Может кто знает
 

робот написал с ошибками..

конкретно - он приаттачивает индикаторы к чарту, а в личном OnDeinit обратно не убирает. (и ещё возможно путаются OnInit/OnDeinit при переключении ТФ..и индикаторы аттачаться прямо в OnInit...и...в общем баги там и недочёты)

[Удален]  
Maxim Kuznetsov #:

робот написал с ошибками..

конкретно - он приаттачивает индикаторы к чарту, а в личном OnDeinit обратно не убирает. (и ещё возможно путаются OnInit/OnDeinit при переключении ТФ..и индикаторы аттачаться прямо в OnInit...и...в общем баги там и недочёты)

Спасибо за ответ. В onDeinit() освобождаю ресурсы через IndicatorRelease(handle), ну а перед этив в onInit() подключаю, а в глобальном уровне объявляю сам хэндл типа int. Ничего особенного вроде бы, но этот нюанс меня выбешивает

 
Desperate #:

Спасибо за ответ. В onDeinit() освобождаю ресурсы через IndicatorRelease(handle), ну а перед этив в onInit() подключаю, а в глобальном уровне объявляю сам хэндл типа int. Ничего особенного вроде бы, но этот нюанс меня выбешивает

у тебя где-то есть ChartIndicatorAdd - "разместить индикатор на чарте"

что происходит:

- в советнике заводишь индикатор, командуешь добавить его на чарт, индикатор появляется. 

- меняешь таймфрейм, терминал сохраняет текущий шаблон (вместе с добавленным индикатором и твоим советником), вызывает OnDeinit

- загружается сохранённый шаблон с индикатором и советником, вызываются их OnInit - советник заводит новый индикатор и добавляет на чарт

что надо делать :

- при добавлении индикатора проверять а нет ли уже запущенного экземпляра индикатора. Если есть то новый не добавлять в чарт (опция: и внутри использовать уже имеющийся, не создавать новый).

- в ОnDeinit советника дёргать ChartIndicatorDel своего добавленного индикатора. (это как мёртвому припарка, но на возможные изменения в грядущих билдах)

будут проблемы с IndicatorShortName - ты им не управляешь и в советнике тебе придётся "угадать" ShortName своего индикатора

PS/ вообще на мой взгляд ChartIndicatorAdd и всё что с ним, это сплошная архитектурная ошибка, поэтому с ними плохо

 
Maxim Kuznetsov #:
ChartIndicatorDelete

Не понятно зачем это создано в таком виде, если для применения нужно создавать костыли?

Справка

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

1. Индикаторы - это чуть более глубже, чем МА и Стохастик, и им не нужно ни длинное ни короткое имя, достаточно названия файла.

2. Зачем по короткому имени, как с этим работать в другом индикаторе, или в советнике?

Нужно 2 опции:

1. Удалить по хендлу

2. Удалить по названию

[Удален]  
Спасибо, господа, за помощь! Насколько я разбирался в справочнике и примерах кода, ChartIndicatorAdd() / ChartIndicatorDelete() используется при использовании входящей переменной типа bool. Input bool HideIndicators = true/false.. Вообще вы советуете их по возможности не использовать для повышения оптимизации и предсказуемости работы советника ?
[Удален]  
Костыли, как я понимаю, вечный атрибут, и не только в MQL5, а во всех областях IT и жизни ) Это норма наших дней и всегда будет, поэтому смекалку действительно надо прокачивать, изобретать в условиях ограничений
 
Desperate #:
Вообще вы советуете их по возможности не использовать для повышения оптимизации и предсказуемости работы советника ?

посоветую не использовать ChartIndicatorAdd в советниках.

Сугубо идеология: внешний вид (какие индикаторы и зачем видны на чарте) должен определять пользователь сам. Заодно он там может настраивать разные параметры и цвета.

А робот/советник должен быть адаптирован к работе без чарта. Никаких ChartIndicatorAdd, ChartGet/SetXXX,ObjectGet/SetXXX и прочего подобного

Ему графика и индикаторы нужны только в процессе отладки и валидации. 99.99% времени он эксплуатируется "в тёмную". Или вообще на обрезке MQ-VPS (и снова загадочные загадки - нафик он нужен за такие деньги ? Win-VDS примерно столько-же а то и меньше.)

[Удален]  
Спасибо Вам!
 
Desperate #:
Спасибо Вам!

Можете не бояться функции ChartIndicatorAdd и применять её, когда надо показать используемый в эксперте индикатор на графике (это бывает полезно). Только не забывайте освобождать дескриптор после добавления индюка на график, потому что его привязка к эксперту в этом случае уже лишняя (получается 2 "хозяина", и индюк не освобождается).

  // если Momentum(14) еще нет на графике, добавляем его
  const int w = ChartWindowFind(0, "Momentum(14)");
  if(w == -1)
  {
     const int momentum = iMomentum(NULL, 0, 14, PRICE_TYPICAL);
     ChartIndicatorAdd(0, (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL), momentum);
     IndicatorRelease(momentum);
  }