грабли в init() - страница 2

 
Figar0:

Может стоит провериться - IsConnected()?

Если эксперт уже висел на чарте, а терминал только запущен, могло не успеть пройти соединение с сервером и как следовательно рыночное окружение не прогрузилось?

Хорошая мысль. Надо попробовать.
...
Попробовал. Выяснилось, что в момент запроса, действительно, коннект отсутствует.
 
vimac:
Figar0:

Может стоит провериться - IsConnected()?

Если эксперт уже висел на чарте, а терминал только запущен, могло не успеть пройти соединение с сервером и как следовательно рыночное окружение не прогрузилось?

Хорошая мысль. Надо попробовать.

Судя по всему, именно это и произошло. Насколько я знаю, до некоторых пор были жёствие ограничения на использование переменных окружения в init(). Но с некоторых пор эта проблема снята. В ините доступна вся информация, пришедшая с последним тиком (разумеется, если терминал уже соединился с сервером и тик пришёл). Более точно лучше выяснить у разработчиков.
 
В общем, самый простое, что смог придумать - прописал ручками значения TICKVALUE для каждой из 16 необходимых валютных пар в init(), после чего производятся необходимые вычисления.

Но вопрос к разработчикам остается. Здесь просматривается какая-то недоработочка.
 

Вот из документации ( МЕ - Справочник MQL4 - Выполнение программ ):

Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init() присоединенного к графику советника или пользовательского индикатора запускается также сразу после старта клиентского терминала и подгрузки (это касается только советников и не касается индикаторов) исторических данных, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора.

 
Вот в самом низу третьей странички - объяснение и мое решение проблемы 'Тестирование функции IsConnected()'
 

В индикаторе функция init() вызывается в любом случае даже если нет рыночного окружения. Индикатор ведь надо рисовать "здесь и сейчас", а не ждать подключения и закачки всех данных. То есть, в функции init() из кастомного индикатора(!) нельзя обращаться/доверять к рыночному окружению.


В отличие от индикатора, функция init() эксперта(!) гарантированно вызывается при наличии всего полного рыночного окружения. Функция init() у эксперта вызывается не в момент прикрепления эксперта к графику, а после прихода первого ценового тика.

 
Renat:

То есть, в функции init() из кастомного индикатора(!) нельзя обращаться/доверять к рыночному окружению.

Это уже хорошо - теперь понятно где лежат грабли. Один единственный вопрос остался: как правильно определить момент когда в терминале есть полностью сформированное, закачанное и т.д. и т.п. "рыночное окружение" и терминал больше уже ничего не будет делать до прихода очередного тика? Если можно - просто кусочек кода вместо моего ("пока не получим все данные - ничего не делаем").
 

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

 
Renat писал (а) >>

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

Я имел в виду грабли для программистов, которые не понимали этой специфики.

А по поводу прихода тика - это немного не то, что хотелось. Ситуация следующая: стартует терминал, идет подключение к счету. В этот момент индикатор уже может начинать рисовать себя - а не хочется. Этот момент при старте терминала отлавливается проверкой

AccountNumber()<=0

но я не уверен что это сработает при смене счета :(

Второй момент: соединились с ДЦ - терминал начинает заливать недостающие в истории бары. Как узнать что приехали уже все и следующий будет только с новым тиком, а не то, что это просто модем "залип" и не конект просто "висит"?

Ведь если закачка истории закончена, инициализации все проведены, а следующий тик, например ночью, придет только через 5 минут?! - зачем же столько ждать?

Ну ведь должнен же терминал "знать что ему уже ничего не надо", и он просто ждет очередного тика. Мне бы хотелось поймать именно эту ситуацию.

Я понимаю, что индикатор сможет перерисоваться только при приходе нового тика. В таком случае решение моей проблемы - это отловить момент когда старт или инит отрабатывают закачку самого последнего бита ;) недостающей истории. Как бы мне узнать что старт или инит "дернули" последний раз и следующий раз будет уже на новом тике?

Может добавить вызов встроенной функции, чтото типа "InitFinished()"? Тогда мне не нужно никаких проверок - терминал сам меня дернет ;)

 
Itso писал (а) >>
MarketInfo не работает хорошо в init. Решение - проверяйте значение на первом тике.

MarketInfo бывает не работает и в теле советника, и с конектом все в порядке... торговый сервер ДЦ не выдает данные...

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