Удвоение индикаторов на базе CAppDialog

 

Если к графики присоединить индикатор на базе CAppDialog (для примера беру стандартный пример из папки ...\MQL5\Indicators\Examples\Panels\SimplePanel\):

1 


потом сохранить шаблон, пусть с именем "test_template.tpl", затем очистить график от индикаторов - это можно сделать применив шаблон "ADX" (в шаблоне ADX нет никаких панелей):

2


и к этому чистому графику применить ранее сохранённый шаблон "test_template.tpl" (это шаблон с индикатором на базе CAppDialog):

3

 

то вроде всё правильно. Вот только если вызвать "Список объектов" и выбрать "Все" и отсортировать по колонке "Описание" видно, что на графике теперь две панели:

3

 

Вопрос: "Откуда взялась вторая панель?". 

 
При сохранение шаблона в нём сохраняются граф. объекты соответствующего индикатора/советника. Причём у граф. объектов рандомные числовые префиксы, которые задаются при создании соответствующих экземпляров классов. Соответственно, когда применяем шаблон, получаем такое:
1) наносятся граф. объекты, сохранённые в шаблоне.

2) индикатором/советником создаются новые граф. объекты, с новыми уникальными числовыми префиксами.

А т.к. префиксы от "прошлого раза" неизвестны программе, она ничего и не знает о существовании лишних граф. объектов.

В своих программах решил так:
1) избавился от рандомых префиксов (немного подпилил классы по умолчанию).
2) при старте индикатора/советника удаляются все граф. объекты, которые могли бы принадлежать этой программе до того, как создаются экземпляры соответствующих классов (т.е. в OnInit делается подчистка на случай, если остались объекты на графике от прошлого запуска).

 
ENSED:
При сохранение шаблона в нём сохраняются граф. объекты соответствующего индикатора/советника. Причём у граф. объектов рандомные числовые префиксы, которые задаются при создании соответствующих экземпляров классов. Соответственно, когда применяем шаблон, получаем такое:
1) наносятся граф. объекты, сохранённые в шаблоне.

2) индикатором/советником создаются новые граф. объекты, с новыми уникальными числовыми префиксами.

А т.к. префиксы от "прошлого раза" неизвестны программе, она ничего и не знает о существовании лишних граф. объектов.

В своих программах решил так:
1) избавился от рандомых префиксов (немного подпилил классы по умолчанию).
2) при старте индикатора/советника удаляются все граф. объекты, которые могли бы принадлежать этой программе до того, как создаются экземпляры соответствующих классов (т.е. в OnInit делается подчистка на случай, если остались объекты на графике от прошлого запуска).

Действительно шаблон сохраняет и прикреплённый индикатор и всю графику (а панель не что иное, как совокупность объектов). Для проверки вставил принт в OnInit() - действительно при применении шаблона с индикатором-панелью получаем только один раз OnInit().

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

 
barabashkakvn:

Действительно шаблон сохраняет и прикреплённый индикатор и всю графику (а панель не что иное, как совокупность объектов). Для проверки вставил принт в OnInit() - действительно при применении шаблона с индикатором-панелью получаем только один раз OnInit().

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

Достаточно перед сохранением шаблона удалить все объекты.

Это обычное дело при использовании индикаторов с объектами или панелей. 

 
komposter:

Достаточно перед сохранением шаблона удалить все объекты.

Это обычное дело при использовании индикаторов с объектами или панелей. 

Уже думал удалять всё. Но всё огульно удалять нельзя. Вдруг пользователь или другой индикатор понасоздавали объектов? Получается нужно выборочно удалять. А если выборочно, то нужно знать префикс, который приписывается ко всем именам панели. 

P.S. А имя (префикс) получить можно. Достаточно вызвать Name(). 

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