Для изменения размера нажмите или перетащите
API

Вся работа по сохранению и восстановлению данных в S# происходит через специальный API, расположенный в разделе StockSharp.Algo.Storages. В данном разделе находится интерфейс IStorageRegistry, который создан для описания всех возможных действий с хранилищем, и содержит такие свойства как Securities, Orders и т.д. Через эти свойства можно получить все сохраненные ранее торговые объекты, например, инструменты. Вся работа идет как с обычной коллекцией за счет использования интерфейса IStorageEntityListT. Если требуется сохранить торговый объект в хранилище (например, появилась новая заявка, или обновилась ранее зарегистрированная), то необходимо использовать метод IStorageEntityListTSave(T).

Реализацией по умолчанию интерфейса IStorageRegistry является класс StorageRegistry. Он взаимодействует с данными через низкоуровневый системный интерфейс IStorage. Именно данный интерфейс предоставляет прозрачную работу с Базами данных, скрывая особенности.

Работа с маркет-данными, такие как тиковые сделки или стаканы, происходит через отдельный интерфейс IMarketDataStorageTData, который получается на основе информации об инструменте через методы IStorageRegistryGetTradeStorage и IStorageRegistryGetMarketDepthStorage для тиковых сделок и стаканов соответственно.

Если используется StorageRegistry, то реализация методов с маркет-данными не зависит от StorageRegistryDefaultDrive, так как данные всегда сохраняются в файл. Это внутренний формат S#, и он организован таким образом, чтобы сделки или стаканы занимали минимум места на диске. Путь к директории, где будут сохраняться (или считываться) маркет-данные, указывается через свойство LocalMarketDataDrivePath у хранилища IStorageRegistryDefaultDrive.

По этому пути будут созданы папки с названиями, равные идентификаторам инструментов (для каждого инструмента отдельная папка).

Внутри каждой такой папки будут созданы подпапки, обозначающие даты маркет-данных. Например, если сохранять тиковые сделки за период 3 дня, то для них будут созданы 3 отдельные папки с датами. Формат названия папки всегда фиксирован и равен yyyy_MM_dd.

Внутри каждой папки с датами находятся файлы, с расширением bin. Сделки хранятся в файле trades.bin, стаканы в quotes.bin. Также могут присутствовать файлы candles_XXX.bin, где хранятся свечи разных типов (название файла указывает на тип и параметр свечей) и файлы orderLog.bin в которых хранится ордер лог.

Пример работы с хранилищем маркет данных

  1. Пример SampleStorage, находящийся в дистрибутиве S#, показывает, как сохранить и загрузить сделки через класс StorageRegistry. В начале создается инструмент, у которого инициализируются основные свойства - Id (для определения месторасположения), StepPrice и Decimals (для сжатия цены в файле trades.bin):

    C#
    var security = new Security
    {
        Id = "TestId",
        MinStepSize = 0.1,
        Decimals = 1,
    };
  2. Далее, в качестве исходных данных, создается список из 1000 произвольных сделок (в реальном приложении это будут те сделки, которые или получены из внешних источников, или торгового приложения):

    C#
    var trades = new List<Trade>();
    
    // генерируем 1000 произвольных сделок
    // 
    
    var tradeGenerator = new RandomWalkTradeGenerator(security, 99)
    {
        IdGenerator = new IdGenerator
        {
            Current = DateTime.Now.Ticks
        }
    };
    
    // инициализация генератора
    tradeGenerator.Init();
    
    for (var i = 0; i < 1000; i++)
    {
        var t = tradeGenerator.Generate(DateTime.Today + TimeSpan.FromMinutes(i));
        t.Id = i + 1;
        trades.Add(t);
    }
  3. Следующим шагом создается сам StorageRegistry:

    C#
    var storage = new StorageRegistry();
  4. Через хранилище торговых объектов получается хранилище маркет-данных. В примере используется хранилище тиковых сделок, которое получается через метод StorageRegistryGetTradeStorage(Security, IMarketDataDrive, StorageFormats):

    C#
    var tradeStorage = storage.GetTradeStorage(security);
  5. Сохранение сделок:

    C#
    tradeStorage.Save(trades);
  6. Загрузка сделок, сохраненных на предыдущем шаге:

    C#
    var loadedTrades = tradeStorage.Load(DateTime.Today, DateTime.Today + TimeSpan.FromMinutes(1000));
    
    foreach (var trade in loadedTrades)
    {
        Console.WriteLine("Сделка № {0}: {1}", trade.Id, trade);
    }
  7. Так как сделки сохраняются в файл, то при следующем запуске примера они будут там присутствовать, и пример выведет уже не 1000 сделок, а 2000. Чтобы пример работал правильно, сделки в конце работы необходимо удалить:

    C#
    tradeStorage.Delete(DateTime.Today, DateTime.Today + TimeSpan.FromMinutes(1000));