Порядок обработки функций OnChartEvent и OnCalculate

 

Столкнулся со следующей проблемой.

В Индикаторе работают две функции OnChartEvent и OnCalculate. Если отключена функция OnChartEven, код в функции  OnCalculate работает как было задумано.

Если же включаем отработку событий в функции OnChartEven, то перестает отрабатываться код в функции  OnCalculate.

Просьба ответить, кто знает, почему такое происходит.

У меня пока появилась одна идея. Код из функции OnCalculate поместить и в функцию OnChartEven. Но предполагаю, что могут при этом происходить какие-то непредвиденные действия программы.

Какой порядок отработки функций OnChartEvent и OnCalculate при совместном их использовании в программе?

 
Eugeni Neumoin:
Столкнулся со следующей проблемой.
В Индикаторе работают две функции OnChartEvent и OnCalculate. Если отключена функция OnChartEven, код в функции  OnCalculate работает как было задумано.
Если же включаем отработку событий в функции OnChartEven, то перестает отрабатываться код в функции  OnCalculate.
Просьба ответить, кто знает, почему такое происходит.
У меня пока появилась одна идея. Код из функции OnCalculate поместить и в функцию OnChartEven. Но предполагаю, что могут при этом происходить какие-то непредвиденные действия программы.
Какой порядок отработки функций OnChartEvent и OnCalculate при совместном их использовании в программе?

для проверки порядка выполнения функций использую примерно такие тесты:

bool чарт=true, кальк=true;

... OnChartEvent(....)
{
  if(чарт)
  {
    Alert("чарт");
    чарт=false;
  }
}

... OnChartCalculate(....)
{
  if(кальк)
  {
    Alert("кальк");
    кальк=false;
  }
}

Зачем в индикаторе OnChartEvent - ведь это обработка нажатия клавиш, клик и перемещение мыши, создание и удаление объектов, ...

 
Eugeni Neumoin:

Какой порядок отработки функций OnChartEvent и OnCalculate при совместном их использовании в программе?

Порядок их выполнения не может быть указан, т.к. это обработчики событий. Раньше выполнится тот обработчик, событие по которому произойдет ранее. Может быть так, что выполнится 10 OnChartEvent и только потом придет тик, который запустит OnCalculate. А может быть и наоборот.

То, что включение/отключение указанных обработчиков как-то влияет на вызов другого обработчика, это ошибка в программе. Ищите причину в коде, а не в терминале. Или выложите весь код. Возможно, тут смогут помочь.

 
Ihor Herasko:

Порядок их выполнения не может быть указан, т.к. это обработчики событий. Раньше выполнится тот обработчик, событие по которому произойдет ранее. Может быть так, что выполнится 10 OnChartEvent и только потом придет тик, который запустит OnCalculate. А может быть и наоборот.

То, что включение/отключение указанных обработчиков как-то влияет на вызов другого обработчика, это ошибка в программе. Ищите причину в коде, а не в терминале. Или выложите весь код. Возможно, тут смогут помочь.

Код около 40 000 строк.

Разберусь.

Спасибо за ответы.

STARIJ можете посмотреть, зачем там обработчик событий: https://www.mql5.com/ru/market/product/19758

А здесь описана маленькая часть функционала с использованием обработчика событий https://www.mql5.com/ru/articles/2990

Технический индикатор Zup Universal ZigZag with Pesavento Patterns
Технический индикатор Zup Universal ZigZag with Pesavento Patterns
  • отзывов: 2
  • 2016.12.28
  • Eugeni Neumoin
  • www.mql5.com
В основе ZUP лежат две идеи. Идея 1 - объединить в одном индикаторе множество различных вариантов поиска экстремумов (минимумов и максимумов) на ценовых графиках рынков. Идея 2 - сделать возможным легкую привязку различных графических инструментов, позволяющих анализировать поведение рынка, к выявленным экстремумам. Для реализации первой идеи...
 
Eugeni Neumoin:

Если же включаем отработку событий в функции OnChartEven, то перестает отрабатываться код в функции  OnCalculate.

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

 
Taras Slobodyanik:

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

Мне кажется, когда одно событие обрабатывается - второе стоит в очереди.
 
STARIJ:
Мне кажется, когда одно событие обрабатывается - второе стоит в очереди.

ок, протелепатирую иначе)

Одно событие изменяет объекты под себя, а второе событие - под себя.

 

В электронике такой процесс называли гонками.

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

В военном оборудовании для устранения гонок приходилось менять блоки.

А здесь придется экспериментально искать выход из сложившейся ситуации.

 
Eugeni Neumoin:
  • Идея 1 - объединить в одном индикаторе множество различных вариантов поиска экстремумов (минимумов и максимумов) на ценовых графиках рынков.
  • Идея 2 - сделать возможным легкую привязку различных графических инструментов, позволяющих анализировать поведение рынка, к выявленным экстремумам.

Функции в OnChartEvent работают только с иконками и отображением объектов, т.е. только с функционалом идеи 2?

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

 
Evgeny Galikhin:

Функции в OnChartEvent работают только с иконками и отображением объектов, т.е. только с функционалом идеи 2?

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

В чартевент логика расчёта зигзагов не затрагивается
 
Eugeni Neumoin:
В чартевент логика расчёта зигзагов не затрагивается

А почему вы решили, что OnCalculate именно перестает работать? Может он работает но не так как задумывалось, из-за определенных настроек панели управления?

Если в OnCalculate поставить какой-нибудь принт или алерт, то они не исполняются?

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    Print("asdfadsf");
Причина обращения: