Как узнать, что индикатор загружен из шаблона?

 

Всем привет.
Нужна помощь в следующем вопросе.

Пишу индикатор, который должен рисовать линии поддержки и сопротивления (экспертом оформить нельзя). При этом пользователь должен иметь возможность удалять линии по своему усмотрению и они не должны восстанавливаться, в том числе при переключении таймфреймов.

При этом нужно, чтобы загрузка индикатора происходила из шаблона, но шаблон сохраняет старые линии как графические объекты  и узнать, можно ли их удалять или нельзя из вновь загруженного индикатора нельзя.
При деинициализации индикатора подходящего события нет (типа очистить графики, если сохраняется как шаблон). При инициализации узнать, загружен советник вручную или из шаблона, тоже нельзя (или я не могу придумать, как это сделать).

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

Как организовать корректную работу с шаблонами, подскажите, пожалуйста.

 
Artyom Kuraev:

Всем привет.
Нужна помощь в следующем вопросе.

Пишу индикатор, который должен рисовать линии поддержки и сопротивления (экспертом оформить нельзя). При этом пользователь должен иметь возможность удалять линии по своему усмотрению и они не должны восстанавливаться, в том числе при переключении таймфреймов.

При этом нужно, чтобы загрузка индикатора происходила из шаблона, но шаблон сохраняет старые линии как графические объекты  и узнать, можно ли их удалять или нельзя из вновь загруженного индикатора нельзя.
При деинициализации индикатора подходящего события нет (типа очистить графики, если сохраняется как шаблон). При инициализации узнать, загружен советник вручную или из шаблона, тоже нельзя (или я не могу придумать, как это сделать).

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

Как организовать корректную работу с шаблонами, подскажите, пожалуйста.

перехватывать событие "удаление объекта" и свои линии не удалять физически а перемещать например на уровень 0. Пользователь их не видит, но они есть :-) и как-бы журнал можно разобраться при загрузке индикатора..
 

Если пользователь удалил линию, созданную индикатором, пусть индикатор после этого сразу создаcт эту же линию, но с цветом clrNONE.

Такое решение не требует БД.
 

Вести БД линий, которые удалены пользователем. БД сохранять в файл при деинициализации. Как только обнаружено удаление линии во время работы индикатора, заносить такую линию в БД. Перед отображением очередной линии посмотреть, нет ли ее в БД. Если есть, не отображать. Линии лучше всего идентифицировать по координатам левой и правой опорных точек. 

При таком подходе все выходит прозрачно и никакие смены шаблона не помешают.

 

как вариант шаблон 1 - тут линии есть

шаблон 2 - а тут нет

 

Для начала, надо рисовать линии при инициализации индикатора, а в расчётной части только перемещать их при условии, что они существуют на графике.

Затем надо определить когда не надо рисовать линии даже при инициализации. Для этого есть полезная функция

UninitializeReason();

и причины деинициализаци.

И только потом можно говорить о необходимости применения шаблона. Не исключён вариант обойтись без этого.

И ещё очень интересно, могут-ли использоваться 2 и более индикаторов на одном графике с разными параметрами? Может предусмотреть вариант такой попытки?

Причины деинициализации - Именованные константы - Стандартные константы, перечисления и структуры - Справочник MQL4
Причины деинициализации - Именованные константы - Стандартные константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
//| get text description                                             | //| Expert deinitialization function                                 |
 
fxsaber:

Если пользователь удалил линию, созданную индикатором, пусть индикатор после этого сразу создаcт эту же линию, но с цветом clrNONE.

Такое решение не требует БД.
Подход интересный, но через неделю работы такого советника таких линий на каждом графике появится очень много и это будет тормозить работу индикатора.
 
Artyom Kuraev:
Подход интересный, но через неделю работы такого советника таких линий на каждом графике появится очень много и это будет тормозить работу индикатора.

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

 
Alexey Viktorov:

Для начала, надо рисовать линии при инициализации индикатора, а в расчётной части только перемещать их при условии, что они существуют на графике.

Затем надо определить когда не надо рисовать линии даже при инициализации. Для этого есть полезная функция

и причины деинициализаци.

И только потом можно говорить о необходимости применения шаблона. Не исключён вариант обойтись без этого.

И ещё очень интересно, могут-ли использоваться 2 и более индикаторов на одном графике с разными параметрами? Может предусмотреть вариант такой попытки?

Я тоже о необходимости работы с шаблонами узнал только после того, как передал работу, заказчик сказал о некорректной работе, а потом "ну Вы же должны как программист понимать, что я не могу работать со 100 копиями одновременно без шаблонов" (видимо по его мнению я программист-Ванга).
Так что вариант обойтись без него - не вариант. Если только от заказа отказаться, так как объем работ в таком виде в стоимость не укладывается. При этом в шаблон вшито еще несколько программ, которые делают неизвестно что и одна из претензий: "куда пропадают линии, которые я не удалял". Хотя на чистом графике ничего никуда не девается.

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

С причинами деинициализации вопросов нет, я их использую, чтобы сохранить объекты в случае смены таймфрейма, но они недоступны при последующей инициализации. Проблема в том, что в момент сохранения шаблона я не могу сделать так, чтобы шаблон сохранился без существующих линий на графике, а при применении шаблона в ините не смогу выяснить, загружен индикатор из шаблона или переинициализирован в результате смены графика.
Хотя как вариант начать использовать глобальные переменные, но в условиях 100 графиков и шаблонов эти переменные дадут путаницу, если на одинаковом графике будет применен шаблон с одинаковым магиком в настройках...

 
Artyom Kuraev:

Я тоже о необходимости работы с шаблонами узнал только после того, как передал работу, заказчик сказал о некорректной работе, а потом "ну Вы же должны как программист понимать, что я не могу работать со 100 копиями одновременно без шаблонов" (видимо по его мнению я программист-Ванга).
Так что вариант обойтись без него - не вариант. Если только от заказа отказаться, так как объем работ в таком виде в стоимость не укладывается. При этом в шаблон вшито еще несколько программ, которые делают неизвестно что и одна из претензий: "куда пропадают линии, которые я не удалял". Хотя на чистом графике ничего никуда не девается.

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

С причинами деинициализации вопросов нет, я их использую, чтобы сохранить объекты в случае смены таймфрейма, но они недоступны при последующей инициализации. Проблема в том, что в момент сохранения шаблона я не могу сделать так, чтобы шаблон сохранился без существующих линий на графике, а при применении шаблона в ините не смогу выяснить, загружен индикатор из шаблона или переинициализирован в результате смены графика.
Хотя как вариант начать использовать глобальные переменные, но в условиях 100 графиков и шаблонов эти переменные дадут путаницу, если на одинаковом графике будет применен шаблон с одинаковым магиком в настройках...

Я всё-равно не понимаю зачем программно сохранять шаблон? Ну хочет он открыв график накинуть шаблон, так пусть и накидывает с установленным индикатором и линиями. Эти линии должны переместиться в нужное место при первом-же тике. Не понимаю в чём проблема. В чём проблема удалить линии, сохранить шаблон и опять нанести линии...

Как могут линии быть недоступны??? Если они на графике есть, значит и доступны быть должны. Где и когда программно удаляются линии? В индикатор добавлена функция OnDeinit() или нет? В ней проверяется причина деинициализации?

В общем вопросов больше чем ответов...

 
Alexey Viktorov:

Я всё-равно не понимаю зачем программно сохранять шаблон? Ну хочет он открыв график накинуть шаблон, так пусть и накидывает с установленным индикатором и линиями. Эти линии должны переместиться в нужное место при первом-же тике. Не понимаю в чём проблема. В чём проблема удалить линии, сохранить шаблон и опять нанести линии...

Как могут линии быть недоступны??? Если они на графике есть, значит и доступны быть должны. Где и когда программно удаляются линии? В индикатор добавлена функция OnDeinit() или нет? В ней проверяется причина деинициализации?

В общем вопросов больше чем ответов...

Проблема возникает из-за того, что часть линий может быть удалена вручную пользователем (следовательно пересчитать по исходным данным и расставить нужное количество линий невозможно.

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

Для того, чтобы индикатор не изменил линии при смене таймфрейма, при первой инициализации на графике создается объект, который служит индикатором того, впервые загружается индикатор или повторно.

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


Таким образом, чтобы решить задачу, нужно найти ответ на один из двух вопросов:
Либо 1. Как в момент сохранения шаблона запретить сохранять в шаблон созданный объект-метку повторной инициализации?
Либо 2. Как в момент инициализации узнать, что индикатор загружен из шаблона, чтобы запустить пересчет и удаление лишних объектов?

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