Только начинаю разбираться с S#. Сразу возник вопрос - перечитал весь форум, ответа не нашел. Для стратегии нужно сохранять информацию из таблицы всех сделок, на основе нее производить определенные вычисления, результаты которых также необходимо сохранять в какой-то файл или таблицу, для дальнейшего их анализа и генерирования торговых сигналов. Раньше все было реализовано в Access. Вопрос в следующем - какой способ хранения информации более предпочтительней? И с точки зрения добавления новых данных и с точки зрения доступа и работы с ними. В документации к S# этому вопросу уделено очень мало. И Насколько понимаю StockSharp.Algo.Storages позволяет хранить только историю маркет данных, но не сохранять результаты вычисления над ними. помогите разобраться...
评论 (13)
登录 或 创建账户, 登录或注册以发表评论
Sqlite наверное если нужно хранить за несколько дней
Если честно,я перечитал всю документацию и в голове путанница... работая с Access была понятная цепочка: Quik - Access(по ODBC), анализ поступаемых данных и сохранение результатов вычислений в отдельную таблицу, отправка сделок в Quik. а тут никак не могу для себя выработать подобную цепочку. если sqlite, то с помощью чего производить экспорт Всех сделок в реальном времени и их обработки? стратегия не скальперская, но достаточно часто генерирует сделки, т.е. требуется постоянно производить анализ тиковых сделок за последние минут 10 торгов. Гидра, StockSharp.Algo.Storages или S# предоставляет другие способы?
из документации (самое начало) - "Для стратегий, которым необходима информация о стакане по инструменту, в S# предусмотрен метод ITrader.GetMarketDepth(Security). Данный метод возвращает MarketDepth, который позволяет получить группированно по типу котировки (биды и оффера), а так же удобную работу с лучшими котировками и спредом."... в каком виде и где хранятся эти данные или данный метод просто "достает" информацию из стакана, но не сохраняет ее? аналогично и с примерами экспорта таблиц по DDE...
всё хранится в памяти. все сделки - ITrader.Trades стакан - MarketDepth
Далее вы вольны поступать с ним как душе заблагорассудится. если необходимо сохранять историю в какой-то базе данных, то используйте, к примеру sqlite.
т.е. я могу брать информацию по сделкам из ITrader.Trades, производить анализ, а результаты анализа уже сохранять либо в отдельный файл или в БД? и как понимаю при каждом закрытии приложения память обнуляется и при следующем запуске ITrader.Trades заново получает данные из квика?
ITrader.Trades хранит только данные за текущую сессию вы можете вообще сделать враппер над Trade и хранить нужную вам информацию вместе со сделками. В общем C# позволяет всё что приходит на ум и многими способами :)
помогите начинающему в C# ))
как правильнее будет построить запрос из ITrader.Trades... к примеру следующего типа: middle = средняя цена сделки, где инструмент RIZ1, направление buy, за последние 10 мин.
сделал следующий запрос:
"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)
Спасибо, разобрался... немного не так оператор && использовал (
запускаю, все работает, показывает результат вычисления... НО! до тех пор пока загружается история сделок. как только подгружаются все сделки - приложение виснет и не откликается ((
Понятно, что дело в потоках, но перечитав всю теорию по ним, а также раздел "Пользовательский интерфейс (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(); };
Насколько я понял, для события появления новой сделки создается новый поток, поэтому результат вычислений не выводится в текстбокс. Т.е. нужно исправить на
Все работает!
Но я никак не могу понять почему не хочет работать такой вариант:
И еще такой вопрос... Если изначально использовать шлюз GuiTrader<T>, данная проблема отпадает?
В стратегии на основе события появления новой сделки происходит расчет показателя. для расчета делается запрос вроде этого :
var sum__riz1_5 = this.Trader.Trades.Where(p => p.Security == base.Security && p.Time > DateTime.Now.AddMinutes(-5)).Sum(tr => tr.Volume);
пока кол-во сделок небольшое - скорость запроса приличная, но к обеду, когда кол-во сделок по ризу больше 500000 - значительно падает. да и различия скорости вычислений в разное время дня очень не нравится.
По событию появления новых сделок сохраняйте их в отдельную коллекцию и обрабатывайте её. Те сделки, которые выходят за 5 минут - чистите.
Вариант 2 - стройте свечки 5-минутные и берите объём.
И да, LINQ медленный.