Форматы хранения
В 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);