Перфоманс тестинга на истории
Atom
22.08.2011
Mikhail Sukhov


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

Я проверял производительность на примере SampleHistoryTesting. Тесты показали (мерил через dotTrace), что основной тормоз - это генерация свечек (48% уходит на CandleManager). Ускорить алго практически невозможно, так как он ускорялся и не раз. Но есть решение - использовать уже готовые свечки. В Гидре начиная с 3.2 версии появилась возможность сжатия свечек. Схема работы для бэктестера не очень удобная, так как за раз не получится загрузить и сжать все свечки (банально не хватит памяти). Поэтому я предлагаю всем заинтересованным пользователям откликнуться на это предложение и помочь в решении проблемы.

Исходники Гидры доступны каждому, они есть в дистрибутиве. Мое предложение такое. Необходимо сделать в Гидре (авто?) компрессор сделок по большому диапазону в отдельном окне. Тоесть, для такого компрессора не нужно будет выбирать и загружать сделки, а достаточно указать дни, с какого по какой нужно сжать сделки в свечки, и дальше он начнет их сжатие, загружая день за днем.

Если откликнутся желающие (а я надеюсь что такие найдутся), то со стороны S# мы сделаем авто загрузку свечек из истории через класс CandleManager. Как итог, ускорим бэктестинг стратегий, которые требуют свечки, причем существенное ускорение.

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



Спасибо:


<< < 2 3 4 5 6  > >>
bender

Фотография
Дата: 11.10.2011
Ответить


Mikhail Sukhov

Чтобы не быть помощником, для которого требуются еще другие помощники, предлагаю зарегистрироваться на КодеПлексе и залить туда свои изменения. Логин предварительно скажите, чтобы я смог присоединить вас к проекту.


Зарегился, YuraS


Цитата:

Выкидывает исключение? Какое?

Код
	
candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(security, args.To<TimeSpan>()) as IMarketDataStorage<Candle>;

получается, candleStorage == null
Спасибо:

Mikhail Sukhov

Фотография
Дата: 12.10.2011
Ответить


bender

Код
	
candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(security, args.To<TimeSpan>()) as IMarketDataStorage<Candle>;

получается, candleStorage == null[/quote]

Код
	
candleStorage = (IMarketDataStorage<TimeFrameCandle>)storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(security, args.To<TimeSpan>());
Спасибо:

bender

Фотография
Дата: 12.10.2011
Ответить


Mikhail Sukhov

Код
	
candleStorage = (IMarketDataStorage<TimeFrameCandle>)storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(security, args.To<TimeSpan>());

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

По КодеПлексу, я правильно понимаю, что мне надо скачать последний Change Set, внести свои изменения и залить обратно? Или можно залить своё рабочее решение (оно из версии 3.2.5 переделано)?
Спасибо:

Mikhail Sukhov

Фотография
Дата: 12.10.2011
Ответить


bender
По КодеПлексу, я правильно понимаю, что мне надо скачать последний Change Set, внести свои изменения и залить обратно? Или можно залить своё рабочее решение (оно из версии 3.2.5 переделано)?


1. Слить последнюю версию.
2. Помержить с изменениями.
3. Потестить, что не отвалилось все остальное.[laugh]
4. Залить.

Вот такой нехитрый алгоритм.
Спасибо:

bender

Фотография
Дата: 12.10.2011
Ответить


Код
IMarketDataStorage<TimeFrameCandle> candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(input.Security, TimeSpan.FromMinutes(5));  

Вот такая строчка кода в последней версии выкидывает исключение
Цитата:
Отсутствует реализация метода "#=qZ54LkJX570V5vx1sz4z4Tg==" в типе "#=qZjnrk7nYv$HS6IuGzdGTyaz$pXGh_bkX5gnJpwhBozFKPUIkagMVdRegQjQZqC2r" из сборки "StockSharp.Algo, Version=4.0.2.0, Culture=neutral, PublicKeyToken=null".

В 3.2.5 нормально работало
Спасибо:

Mikhail Sukhov

Фотография
Дата: 12.10.2011
Ответить


bender
Код
IMarketDataStorage<TimeFrameCandle> candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(input.Security, TimeSpan.FromMinutes(5));  

Вот такая строчка кода в последней версии выкидывает исключение
Цитата:
Отсутствует реализация метода "#=qZ54LkJX570V5vx1sz4z4Tg==" в типе "#=qZjnrk7nYv$HS6IuGzdGTyaz$pXGh_bkX5gnJpwhBozFKPUIkagMVdRegQjQZqC2r" из сборки "StockSharp.Algo, Version=4.0.2.0, Culture=neutral, PublicKeyToken=null".

В 3.2.5 нормально работало


Что-то обфускация сглючила. Поправил новой версией.
Спасибо:

Alexander

Фотография
Дата: 13.10.2011
Ответить


bender
Код
IMarketDataStorage<TimeFrameCandle> candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(input.Security, TimeSpan.FromMinutes(5));  

Вот такая строчка кода в последней версии выкидывает исключение
Цитата:
Отсутствует реализация метода "#=qZ54LkJX570V5vx1sz4z4Tg==" в типе "#=qZjnrk7nYv$HS6IuGzdGTyaz$pXGh_bkX5gnJpwhBozFKPUIkagMVdRegQjQZqC2r" из сборки "StockSharp.Algo, Version=4.0.2.0, Culture=neutral, PublicKeyToken=null".

В 3.2.5 нормально работало


Свежая версия с codeplex помогла (changeset 10471)?
Спасибо:

bender

Фотография
Дата: 13.10.2011
Ответить


Alexander Mukhanchikov

Свежая версия с codeplex помогла (changeset 10471)?

Да, спасибо. Но теперь другая проблема вылезла, метод IMarketDataStorage(T).Delete (DateTime, DateTime) в 3.2.5 удалял только файлы свечек S# заданного типа, а сейчас (10484) удаляет каталоги за соответствующие числа целиком, со всем что в них есть. Нельзя-ли вернуть так, как было раньше?
Спасибо:

Mikhail Sukhov

Фотография
Дата: 14.10.2011
Ответить


bender
Alexander Mukhanchikov

Свежая версия с codeplex помогла (changeset 10471)?

Да, спасибо. Но теперь другая проблема вылезла, метод IMarketDataStorage(T).Delete (DateTime, DateTime) в 3.2.5 удалял только файлы свечек S# заданного типа, а сейчас (10484) удаляет каталоги за соответствующие числа целиком, со всем что в них есть. Нельзя-ли вернуть так, как было раньше?


Вот это будет проблема. Из-за рефакторинга в 3.2 не был учтен это момент. Если сейчас попытаться вернуть все в зад, то может поехать другое - определение дат, для которых есть данные. Насколько критична ошибка? Может стоит сохранять данные в разных папках?
Спасибо:

bender

Фотография
Дата: 14.10.2011
Ответить


Mikhail Sukhov
[quote=bender;12276]
Вот это будет проблема. Из-за рефакторинга в 3.2 не был учтен это момент. Если сейчас попытаться вернуть все в зад, то может поехать другое - определение дат, для которых есть данные. Насколько критична ошибка? Может стоит сохранять данные в разных папках?


Удаление в принципе нужно было для того, чтобы если пользователь формирует свечки по второму разу в тот-же каталог с налогающимся интервалом дат, то наложение надо удалить, иначе при записи дописываемые свечки дублируются, а не затирают старые( во всяком случае в 3.2 так было, как сейчас не могу пока посмотреть). В разные каталоги можно, но сейчас у меня сделано так, что отслеживание этого будет целиком лежать на пользователе.
Хотя можно конечно каждый тип свечек сохранять в свой подкаталог, если в зад вернуть нельзя, попробую так сделать.
Спасибо:
<< < 2 3 4 5 6  > >>

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

loading
clippy