Где живёт индикатор созданный в режиме тестирования без визуализации? - страница 3

 
Yury Kirillov:

2. Вопрос по поводу "Счётчик индикатора обнулится либо после OnDeinit программы, её создавшей, либо после явного вызова IndicatorRelease":

Вы невнимательно прочитали моё объяснение. Фраза "счётчик индикатора обнулится" находится после фразы "счётчик равен 1"
 
Slava:

1. Нет. В данном случае копия одна, но со счётчиком равным 2

2,3. У Вас какие то сложные случаи. Зачем добавлять индикатор на график? Если добавили, то надо делать ChartIndicatorDelete до вызова IndicatorRelease/

Зачем вызывать IndicatorRelease? Индикатор зарелизится автоматически. Вы что-то перемудрили.

После всех освобождений индикаторы работают больше 20 минут? Проверьте все другие обращения к этому же символу-периоду.

//--------------

1. Я добавляю в советнике индикатор на график через ChartIndicatorAdd() для того, чтобы видеть на графике индикатор.

Ибо iCustom() не делает его видимым и не размещает на графике.

2. ChartIndicatorDelete() у меня нормально выполняется и индикатор с графика удаляется, это производится в секции OnDeinit().

Выше Вы писали, что при исполнении OnDeinit() создавшей индикатор программы счетчик индикатора обнуляется. Видимо в моём случае это не так.

Кроме того после выполнения ChartIndicatorDelete() корректно выполнить IndicatorRelease() уже невозможно (хотя я и пытаюсь), хотя в документации рекомендуется это делать для освобождения хендла:

https://www.mql5.com/ru/docs/chart_operations/chartindicatordelete

ChartIndicatorDelete

Удаляет с указанного окна графика индикатор с указанным именем.

...

Примечание

...

Удаление индикатора с графика не означает, что расчетная часть индикатора также будет удалена из памяти терминала. Для освобождения хэндла индикатора используйте функцию IndicatorRelease().


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

Документация по MQL5: Операции с графиками / ChartIndicatorDelete
Документация по MQL5: Операции с графиками / ChartIndicatorDelete
  • www.mql5.com
//|                                    Demo_ChartIndicatorDelete.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                              https://www.mql5.com | //| Custom indicator initialization function                         |                           ...
 
Slava:
Вы невнимательно прочитали моё объяснение. Фраза "счётчик индикатора обнулится" находится после фразы "счётчик равен 1"

Принял к сведению Ваше уточнение. Но в моём случае как раз и происходит, в советнике породившем индикаторы:

1. В OnDeinit() сначала производится удаление индикаторов с чарта ChartIndicatorDelete() - удачное (в результате по каждому из индикаторов счетчик = 1)

2. Затем попытка  IndicatorRelease() - неудачная, видимо после ChartIndicatorDelete() хендла больше нет ?

3. И это происходит внутри OnDeinit(), после завершения которой должно быть уменьшение счетчика (?) (в результате счетчик = 0)

Правильно?

 

После 1, да, обнуляется.

После 2 становится 1.

Обращение двух индикаторов друг к другу образует "порочный круг" и может не позволить освободить оба индикатора.

Вам нужен какой-то специальный способ для вывода этих индикаторов из клинча

 
Slava:

После 1, да, обнуляется.

После 2 становится 1.

Обращение двух индикаторов друг к другу образует "порочный круг" и может не позволить освободить оба индикатора.

Вам нужен какой-то специальный способ для вывода этих индикаторов из клинча


Спасибо. А можно услышать Ваше мнение по поводу моего замечания:

Кроме того после выполнения ChartIndicatorDelete() корректно выполнить IndicatorRelease() уже невозможно (хотя я и пытаюсь), хотя в документации рекомендуется это делать для освобождения хендла:

Должна ли работать  IndicatorRelease() после применения ChartIndicatorDelete() или последняя уже предусматривает в себе удаление хендла?

 
Yury Kirillov:

Спасибо. А можно услышать Ваше мнение по поводу моего замечания:

Должна ли работать  IndicatorRelease() после применения ChartIndicatorDelete() или последняя уже предусматривает в себе удаление хендла?

Должна работать. И именно в этой последовательности должно быть.

ChartIndicatorDelete удаляет индикатор с графика (кстати, не сразу) и убавляет счётчик. Хэндл тут совсем ни при чём.

IndicatorRelease убавляет счётчик и убивает хэндл.

 

Выкладываю последнюю версию комплекса из инициирующего советника и параллельных индикаторов.

Вопрос гарантированного прерывания работы индикаторов решен через использование глобальных переменных терминала.

Размышления по поводу использования параллельной работы индикаторов:

Выводы по совместному использованию программно запускаемых индикаторов при тестировании и в реальном режиме.
1. В реальном режиме возможен запуск нескольких индикаторов из одного управляющего советника, взаимное получение 
индикаторами хендлов других индикаторов и взаимное получение значений индикаторных буферов.
Использование костылей в виде преднастроенных шаблонов не является необходимым. Кроме того индикаторы
непосредственно во время работы управляющего советника могут быть загружены, выгружены или перезагружены с измененными параметрами.
2. В режимах тестирования получение хендлов возможно только по последовательной схеме, то есть запускающий
советник или индикатор получает доступ к хендлу и буферам запускаемых, но не наоборот. Кроме того необходимо
иметь в виду, что в режиме тестирования без визуализации и в режиме оптимизации не может быть использовано обращение
к окнам и графическим элементам.
3. В режиме визуализации. Схема запуска только последовательная. Параллельный запуск не позволяет непосредственно
обмениваться информацией. Непосредственное обращение к данным - только в рамках последовательной схемы. 
Существенно значимая часть функций определения параметров окон и индикаторов не работает.
4. Таким образом прямое тестирование составных програмных комплексов из нескольких советников и/или индикаторов
в МТ5 не представляется возможным. Однако часть подобных ограничений можно обойти используя цепочечную (последовательную)
схему запуска советников и индикаторов и обмен данными через внешние механизмы (например глобальные переменные терминала). 
5. Стандартные механизмы завершения работы программы могут не обеспечить прекращения работы параллельных индикаторов, в частности
если они обращаются к данным друг-друга. При этом возможна ситуация потери управления такими индикаторами. Поэтому 
необходимо предусматривать специальные методы завершения их работы или ограничения запроса данных.

Большое спасибо всем участникам и читателям обсуждения.

Файлы:
Temp.zip  8 kb
 
Slava:

Должна работать. И именно в этой последовательности должно быть.

ChartIndicatorDelete удаляет индикатор с графика (кстати, не сразу) и убавляет счётчик. Хэндл тут совсем ни при чём.

IndicatorRelease убавляет счётчик и убивает хэндл.


Да вот к сожалению не работает, если бы работало, то и большей части обсуждения бы не было. 

Не пришлось бы придумывать метод гашения индикаторов.

P.S.  IndicatorRelease() после применения ChartIndicatorDelete() работает. В моём коде перед ChartIndicatorDelete() уже было использовано IndicatorRelease().

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

Для более устойчивого запуска используйте   

int   Count=1000;

в теле индикаторов взамен имеющегося

int   Count=100;


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