handle тормоз - страница 2

 
x_trader:
Буду думать, спасибо. У меня то если я хэндлы убираю все работает, а если ставлю то советник стоит до бесконечности, а не 3 минуты )))  с удовольствием бы плюнул)
В первом посте была фраза "Уже три хэндла у меня занимают минуты 3". До бесконечности не должно быть. Если не идет подгрузка истории (что может занять продолжительное время), то может быть и в вашем коде ошибка. Раз используются стандартные индюки, выложите исходники с тест-кейсом.
 
marketeer:
В первом посте была фраза "Уже три хэндла у меня занимают минуты 3". До бесконечности не должно быть. Если не идет подгрузка истории (что может занять продолжительное время), то может быть и в вашем коде ошибка. Раз используются стандартные индюки, выложите исходники с тест-кейсом.

Да была фраза. И не должно быть). Но я хоть за последние два дня приблизился к тому месту, где это происходит. Пошагово вычислял))) Задолбало же, значит надо найти. 

 Буфер для отображения заполняется данными по индексу i . Из за хэндла разумеется баров видит 575 000 .  Сразу за внесением данных в буфер ставлю условие

 if (i>0)

        Print(i); Все печатается. 

 if (i>50)  Print(i); Все печатается.  

 i> 500 начинает задумываться немного, потом только печатает результат. i>3000 ощутимо стоит секунд 10.  i>300000 все ... стоит до бесконечности. Не печатает больше. Загрузка цп есть, но ждать можно бесконечности, это как раз из-за этого эффекта советник у меня стоял а я не мог понять, почему он вроде как не может загрузить валютную пару. Пару он видимо загрузил а с 500000 барами почему-то зависает до бесконечности. 

Видимо вы правы, мне надо уменьшить просто количество данных заносимые уже в мой буфер. Потому как barscalculated хоть и все данные подготавливает, но это не они зависали.  

Пока писал, он все же начал печатать i после 300000. Но это очень долго было минут 10 не меньше.  А у меня он не один такой буфер)))

 

x_trader:

i>3000 ощутимо стоит секунд 10.

На 3000 баров 10 секунд? Или у вас там очень тяжелая зверюга, или жутко неоптимальный код, или одно из двух.
 
Да не все ок с кодом и с машиной, а третий ваш вариант дублирует первые два) . Ну  с секундами я точно не замерял и напутал немного.Ок поточнее.  На 30 000 секунды 2 думает.  на 100 000 около 40 секунд. И далее по какой-то нарастающей прогрессии. Т.е. 300 000 около 10 минут. Ну может 5 может или 15 но долго короче)) а 575 000 и несколько буферов разумеется никогда не исполнятся ^D
 
x_trader:
Ну с секундами я точно не замерял и напутал немного. На 30000 секунды 2 думает. 

Я уже второй, кто предлагает поставить точный диагноз, оказывается. Не хотите выкладывать, дело ваше, без кода вряд ли кто-то посоветует что-то лучшее, чем уменьшить глубину баров в настройках.

_________

Ого, вот это прогрессия. Что-то не так, почти однозначно, почти ни одному индюку не надо 50000 баров чтобы рассчитать значение для одного бара.

По хорошему прогрессия должна быть почти линейной.

 

x_trader:

Уже три хэндла у меня занимают минуты 3. Как ограничить количество баров для расчета, чтобы улучшить время, но все же получить данные))) для меня загадка. 

Приведите полный код, пожалуйста.

Может снова окажется, что человек на каждый тик создает и уничтожает индикатор, называя все это словом хендл.

 
TheXpert:

Я уже второй, кто предлагает поставить точный диагноз, оказывается. Не хотите выкладывать, дело ваше, без кода вряд ли кто-то посоветует что-то лучшее, чем уменьшить глубину баров в настройках.

_________

Ого, вот это прогрессия. Что-то не так, почти однозначно, почти ни одному индюку не надо 50000 баров чтобы рассчитать значение для одного бара.

По хорошему прогрессия должна быть почти линейной.

Правильно. Это помогло для индикатора. Для советника количество баров в окне не уменьшить. Он когда смотрит в историю не видит ограничения окна. Поэтому там все бары. Используя этот же индикатор советник загибался. 

 

В общем ниче экстраординарного. С кодом все ок. Никто ничего не создает и не уничтожает тут же. Хэнлы в ините. Просто не сошлись логиками с программной оболочкой. 

Был индикатор. Рисовал три линии. Три буфера. Чтобы можно было посмотреть в любом участке истории данные индикатора в буфера копировались все доступные данные. rates_total .

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

Советник вызывая индикатор передавал rates total 570 000 и все алгоритмы с вызывающими процедурами просто стали долго работать видимо. Тут же вся злость упала на хэндл так как он все бары подготавливает и нет возможности их урезать. Затем я пошагово стал разбираться, что конкретно мешает работать, оказалось что все хэндлы и проверка на подготовку баров к работе работает хорошо.

А количество баров для заполнения буферов можно уменьшить раз так напрягает это компьютер.  

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

 

 

 
marketeer:
Это где написано? Мне сегодня пришлось как раз перенести инициализацию хендлов из OnInit в OnTick. Работает без проблем.

Это имеет смысл делать только если на каждом тике необходимо создать УНИКАЛЬНУЮ копию индюка с УНИКАЛЬНЫМИ параметрами и свойствами.

 
Interesting:

Это имеет смысл делать только если на каждом тике необходимо создать УНИКАЛЬНУЮ копию индюка с УНИКАЛЬНЫМИ параметрами и свойствами.

Неверно. Причины могут быть разными. Я спрашивал про другое. Цитирую ваше утверждение еще раз: Очень частой ошибкой многих новичков становится "привязка" индикатора к хендлу в обработчике OnTick()... Подобная схема является серьезной ошибкой и может привести к очень большим проблемам. В чем ошибка и какие проблемы?
 
marketeer:
Неверно. Причины могут быть разными. Я спрашивал про другое. Цитирую ваше утверждение еще раз: Очень частой ошибкой многих новичков становится "привязка" индикатора к хендлу в обработчике OnTick()... Подобная схема является серьезной ошибкой и может привести к очень большим проблемам. В чем ошибка и какие проблемы?

1. Я не утверждал что причина одна, их действительно может быть много. Но, создание новой копии индюка (с теме же параметрами) на мой взгляд достаточно распространенная ошибка. При этом по моему мнению (да наверное и по мнению разработчиков) она достаточно ГРУБАЯ и СЕРЬЕЗНАЯ.

Если Вы считаете, что я не прав, хочется услышать аргументы.

2. Я также не утверждал что инициализацию индикатора невозможно произвести на каждом тике. Вопрос в том насколько это эффективно. Если кто-то полагает что такие действия являются эффективными то пусть применяет такой подход. Но уверяю Вас что существует очень ограниченное число причин из-за которых подобную схему стоит организовывать. Эти причины буквально можно пересчитать по пальцам (я бы даже сказал по пальцам одной руки).

3. Я выделяю три основные "схемы инициализации" индикаторов:

а) копия индикатра создается в момент инициализации советника и уничтожается в момент его деинициализации. При этом инициализация может проводиться с учетом действий пользователя (смена ТФ и прочее) или без них;

б) инициализация в зависимости от текущей рыночной ситуации и конкретной логики МТС. Например одни индикаторы применяются в тренде, а другие при флете;

в) инициализация копии индюка с НОВЫМИ параметрами.

Две последних схемы действительно могут быть реализованы в ходе обработки нового тика или по таймеру, но тут есть своя логика и свои узкие места.

4. Говоря о возможных проблемах давайте вспомним все то что происходит в момент инициализации индюка и связки его копии с конкретным хендлом (на примере хотя бы стандартных индюков из поставки МТ5). Сколько по Вашему мнению нужно чтобы подготовить данные по таким всем известным и часто используемым индюкам как: MA, RSI, Stoch, CCI, Фракталы? Сколько времени в среднем нужно чтобы после выполнения iCustom к буферам индюка можно было получит БЕЗПРОБЛЕМНЫЙ доступ?

И наконец - давайте определимся сколько в среднем времени между тиками скажем по паре EURUSD?

5. Теперь представим себе что система мультивалютна, и торговля происходит этак по 10-12 инструментам. Насколько будет эффективно создавать новую копию индюка ДЛЯ каждой пары на новом тике?