Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Хочешь стать известным разработчиком? Выполняй заказы трейдеров в сервисе Фриланс!
Eugeniy Lugovoy
1968
Eugeniy Lugovoy 2014.04.13 10:59 

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

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

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

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

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

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

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

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

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

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

Vladimir Karputov
Модератор
42314
Vladimir Karputov 2014.04.13 11:12  
elugovoy:

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

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

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

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

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

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

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

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

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

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

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

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

Eugeniy Lugovoy
1968
Eugeniy Lugovoy 2014.04.13 11:37  

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

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

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

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

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

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

Vladimir Karputov
Модератор
42314
Vladimir Karputov 2014.04.13 11:44  
elugovoy:

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

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

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

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

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

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

А может стоит перевести расчеты в MQL5 и убрать обращение к базе данных?
Eugeniy Lugovoy
1968
Eugeniy Lugovoy 2014.04.13 12:25  

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

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

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

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

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

Vladimir Karputov
Модератор
42314
Vladimir Karputov 2014.04.13 12:36  

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

Нужно использовать 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-суббота)
Eugeniy Lugovoy
1968
Eugeniy Lugovoy 2014.04.13 14:28  

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

Спасибо. 

Aleksey
2438
Aleksey 2014.04.13 16:07  
barabashkakvn:

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

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

Vladimir Karputov
Модератор
42314
Vladimir Karputov 2014.04.13 16:12  
pronych:

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

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

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

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

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

Artem Temnikov
1024
Artem Temnikov 2014.04.13 17:19  
А как вообще можно программно определить, что сейчас выходные или праздники (кроме анализа даты и отсутствия тиков)?
/ /123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий