Порционное вычисление в индикаторе

 

Приветствую всех!

У меня вопрос следующий.

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

При запуске на всей истории, естественно создается  впечатление "зависания" терминала. Если ограничить вычисление сотней баров, то рассчитывает секунд за 15.

Вопрос. Как произвести "отложенный" или "порционный" расчет для индикатора чтобы первый запуск OnCalculate не приводил к "зависанию".

Скажем, порция 10 баров и OnCalculate обсчитывает при каждом вызове не только изменившийся бар но и не просчитанные бары вглубь истории по 10 баров.

 То есть, реализовать это, в принципе не сложно, но тут есть нюансы:

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

2. На время weekend конечно можно зарядить таймер OnTimer для вызова OnCalculate... наверное... но... как эта каша будет себя вести при вызове из торгового робота? Кушать ресурсы системы... Непрактично.

 Может кто сталкивался с подобной проблемой, пните в нужную сторону для размышлений. 

 
elugovoy:

Приветствую всех!

У меня вопрос следующий.

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

При запуске на всей истории, естественно создается  впечатление "зависания" терминала. Если ограничить вычисление сотней баров, то рассчитывает секунд за 15.

Вопрос. Как произвести "отложенный" или "порционный" расчет для индикатора чтобы первый запуск OnCalculate не приводил к "зависанию".

Скажем, порция 10 баров и OnCalculate обсчитывает при каждом вызове не только изменившийся бар но и не просчитанные бары вглубь истории по 10 баров.

 То есть, реализовать это, в принципе не сложно, но тут есть нюансы:

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

2. На время weekend конечно можно зарядить таймер OnTimer для вызова OnCalculate... наверное... но... как эта каша будет себя вести при вызове из торгового робота? Кушать ресурсы системы... Непрактично.

 Может кто сталкивался с подобной проблемой, пните в нужную сторону для размышлений. 

1. На каждом баре может быть очень много вызовов OnCalculate(). Поэтому нужно вставить проверку - появился ли новый бар, и если появился новый бар, то только в таком случае выполнять код в OnCalculate().

  1. Принципы экономного пересчета индикаторов
  2. Обработчик события "новый бар"

 

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

Забыл уточнить, проверка по времени бара есть. Так что пересчет ведется только 1 раз в начале формирования бара (Open).

Вместо статической локальной datetime использую по-старинке просто глобальную переменную datetime.

Но вопрос "первого запуска" все равно остается открытым...

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

Значение это известно по закрытию предыдущего бара, только выводится на открытии нового "текущего".

 
elugovoy:

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

Забыл уточнить, проверка по времени бара есть. Так что пересчет ведется только 1 раз в начале формирования бара (Open).

Вместо статической локальной datetime использую по-старинке просто глобальную переменную datetime.

Но вопрос "первого запуска" все равно остается открытым...

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

Значение это известно по закрытию предыдущего бара, только выводится на открытии нового "текущего".

А может стоит перевести расчеты в MQL5 и убрать обращение к базе данных?
 

Весь анализ производится на уровне БД в 4 этапа по историческим данным. Объемы достаточно большие, поэтому производительность системы в целом имеет важное место. 

Не вижу экономического эффекта от перехода на MQL5.

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

Хочется сделать все культурно, без особых извращений.

На данный момент 70% определяет верно. Напишу робот для бэктеста, там уж по профит фактору можно ориентироваться будет и оптимизировать.

 

Насчет работы в выходные.

Нужно использовать OnTimer() плюс проверка по дням недели:

//--- если выходной, то сигнал не нужен.
   MqlDateTime dt_struct_tm;
   TimeToStruct(TimeLocal(),dt_struct_tm);
   if(dt_struct_tm.day_of_week==6 || dt_struct_tm.day_of_week==0) return; // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
 

Да, видимо так и придется делать...

Спасибо. 

 
barabashkakvn:

Насчет работы в выходные.

Что бывают рабочие выходные и наоборот, в голову не приходило?))

 
pronych:

Что бывают рабочие выходные и наоборот, в голову не приходило?))

Для справки: в выходные терминал используется для аналитики и поэтому в выходные дни необходима реализация замены OnCalculate.
И не путайте выходные (уточняю что это суббота и воскресенье) и праздники.
 
barabashkakvn:
Для справки: в выходные терминал используется для аналитики и поэтому в выходные дни необходима реализация замены OnCalculate.
И не путайте выходные (уточняю что это суббота и воскресенье) и праздники.

Ни че не понял. Я-то как раз не путаю.

Как будто  праздники  не случаются по будням, а в выходные не бывает рабочих дней.

 Не подсовывайте людям лажовый путь... Не к тому надо привязываться. Оставьте его для своих клиентов.

 
А как вообще можно программно определить, что сейчас выходные или праздники (кроме анализа даты и отсутствия тиков)?
Причина обращения: