Форум » Консультации по программированию » Cинхронизация индикаторов » Ответить

Cинхронизация индикаторов

Genry: Прочел небольшое обсуждение по теме, решил перенести часть сюда - может пригодится кому.

Ответов - 2

Genry: Aвтор IE67: У меня возникла необходимость передавать данные из одного индикатора в другой. Собственно с передачей данных проблем нет, можно передавать через глобальные переменные или другим способом, а вот с синхронизацией все туманно. Может кто знает: 1. В каком порядке производится расчет нескольких индикаторов, прикрепленных к одному графику? 2. В какой момент и в каком порядке изменяется размер индикаторных буферов? В чем суть проблемы: есть один индикатор (ведущий), который выполняет расчет (на каждой свече или каждом тике, в данном случае это неважно). Есть пара ведомых индикаторов, которые должны принять данные расчета и отобразить. Как обеспечить, чтобы индикаторы считались в нужном порядке, т.е. сначала ведущий, потом ведомые? Вопрос именно в порядке вызова индикаторов. Индикаторы выполняются в одном (интерфейсном) потоке. При поступлении тика терминал должен вызвать OnCalculate() последовательно для каждого индикатора. Основной вопрос - в каком порядке? По именам, по номерам подокон или еще как-то? QJ: Вы сделайте вывод в лог у каждого индикатора и посмотрите порядок. После перезапустите терминал и по новому, а затем ищите закономерность. ie67: Проведенные эксперименты прояснили следующее: 1. Индикаторные буфера изменяют свой размер для разных индикаторов с разной задержкой относительно времени прихода тика, задержка сильно варьируется и зависит от объема кода в каждом индикаторе. Т.е. исполнительная подсистема терминала работает с каждым индикатором отдельно. Пришел тик, OnCalculate у некоторых индикаторов уже отработало, а некоторые еще с предыдущим размером буферов. 2. В зависимости от объема кода, индикатор может пропустить один или несколько тиков. Соответственно идея с выстраиваиванием индикаторов в некую цепочку работать не будет. Решение с синхронизацией получилось следующим: 1. Ведущий индикатор начинает расчет в стартовой точке, например по первому тику на новой свече. После расчета генерит событие EventChartCustom. 2. Каждый ведомый индикатор получает свои данные при первом вызове OnCalculate при наличии флага, взведенного событием OnChartEvent, и сбрасывает флаг. Может, кому-то пригодится...

Scriptong: Если у автора так и остался путь передачи данных через глобальные переменные, то это огромный минус его системе. Зачем вообще использовать глобальные переменные терминала для таких целей? Это прошлый век. В МТ4 и МТ5 есть события, по которым и нужно передавать данные. То есть сигнализировать о передаче данных при помощи событий смог, а передать данные по этому же событию - нет? Очень странно...



полная версия страницы