Хранение данных
Atom Ответить
04.11.2011


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

Теги:


Спасибо:




13 Ответов
Alexander

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


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

profts

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


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

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

Alexander

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


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

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

profts

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


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

Alexander

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


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


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

profts

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


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

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

Автор топика
Спасибо:

profts

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


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

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

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

Sergey Masyura

Фотография
Автор статей
Дата: 08.11.2011
Ответить


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

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


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

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

profts

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


Понятно, что дело в потоках, но перечитав всю теорию по ним, а также раздел "Пользовательский интерфейс (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

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


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

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

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


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

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


Цитата:
И да, LINQ медленный.

А что быстрое? Что посоветуете?
Спасибо:


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

loading
clippy