Хранилище сообщений
Наряду с использованием хранилищ торговых объектов, можно использовать хранилища сообщений. Работа с этими хранилищами также осуществляется через интерфейс IMarketDataStorage<TMessage>. Например, для работы со свечами можно использовать хранилище типа IMarketDataStorage<CandleMessage>. IStorageRegistry также содержит набор методов для получения нужных хранилищ сообщений. Так хранилище временных свечей можно получить, как показано в следующем фрагменте кода.
var security = new Security() { Id = "RIM5@FORTS" };
var candleMessageStorage = _storage.GetCandleMessageStorage(typeof(TimeFrameCandleMessage), security, TimeSpan.FromMinutes(1));
Далее с хранилищем можно работать при помощи методов IMarketDataStorage.Load(System.DateTime date ) и/или IMarketDataStorage.Save(System.Collections.Generic.IEnumerable<StockSharp.Messages.Message> data ), как показано в примере в предыдущем разделе.
Обратите внимание, что S# позволяет приводить типы хранилища торговых объектов к соответствующим типам хранилищ сообщений и наоборот. Например, IMarketDataStorage<MarketDepth> можно привести к типу IMarketDataStorage<QuoteChangeMessage> и наоборот.
var security = new Security() { Id = "RIM5@FORTS" };
var depthStorage = _storage.GetMarketDepthStorage(_security);
var quoteMessageStorage = depthStorage as IMarketDataStorage<QuoteChangeMessage>;
var quoteMessageStorage1 = _storage.GetQuoteMessageStorage(_security);
var depthStorage1 = quoteMessageStorage1 as IMarketDataStorage<MarketDepth>;
Следует обратить внимание на актуальность использования хранилища сообщений для хранения собственных заявок и сделок. Дело в том, что для этих торговых объектов нет соответствующих хранилищ. В этом случае придется использовать хранилище сообщений IMarketDataStorage<ExecutionMessage>. В следующем примере показано, как сохранить в хранилище собственные сделки.
Пример сохранения собственных сделок
Сначала создается экземпляр коннектора, а также хранилище. Кроме того мы определяем идентификатор инструмента, с которым будем работать и декларируем переменную для хранилища транзакций. Само хранилище транзакций для заданного инструмента будет получено в событии получения инструментов при помощи метода IMessageStorageRegistry.GetTransactionStorage(StockSharp.Messages.SecurityId securityId, StockSharp.Algo.Storages.IMarketDataDrive drive, StockSharp.Algo.Storages.StorageFormats format ).
// Создаем коннектор var connector = new Connector(); // Путь к корневой папке хранилища var storagePath = @"...."; var securityId = "RIM5@FORTS"; // Создаем хранилище var storage = new StorageRegistry() { DefaultDrive = new LocalMarketDataDrive(storagePath) }; // Декларируем хранилище транзакций IMarketDataStorage<ExecutionMessage> tranStorage = null; // В обработчике событии получения инструментов // получаем хранилище транзакций для заданного инструмента connector.NewSecurity += security => { if (security.Id == securityId) tranStorage = storage.GetTransactionStorage(security.ToSecurityId()); };
Сохранение собственных сделок будет выполняться в обработчике события Connector.NewMyTrade при помощи метода IMarketDataStorage.Save(System.Collections.Generic.IEnumerable<StockSharp.Messages.Message> data ). Перед сохранением список собственных сделок приводится к типу System.Collections.Generic.IEnumerable`1<ExecutionMessage>. Сама процедура выставления заявок в этим примере опущена.
// сохраняем сделки в хранилище connector.NewMyTrade += trade => { tranStorage.Save(new[] {trade.ToMessage()}); };