Перфоманс тестинга на истории
Atom Ответить
21.08.2011


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

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

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

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

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



Спасибо:




65 Ответов
< 1 2 3  >
bender

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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 10.10.2011
Ответить


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


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

Автоматику планируете сделать?
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 10.10.2011
Ответить


AN Перейти
Я сделаю до конца недели следующее:
У меня задача не тестирование, а оптимизация. Убежден, что всех нужных свечек в гидре не сожмешь, а то что сожмешь окажется ненужным. Поэтому при первом тестировании по инструменту / фрейму свечки сжимаю, а в дальнейшем использую. Т.е. нечего задавать в гидре будет не надо: просто тестируем как душе угодно, первый прогон медленный, но остальные быстрые.


Я правильно понял идею, что свечки создаются не Гидрой, а самой программой (через CandleManager?), на которой идет прогонка? Вариант интересный. Можно попробовать это сделать парно, потому что я планирую вынести логику компрессии тиков из CandleManager в отдельный класс.

AN Перейти
Кроме того, мне не нравится, что для каждой стратегии создается свой CandleManager


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

bender

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


Mikhail Sukhov Перейти

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


Я уже сделал, правда пока редко использовал, в прикреплённом архиве классы , которые надо добавить-заменить в Гидре, делал в 3.2.5, в следующих не пробовал.
Посмотрел вторую ссылку, метод CandlesGenerate.Generate разве должен работать? Вот такой код у меня не работает:

Код
	
var candleManager = new CandleManager(trades) { IsSyncRegister = true }; 
CandleToken token = candleManager.RegisterCandles(candleType, security, args); 
IMarketDataStorage<Candle> candleStorage = null;
candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(security, args.To<TimeSpan>()) as IMarketDataStorage<Candle>;
var candles = candleManager.GetCandles(token);
candleStorage.Save(candles);


Mikhail Sukhov Перейти

Автоматику планируете сделать?

Это как? Чтобы при закачке сделок автоматически создавались и сохранялись свечки? Пока нет.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 11.10.2011
Ответить


bender Перейти
в прикреплённом архиве классы , которые надо добавить-заменить в Гидре, делал в 3.2.5, в следующих не пробовал.


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

bender Перейти

Посмотрел вторую ссылку, метод CandlesGenerate.Generate разве должен работать? Вот такой код у меня не работает:

Код
	
var candleManager = new CandleManager(trades) { IsSyncRegister = true }; 
CandleToken token = candleManager.RegisterCandles(candleType, security, args); 
IMarketDataStorage<Candle> candleStorage = null;
candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(security, args.To<TimeSpan>()) as IMarketDataStorage<Candle>;
var candles = candleManager.GetCandles(token);
candleStorage.Save(candles);



Выкидывает исключение? Какое?
Автор топика
Спасибо:

bender

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


Mikhail Sukhov Перейти

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


Зарегился, YuraS


Цитата:

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

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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 11.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

Фотография
Дата: 11.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

Фотография
Автор статей Программист Трейдер
Дата: 11.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

Фотография
Дата: 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 нормально работало


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

bender

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


Alexander Mukhanchikov Перейти

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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 13.10.2011
Ответить


bender Перейти
Alexander Mukhanchikov Перейти

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

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


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

bender

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


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 14.10.2011
Ответить


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


https://stocksharp.ru/do...rage_1_AppendOnlyNew.htm

Зачем удалять? Пользователь может генерировать свечки с разными параметрами. Может они все нужны ему?
Автор топика
Спасибо: bender

bender

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



О, спасибо, в 3.2.5 такого свойства ещё не было, поэтому удалял. Попробую его задействовать.
Цитата:

Зачем удалять? Пользователь может генерировать свечки с разными параметрами. Может они все нужны ему?

Я про свечки с одинаковыми параметрами писал, конечно. Свечки одинакового типа, но с отличными параметрами не удалялись.
Спасибо:

bender

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


Не знаю, баг или последствия рефакоринга, но в последней версии вот такое работать перестало:
Код
var candleManager = new CandleManager(_trades) { IsSyncRegister = true };                  
var candles = candleManager.GetCandles(token).OrderBy((cnd) => cnd.Time);     

По докам вроде должно работать как и раньше
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 14.10.2011
Ответить


bender Перейти
Не знаю, баг или последствия рефакоринга, но в последней версии вот такое работать перестало:
Код
var candleManager = new CandleManager(_trades) { IsSyncRegister = true };                  
var candles = candleManager.GetCandles(token).OrderBy((cnd) => cnd.Time);     

По докам вроде должно работать как и раньше


Какая ошибка?
Автор топика
Спасибо:

bender

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


Mikhail Sukhov Перейти
[quote=bender;12336]
Какая ошибка?


Нету у CandleManager конструктора с параметром IEnumerable<Trade>, а методов GetCandles нету вообще.
Спасибо:

bender

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


Mikhail Sukhov Перейти
bender Перейти
Удаление в принципе нужно было для того, чтобы если пользователь формирует свечки по второму разу в тот-же каталог с налогающимся интервалом дат, то наложение надо удалить, иначе при записи дописываемые свечки дублируются, а не затирают старые( во всяком случае в 3.2 так было, как сейчас не могу пока посмотреть).


https://stocksharp.ru/do...rage_1_AppendOnlyNew.htm



C помощью IMarketDataStorage(T).AppendOnlyNew тоже не получается. Если сохраняется недоформированная свеча, то при последующем дописывании она не заменяется на полностью сформированную, а остаётся как есть.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 14.10.2011
Ответить


bender Перейти
Mikhail Sukhov Перейти
[quote=bender;12336]
Какая ошибка?


Нету у CandleManager конструктора с параметром IEnumerable<Trade>, а методов GetCandles нету вообще.


Видимо не последняя версия загружена с TFS.
Автор топика
Спасибо:

bender

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


Mikhail Sukhov Перейти

Видимо не последняя версия загружена с TFS.

Вроде последняя, вот тут http://stocksharp.codepl.../changeset/changes/10521 и дифф есть в CandleWindow. Сделал также, а по старому не работает.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 15.10.2011
Ответить


bender Перейти
Mikhail Sukhov Перейти

Видимо не последняя версия загружена с TFS.

Вроде последняя, вот тут https://stocksharp.codepl.../changeset/changes/10521 и дифф есть в CandleWindow. Сделал также, а по старому не работает.


Дифф показывает, что код, который вы привели выше, уже не существует. Поэтому я и говорю, что версия не последняя Гидры, нужно обновиться.
Автор топика
Спасибо:

bender

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


Mikhail Sukhov Перейти

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

Мы, кажется, друг друга не понимаем.)))
У меня последняя версия, код, который я привёл, в ней действительно не существует. Но я про то, что этот код в последней версии не работает, хотя судя по докам https://stocksharp.ru/doc/ должен работать, отсюда и возник этот вопрос. А где нибудь можно почитать про новый CandleManager?
Спасибо:
< 1 2 3  >

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

loading
clippy