Вопрос программистам - порядок вызова спецфункций

 

В процессе отладки эксперта встал такой вопрос.

Предположим, у нас есть индикатор и советник, присоединенные к некоему графику. В каком порядке загружаются их функции init, start, deinit:


- при старте терминала (init, start)

- по приходу нового тика (start)

- по закрытии терминала (deinit)


Для пояснения сути вопроса частный случай. Индикатор выставил в функции start знчение глобальной переменной терминала. Будет ли ее новой значение доступно в функции start советника, отработавшего тот же тик? (другими словами, что отработает раньше, индикатор или советник?)

 

Мне всегда было интересно, зачем задавать такие вопросы?

Ну поставьте в нужные Вам места вывод в консоль терминала Print() и наблюдайте. И Вы точно будете знать ответ на Ваш вопрос.

 
falkov >>:

Мне всегда было интересно, зачем задавать такие вопросы?

Ну поставьте в нужные Вам места вывод в консоль терминала Print() и наблюдайте. И Вы точно будете знать ответ на Ваш вопрос.

Может у человека времени нет на эксперименты. Бывает...

По моему, эксперт с новым тиком опрашивается после индикаторов. Хотя, он и работает в своём потоке.

Из шаблона эксперт загружается после индикаторов.

Если эксперт зациклен, надо делать проверку на изменение глобальной переменной.

 
falkov >>:

Мне всегда было интересно, зачем задавать такие вопросы?

Ну поставьте в нужные Вам места вывод в консоль терминала Print() и наблюдайте. И Вы точно будете знать ответ на Ваш вопрос.

а мне лень. но по ходу придется.

 
Zhunko >>:

Хотя, он и работает в своём потоке.

Собственно, потому и спрашиваю конкретно у разработчиков - порядок вызова детерминирован логикой терминала или зависит от каких-то факторов?

 

Ну, раз лень, придется помочь :)

Сегодня вечером попробую

 

Специально для ленивых :)

Это индикатор:

//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 был прав.

 
Т.е. пока не выполнится расчет по всем индикаторам, всё висит? Ну а если один из индикаторов считается медленно, но его значение не нужно на каждом тике ? Да и на 30 следующих тиках можно использовать предыдущее значение. Есть ли способ выделить определенные ресурсы этому тормозу и разрешить ему считать в свободное от остальной работы время? И продолжать крутить советника на каждом тике не тормозя его работу.
 

Спасибо большое.

Но вопрос все же разрешен не до конца. Поясню. Пусть в теле функции start индикатора alsuIndic (все-таки приятно, когда в честь тебя что-то называют:) происходят сложные вычисления (например, обсчитывается комитет нейросетей). Из приведенного вами труда следует неоспоримый факт, что эксперт вызовет свой start после индикатора. Но будет ли он, работая в отдельном потоке, дожидаться завершения работы start индикатора, работающего в потоке терминала? Каким образом оргаизована синхронизация потоков - напрямую через контроль запуска функций, при помощи таймера или как-то еще? Согласитесь, для приведенного мной примера это важно. 

 

Для начала прочитайте Справочник MQL4/Выполнение программ, там говорится о 2,5 сек.

Если Ваш код выполняется дОльше, то можно организовать обработку во внешней программе или здесь же, но использовать систему флагов готовности.

На мой взгляд, 80% "веса" тяжелых индикаторов/скриптов/советников начинающих программеров можно убрать оптимизацией кода. (Тем самым я ни в коей мере не хочу бросить на Вас тень. Просто, к слову пришлось:)

Ну, и не надо забывать о IndicatorCounted() - он специально изготовлен для того, чтобы считать тяжелые индикаторы


Что касается системы синхронизации потоков, то, Вы правы, здесь лучше всего спросить у разработчиков.


С уважением, и т.д.

 
falkov >>:

Для начала прочитайте Справочник MQL4/Выполнение программ, там говорится о 2,5 сек.

Если Ваш код выполняется дОльше, то можно организовать обработку во внешней программе или здесь же, но использовать систему флагов готовности.

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

Ну, и не надо забывать о IndicatorCounted() - он специально изготовлен для того, чтобы считать тяжелые индикаторы

Выполнение функции deinit() ограничивается 2.5 секундами.

Это не имеет ничего общего со временем счета индикатора. Только при завершении работы. Или у вас другая документация? 

Каким образом IndicatorCounted() может помочь считать тяжелые индикаторы?

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