Теория ускорения работы советника при использовании пользовательского индикатора (функция - iCustom) - страница 2

 
komposter:

А если индикатор 5-тибуферный, то первый же вызов iCustom рассчитает все буферы, последующие вызовы и запросы других буферов будут только читать готовую информацию (вплоть до появления новых данных для расчета).

Т.е. если индикатор хоть раз вызывался программой, то она получила информацию не только о запрашиваемом буфере, но и о всех, входящих в индикатор? Или речь о том, что расчет других буферов будет найден в памяти и за счет этого не будет происходить перерасчет - данные подтянутся из ОЗУ, если даже явно не были ранее вызваны программой (программа (советник) не выделяла память явно для хранения данных с индикатора). Раньше читал, что при каждом обращении к индикатору происходит его перерасчет - выходит дело это не так?

komposter:
 

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

Но в 95% случаев в этом всем нет необходимости, тестер и так достаточно быстрый, а в 5-ке можно еще и облако подключить.

Удачи! 

Разве чтение с винчестера будет быстрей, или вы делали виртуальный диск в памяти с рассчитанными данными индикатора?

Ну а пятерка мне только снится, пока только реализую идеи под заказ на четверке.

Спасибо за пожелание удачи!

 
komposter:

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

Но в 95% случаев в этом всем нет необходимости, тестер и так достаточно быстрый, а в 5-ке можно еще и облако подключить.

Удачи! 

Не про индикатор, а про советник, но тема близкая. У меня скальпер довольно много считает, всякие фильтры, преобразования. Я для модели в Матлабе сразу сделал такой кеш, сначала считалась вся математика и скидывалась в .mat файл, а потом уже по этим данным прогонялась стратегия. Вот сейчас руки чешутся сделать то же для тестера MQL4, а то оптимизацию проводить просто нереально.
 
-Aleks-:

Т.е. если индикатор хоть раз вызывался программой, то она получила информацию не только о запрашиваемом буфере, но и о всех, входящих в индикатор? Или речь о том, что расчет других буферов будет найден в памяти и за счет этого не будет происходить перерасчет - данные подтянутся из ОЗУ, если даже явно не были ранее вызваны программой (программа (советник) не выделяла память явно для хранения данных с индикатора). Раньше читал, что при каждом обращении к индикатору происходит его перерасчет - выходит дело это не так?

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

Перерасчет происходит при каждом вызове, но пересчитывается обычно только 0-й бар. А если еще и советник написан грамотно, то и вызовы эти происходят не на каждом тике.

 

-Aleks-:

Разве чтение с винчестера будет быстрей, или вы делали виртуальный диск в памяти с рассчитанными данными индикатора?

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

Вряд ли есть универсальное решение для любого индикатора, нужно отталкиваться от глобальной задачи.

 

-Aleks-:

Ну а пятерка мне только снится, пока только реализую идеи под заказ на четверке.

А это зря, сейчас можно писать код для обоих платформ в одном файле, различия только в торговой части и в работе с тайм-сериями (в т.ч. индикаторами).

А клауд - это действительно мощная штука. 

 
VDev:
Не про индикатор, а про советник, но тема близкая. У меня скальпер довольно много считает, всякие фильтры, преобразования. Я для модели в Матлабе сразу сделал такой кеш, сначала считалась вся математика и скидывалась в .mat файл, а потом уже по этим данным прогонялась стратегия. Вот сейчас руки чешутся сделать то же для тестера MQL4, а то оптимизацию проводить просто нереально.

Вряд ли есть смысл в кэше под отдельный индикатор, я тоже отталкивался именно от данных, необходимых в советнике.

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

 
komposter:

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

Перерасчет происходит при каждом вызове, но пересчитывается обычно только 0-й бар. А если еще и советник написан грамотно, то и вызовы эти происходят не на каждом тике.

Так в итоге получается, что если обращаться к одному индикатору, в котором много буферов и получать информацию из одного из них обо всех, то это будет быстрей и экономичней по памяти, чем рассчитывать столько же раз этот индикатор, сколько требуется информации с разных его буферов?


И всё же, может кто-то проведет эксперимент, а то идея меня не отпускает!? Или исследование инноваций интересно только за вознаграждение?

 
OnCalculate() индикатора вызывается только при первом вызове iCustom() на новой цене. При последующих вызовах iCustom() идет только получение данных без запуска функции OnCalculate(). Допустим, цена меняется, очередной вызов iCustom() запускает onCalculate(), последующие только данные получают, и так, до тех пор, пока цена не изменится и т.д. (проверено экспериментально прямо сейчас).
 
-Aleks-:

Так в итоге получается, что если обращаться к одному индикатору, в котором много буферов и получать информацию из одного из них обо всех, то это будет быстрей и экономичней по памяти, чем рассчитывать столько же раз этот индикатор, сколько требуется информации с разных его буферов?

1 индикатор на 5 буферов или 5 индикаторов на 1 буфер - примерно то же самое.
Если нужна информация только из 2-х буферов, будет выгоднее вызывать 2 индикатора с 1 буфером, чем один индикатор с 5 буферами. Но не выгоднее, чем один индикатор с 2 буферами.


-Aleks-:

И всё же, может кто-то проведет эксперимент, а то идея меня не отпускает!? Или исследование инноваций интересно только за вознаграждение?

 komposter:

Такой подход уменьшит потребление индикатором памяти (примерно кратно разнице в кол-ве буферов до и после), но увеличит нагрузку на процессор (и "сборку" и "разложение" надо постоянно делать).

Если не упираетесь в лимит памяти (а это вряд ли с текущими объемами), будет только замедление.

 

Ощущение такое, что меня не понимают! :)

Но я понимаю, что вероятней всего это я не понимаю.

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

Вопрос: индикатор будет рассчитан два раза или только один раз? 

 
-Aleks-:

...

Вопрос индикатор будет рассчитан два раза или только один раз? 

Один раз.
 
Integer:
Один раз.
Значит солянка из нужных индикаторов будет работать быстрей, чем использование индикаторов по отдельности - так меньше раз будет запрошена информация о котировках?
Причина обращения: