Мне всегда было интересно, зачем задавать такие вопросы?
Ну поставьте в нужные Вам места вывод в консоль терминала Print() и наблюдайте. И Вы точно будете знать ответ на Ваш вопрос.
Может у человека времени нет на эксперименты. Бывает...
По моему, эксперт с новым тиком опрашивается после индикаторов. Хотя, он и работает в своём потоке.
Из шаблона эксперт загружается после индикаторов.
Если эксперт зациклен, надо делать проверку на изменение глобальной переменной.
Ну, раз лень, придется помочь :)
Сегодня вечером попробую
Специально для ленивых :)
Это индикатор:
//alsuIndic.mq4 #property indicator_separate_window int init() { if(GlobalVariableSet("gAlsu",500)==0) { Print("Ошибка при записи gAlsu=500"); return(false); } Print("AlsuIndic.Init.gAlsu="+GlobalVariableGet("gAlsu")); return(0); } //----------------------------------------------------------------------------- int start() { if(GlobalVariableSet("gAlsu",600)==0) { Print("Ошибка при записи gAlsu=600"); return(false); } Print("AlsuIndic.Start.gAlsu="+GlobalVariableGet("gAlsu")); return(0); } //----------------------------------------------------------------------------- int deinit() { if(GlobalVariableSet("gAlsu",700)==0) { Print("Ошибка при записи gAlsu=700"); return(false); } Print("AlsuIndic.Deinit.gAlsu="+GlobalVariableGet("gAlsu")); return(0); } //-----------------------------------------------------------------------------
Это советник:
//alsuExpert.mq4 | int init() { if(GlobalVariableSet("gAlsu",100)==0) { Print("Ошибка при записи gAlsu=100"); return(false); } Print("AlsuExpert.Init.gAlsu="+GlobalVariableGet("gAlsu")); return(0); } //----------------------------------------------------------------------------- int start() { if(GlobalVariableSet("gAlsu",200)==0) { Print("Ошибка при записи gAlsu=200"); return(false); } Print("AlsuExpert.Start.gAlsu="+GlobalVariableGet("gAlsu")); return(0); } //----------------------------------------------------------------------------- int deinit() { if(GlobalVariableSet("gAlsu",300)==0) { Print("Ошибка при записи gAlsu=300"); return(false); } Print("AlsuExpert.Deinit.gAlsu="+GlobalVariableGet("gAlsu")); return(0); } //-----------------------------------------------------------------------------
Это скрин их совместной работы:
Судя по всему вышепредставленному, сначала отрабатывается индикатор, потом эксперт.
Ну, и вроде это логично.
Так что Zhunko был прав.
Спасибо большое.
Но вопрос все же разрешен не до конца. Поясню. Пусть в теле функции start индикатора alsuIndic (все-таки приятно, когда в честь тебя что-то называют:) происходят сложные вычисления (например, обсчитывается комитет нейросетей). Из приведенного вами труда следует неоспоримый факт, что эксперт вызовет свой start после индикатора. Но будет ли он, работая в отдельном потоке, дожидаться завершения работы start индикатора, работающего в потоке терминала? Каким образом оргаизована синхронизация потоков - напрямую через контроль запуска функций, при помощи таймера или как-то еще? Согласитесь, для приведенного мной примера это важно.
Для начала прочитайте Справочник MQL4/Выполнение программ, там говорится о 2,5 сек.
Если Ваш код выполняется дОльше, то можно организовать обработку во внешней программе или здесь же, но использовать систему флагов готовности.
На мой взгляд, 80% "веса" тяжелых индикаторов/скриптов/советников начинающих программеров можно убрать оптимизацией кода. (Тем самым я ни в коей мере не хочу бросить на Вас тень. Просто, к слову пришлось:)
Ну, и не надо забывать о IndicatorCounted() - он специально изготовлен для того, чтобы считать тяжелые индикаторы
Что касается системы синхронизации потоков, то, Вы правы, здесь лучше всего спросить у разработчиков.
С уважением, и т.д.
Для начала прочитайте Справочник MQL4/Выполнение программ, там говорится о 2,5 сек.
Если Ваш код выполняется дОльше, то можно организовать обработку во внешней программе или здесь же, но использовать систему флагов готовности.
На мой взгляд, 80% "веса" тяжелых индикаторов/скриптов/советников начинающих программеров можно убрать оптимизацией кода.
Ну, и не надо забывать о IndicatorCounted() - он специально изготовлен для того, чтобы считать тяжелые индикаторы
Выполнение функции deinit() ограничивается 2.5 секундами.
Это не имеет ничего общего со временем счета индикатора. Только при завершении работы. Или у вас другая документация?
Каким образом IndicatorCounted() может помочь считать тяжелые индикаторы?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В процессе отладки эксперта встал такой вопрос.
Предположим, у нас есть индикатор и советник, присоединенные к некоему графику. В каком порядке загружаются их функции init, start, deinit:
- при старте терминала (init, start)
- по приходу нового тика (start)
- по закрытии терминала (deinit)
Для пояснения сути вопроса частный случай. Индикатор выставил в функции start знчение глобальной переменной терминала. Будет ли ее новой значение доступно в функции start советника, отработавшего тот же тик? (другими словами, что отработает раньше, индикатор или советник?)