← Назад

Хранение данных

Только начинаю разбираться с S#. Сразу возник вопрос - перечитал весь форум, ответа не нашел. Для стратегии нужно сохранять информацию из таблицы всех сделок, на основе нее производить определенные вычисления, результаты которых также необходимо сохранять в какой-то файл или таблицу, для дальнейшего их анализа и генерирования торговых сигналов. Раньше все было реализовано в Access. Вопрос в следующем - какой способ хранения информации более предпочтительней? И с точки зрения добавления новых данных и с точки зрения доступа и работы с ними. В документации к S# этому вопросу уделено очень мало. И Насколько понимаю StockSharp.Algo.Storages позволяет хранить только историю маркет данных, но не сохранять результаты вычисления над ними. помогите разобраться...

Комментарии (13)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Alexander
Alexander

Sqlite наверное если нужно хранить за несколько дней

profts
profts Автор

Если честно,я перечитал всю документацию и в голове путанница... работая с Access была понятная цепочка: Quik - Access(по ODBC), анализ поступаемых данных и сохранение результатов вычислений в отдельную таблицу, отправка сделок в Quik. а тут никак не могу для себя выработать подобную цепочку. если sqlite, то с помощью чего производить экспорт Всех сделок в реальном времени и их обработки? стратегия не скальперская, но достаточно часто генерирует сделки, т.е. требуется постоянно производить анализ тиковых сделок за последние минут 10 торгов. Гидра, StockSharp.Algo.Storages или S# предоставляет другие способы?

из документации (самое начало) - "Для стратегий, которым необходима информация о стакане по инструменту, в S# предусмотрен метод ITrader.GetMarketDepth(Security). Данный метод возвращает MarketDepth, который позволяет получить группированно по типу котировки (биды и оффера), а так же удобную работу с лучшими котировками и спредом."... в каком виде и где хранятся эти данные или данный метод просто "достает" информацию из стакана, но не сохраняет ее? аналогично и с примерами экспорта таблиц по DDE...

Alexander
Alexander

всё хранится в памяти. все сделки - ITrader.Trades стакан - MarketDepth

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

profts
profts
profts Автор

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

Alexander
Alexander

profts: т.е. я могу брать информацию по сделкам из ITrader.Trades, производить анализ, а результаты анализа уже сохранять либо в отдельный файл или в БД? и как понимаю при каждом закрытии приложения память обнуляется и при следующем запуске ITrader.Trades заново получает данные из квика?

ITrader.Trades хранит только данные за текущую сессию вы можете вообще сделать враппер над Trade и хранить нужную вам информацию вместе со сделками. В общем C# позволяет всё что приходит на ум и многими способами :)

profts
profts Автор

помогите начинающему в C# ))

как правильнее будет построить запрос из ITrader.Trades... к примеру следующего типа: middle = средняя цена сделки, где инструмент RIZ1, направление buy, за последние 10 мин.

profts
profts Автор

сделал следующий запрос:

"this.Trader.NewTrades += trades => { this.GuiAsync(() => middle = this.Trader.Trades.Where(p => p.Security == _RIZ1).GetAveragePrice()); };"

а вот дальше зашел в тупик... как в него включить выборку по времени и направлению сделки?

Sergey Masyura
Sergey Masyura

profts: сделал следующий запрос:

"this.Trader.NewTrades += trades => { this.GuiAsync(() => middle = this.Trader.Trades.Where(p => p.Security == _RIZ1).GetAveragePrice()); };"

а вот дальше зашел в тупик... как в него включить выборку по времени и направлению сделки?

Вы фильтруете сделки по инструменту, туда же добавить условия для времени и направления

Where(p => p.Security == _RIZ1 && p.Direction == OrdersDirections.Buy && p.Time > time)

profts
profts Автор

Спасибо, разобрался... немного не так оператор && использовал (

запускаю, все работает, показывает результат вычисления... НО! до тех пор пока загружается история сделок. как только подгружаются все сделки - приложение виснет и не откликается ((

profts
profts Автор

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

Из документации - "Основное ограничение визуального API под Windows состоит в том, что нельзя обращаться из другого потока к элементам окна." далее имеем следующий код:

this.Trader.NewTrades += trades => { middle = this.Trader.Trades.Where(p => p.Security == _RIZ1).GetAveragePrice()); this.GuiAsync(() => this.mid_price.Text = middle.ToString(); };

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

                           middle = this.Trader.Trades.Where(p => p.Security == _RIZ1).GetAveragePrice());
                           this.GuiAsync(() => this.mid_price.Text = middle.ToString();

Все работает!

Но я никак не могу понять почему не хочет работать такой вариант:

                           this.GuiAsync(() => middle = this.Trader.Trades.Where(p => p.Security == _RIZ1).GetAveragePrice());
                           this.GuiAsync(() => this.mid_price.Text = middle.ToString();

И еще такой вопрос... Если изначально использовать шлюз GuiTrader<T>, данная проблема отпадает?

profts
profts Автор

В стратегии на основе события появления новой сделки происходит расчет показателя. для расчета делается запрос вроде этого :

var sum__riz1_5 = this.Trader.Trades.Where(p => p.Security == base.Security && p.Time > DateTime.Now.AddMinutes(-5)).Sum(tr => tr.Volume);

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

  1. никак не могу сообразить - как сделать запрос к примеру, только по сделкам, поступившим за последние n минут.
  2. если не 1), то как периодически чистить Trader.Trades и оставлять только сделки за последние n минут.
Alexander
Alexander

profts: В стратегии на основе события появления новой сделки происходит расчет показателя. для расчета делается запрос вроде этого :

var sum__riz1_5 = this.Trader.Trades.Where(p => p.Security == base.Security && p.Time > DateTime.Now.AddMinutes(-5)).Sum(tr => tr.Volume);

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

  1. никак не могу сообразить - как сделать запрос к примеру, только по сделкам, поступившим за последние n минут.
  2. если не 1), то как периодически чистить Trader.Trades и оставлять только сделки за последние n минут.

По событию появления новых сделок сохраняйте их в отдельную коллекцию и обрабатывайте её. Те сделки, которые выходят за 5 минут - чистите.

Вариант 2 - стройте свечки 5-минутные и берите объём.

И да, LINQ медленный.

vader
vader

И да, LINQ медленный. А что быстрое? Что посоветуете?