Запуск одного индикатора при наличии другого

 
Добрый день.

Скажем, есть Индикатор_1 и Индикатор_2, и есть необходимость реализовать схему, чтобы 1-й запускался ТОЛЬКО тогда, когда 2-й есть на графике.

Но тут проблема: Индикатор_1 ничего не отображает (просто рассчитывает, что надо, и сигналит, когда надо), поэтому его логично сделать невидимым (#property indicator_chart_window + отсутствие буферов для рисования). В то же время Индикатор_2 рисует линии и отображается в отдельном подокне (#property indicator_separate_window). Таким образом, одно дело запустить вручную Индикатор_1 при запущенном (или незапущенном) Индикаторе_2 - проверка наличия Индикатора_2 проходит на ура.... И совсем другое дело - закрыть терминал с запущеными обоими индикаторами и открыть его снова - тут является проблема: т.к. Индикатор_1 фактически принадлежит основному (0-му) окну терминала, а Индикатор_2 находится в собственном подокне (индекс которого >0), и на старте терминала, судя по логам, индикаторы загружаются по-очереди по окнам (сначала индикаторы 0-го окна, потом 1-го и т.д.), то в такой ситуации в момент старта Индикатора_1 подокно с Индикатором_2 еще не существует, что и не дает Индикатору_1 запуститься.

Ладно, придумал обходной путь: сделал Индикатор_1 в отдельном подокне(#property indicator_separate_window) с индексом больше подокна Индикатора_2. Проблема со стартом терминала решилась. НО: Индикатору_1 нечего отображать, а для него создается целое подокно, которое занимает место.

Какие тут решения:

  • сдвинуть вручную границу подокна вниз так, чтобы его не было видно, невозможно - все равно остается полоска окна, которая занимает место
  • установка #property indicator_height  в 0 или 1 ничего не дает - подокно создается бОльших размеров
  • установка того же свойства через IndicatorSetInteger(INDICATOR_HEIGHT, 1); так же результатов не дает

Ладно. Нашел еще как извратиться: у каждого индикатора в диалоге настроек есть закладка "Отображение", где можно вручную задать таймы, где отображать индикатор. И, казалось бы, это решает проблему: ставлю там например М1 (М1 не использую в работе), и пусть подокно индикатора там висит, а на остальных таймах его просто нет - ОТЛИЧНО - так и есть... НО ... но при этом вылазит очередная беда. Видимо разработчики так и задумали, что если индикатор не отображается на тайме, то он там и не считается (событие OnCalculate просто не происходит). В итоге ситуация патовая....

По итогам хотелось бы узнать, как обойти такую ситуацию, учитывая что:

  • Индикатор_1 должен запускаться ТОЛЬКО тогда, когда Индикатор_2 есть на графике
  • Индикатора_1 не должно быть видно, но он должен откликаться на тики (событие OnCalculate), какой бы из таймов не был в данный момент активным
 
satorifx:
Добрый день.

Скажем, есть Индикатор_1 и Индикатор_2, и есть необходимость реализовать схему, чтобы 1-й запускался ТОЛЬКО тогда, когда 2-й есть на графике.

Но тут проблема: Индикатор_1 ничего не отображает (просто рассчитывает, что надо, и сигналит, когда надо), поэтому его логично сделать невидимым (#property indicator_chart_window + отсутствие буферов для рисования). В то же время Индикатор_2 рисует линии и отображается в отдельном подокне (#property indicator_separate_window). Таким образом, одно дело запустить вручную Индикатор_1 при запущенном (или незапущенном) Индикаторе_2 - проверка наличия Индикатора_2 проходит на ура.... И совсем другое дело - закрыть терминал с запущеными обоими индикаторами и открыть его снова - тут является проблема: т.к. Индикатор_1 фактически принадлежит основному (0-му) окну терминала, а Индикатор_2 находится в собственном подокне (индекс которого >0), и на старте терминала, судя по логам, индикаторы загружаются по-очереди по окнам (сначала индикаторы 0-го окна, потом 1-го и т.д.), то в такой ситуации в момент старта Индикатора_1 подокно с Индикатором_2 еще не существует, что и не дает Индикатору_1 запуститься.

Ладно, придумал обходной путь: сделал Индикатор_1 в отдельном подокне(#property indicator_separate_window) с индексом больше подокна Индикатора_2. Проблема со стартом терминала решилась. НО: Индикатору_1 нечего отображать, а для него создается целое подокно, которое занимает место.

Какие тут решения:

  • сдвинуть вручную границу подокна вниз так, чтобы его не было видно, невозможно - все равно остается полоска окна, которая занимает место
  • установка #property indicator_height  в 0 или 1 ничего не дает - подокно создается бОльших размеров
  • установка того же свойства через IndicatorSetInteger(INDICATOR_HEIGHT, 1); так же результатов не дает

Ладно. Нашел еще как извратиться: у каждого индикатора в диалоге настроек есть закладка "Отображение", где можно вручную задать таймы, где отображать индикатор. И, казалось бы, это решает проблему: ставлю там например М1 (М1 не использую в работе), и пусть подокно индикатора там висит, а на остальных таймах его просто нет - ОТЛИЧНО - так и есть... НО ... но при этом вылазит очередная беда. Видимо разработчики так и задумали, что если индикатор не отображается на тайме, то он там и не считается (событие OnCalculate просто не происходит). В итоге ситуация патовая....

По итогам хотелось бы узнать, как обойти такую ситуацию, учитывая что:

  • Индикатор_1 должен запускаться ТОЛЬКО тогда, когда Индикатор_2 есть на графике
  • Индикатора_1 не должно быть видно, но он должен откликаться на тики (событие OnCalculate), какой бы из таймов не был в данный момент активным
Если изменить постановку задачи: индикатор_1 рассчитывается при наличии индикатора_2. Т.е., перенесите проверку наличия индикатора_2 из OnInit в OnCalculate. Если такого нет, то return.
 
Mislaid:
Если изменить постановку задачи: индикатор_1 рассчитывается при наличии индикатора_2. Т.е., перенесите проверку наличия индикатора_2 из OnInit в OnCalculate. Если такого нет, то return.
К сожалению такой вариант не подходит.
Индиктор_1 создает много своих графических элементов, и пресечь его появление или разрешить ему работать гораздо проще один раз при инициализации, чем в ходе работы.
 
satorifx:
К сожалению такой вариант не подходит.
Индиктор_1 создает много своих графических элементов, и пресечь его появление или разрешить ему работать гораздо проще один раз при инициализации, чем в ходе работы.
Говорили, что "... Но тут проблема: Индикатор_1 ничего не отображает (просто рассчитывает, что надо, и сигналит, когда надо) ...". Все равно решения есть, и их много. Например, объединить индикаторы в один. Есть более сложный вариант: проанализировать файл профиля.
 
Mislaid:
Говорили, что "... Но тут проблема: Индикатор_1 ничего не отображает (просто рассчитывает, что надо, и сигналит, когда надо) ...". Все равно решения есть, и их много. Например, объединить индикаторы в один. Есть более сложный вариант: проанализировать файл профиля.

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

А насчет профиля, что вы имеете ввиду? Просто не совсем понимаю, о чем речь и с чем это едят.