Форматы хранения

В StockSharp поддерживаются два формата хранения маркет-данных, определяемых перечислением StorageFormats: Binary и CSV. Каждый формат имеет свои преимущества и подходит для различных сценариев использования.

Binary формат

Бинарный формат является основным высокопроизводительным форматом хранения данных в StockSharp. Реализация находится в классе BinaryMarketDataSerializer, расположенном в Algo/Storages/Binary/.

Особенности

  • Компактность -- данные сериализуются в двоичном виде с использованием сжатия, что обеспечивает минимальный размер файлов.
  • Производительность -- чтение и запись происходят значительно быстрее по сравнению с текстовыми форматами.
  • Метаданные -- класс BinaryMetaInfo хранит вспомогательную информацию: первую и последнюю цены, дробные значения, временные метки. Это позволяет быстро получить общую информацию о данных без полного чтения файла.
  • Архитектура, готовая к сжатию -- формат изначально спроектирован для эффективной работы с потоковым сжатием.

Бинарные файлы имеют расширение .bin.

Поддерживаемые типы данных

Бинарный формат поддерживает сериализацию всех основных типов маркет-данных: свечей, тиков (сделок), стаканов (Level2), данных Level1, заявок и собственных сделок. Для каждого типа реализован специализированный сериализатор, оптимизированный под структуру конкретных данных.

CSV формат

Текстовый формат CSV (Comma-Separated Values) реализован в классе CsvMarketDataSerializer, расположенном в Algo/Storages/Csv/.

Особенности

  • Читаемость -- файлы можно открывать в любом текстовом редакторе или в Excel для визуального анализа данных.
  • Редактируемость -- данные можно корректировать вручную при необходимости.
  • Метаданные -- класс CsvMetaInfo обеспечивает хранение метаинформации с поддержкой кодировки. Содержит свойства IncrementalOnly (поддержка инкрементальных данных) и LastId (идентификатор последней записи).
  • Больший размер файлов -- текстовое представление занимает значительно больше места на диске.
  • Более медленная обработка -- парсинг текстовых данных требует дополнительных вычислительных ресурсов.

CSV файлы имеют расширение .csv.

Когда использовать какой формат

Сценарий Рекомендуемый формат
Промышленная эксплуатация Binary
Большие объемы данных Binary
Критичная производительность Binary
Отладка и диагностика CSV
Визуальный анализ данных CSV
Интеграция с внешними инструментами CSV
Ручная корректировка данных CSV

Организация файлов на диске

Данные на диске организованы по следующей структуре путей:

{корневая_папка}/{первая_буква}/{идентификатор_инструмента}/{yyyy_MM_dd}/{имя_файла}.{расширение}

Где расширение -- .bin для бинарного формата или .csv для текстового формата. Такая иерархическая организация обеспечивает быстрый поиск данных по инструменту и дате.

Например, 5-минутные свечи инструмента SBER@TQBR за 1 апреля 2024 года в бинарном формате будут расположены по пути вида:

Storage/S/SBER@TQBR/2024_04_01/candles_5m.bin

Конвертация между форматами

StockSharp позволяет загрузить данные в одном формате и сохранить в другом. Это может быть полезно, например, для экспорта бинарных данных в CSV с целью анализа во внешних инструментах:

// Загрузка из бинарного хранилища
var binaryStorage = storageRegistry.GetTimeFrameCandleMessageStorage(
    securityId, TimeSpan.FromMinutes(5), StorageFormats.Binary);
var candles = await binaryStorage.LoadAsync(from, to).ToArrayAsync();

// Сохранение в CSV хранилище
var csvStorage = storageRegistry.GetTimeFrameCandleMessageStorage(
    securityId, TimeSpan.FromMinutes(5), StorageFormats.Csv);
await csvStorage.SaveAsync(candles);

Пример кода

Выбор формата производится при создании хранилища через StorageRegistry:

var storageRegistry = new StorageRegistry();

// Создание хранилища свечей в бинарном формате
var binaryStorage = storageRegistry.GetTimeFrameCandleMessageStorage(
    securityId,
    TimeSpan.FromMinutes(5),
    StorageFormats.Binary);

// Создание хранилища свечей в CSV формате
var csvStorage = storageRegistry.GetTimeFrameCandleMessageStorage(
    securityId,
    TimeSpan.FromMinutes(5),
    StorageFormats.Csv);

// Загрузка данных
var from = new DateTime(2024, 1, 1);
var to = new DateTime(2024, 1, 31);
var candles = await binaryStorage.LoadAsync(from, to).ToArrayAsync();

Формат хранения также можно указывать при работе с тиковыми данными и стаканами:

// Тики в бинарном формате
var tickStorage = storageRegistry.GetTickMessageStorage(
    securityId, StorageFormats.Binary);

// Стаканы в CSV формате
var depthStorage = storageRegistry.GetQuoteMessageStorage(
    securityId, StorageFormats.Csv);

См. также