Система снапшотов

Снапшоты (snapshots) в StockSharp представляют собой механизм сохранения последнего актуального состояния маркет-данных. Вместо сканирования всей истории, снапшоты позволяют мгновенно получить текущее значение Level1, стакан, позицию или транзакцию.

Назначение снапшотов

При работе с потоковыми данными часто необходимо знать последнее состояние инструмента -- текущую цену, стакан котировок, открытую позицию. Без снапшотов для получения этой информации пришлось бы загружать и обрабатывать всю историю. Система снапшотов решает эту задачу, сохраняя последнее состояние каждого объекта и обеспечивая доступ к нему за минимальное время.

ISnapshotStorage -- интерфейс хранилища снапшотов

Интерфейс ISnapshotStorage определяет базовый контракт для работы со снапшотами. Типизированная версия ISnapshotStorage<TKey, TMessage> предоставляет следующие методы:

  • Update(message) -- сохранить или обновить снапшот. Если снапшот для данного ключа уже существует, он будет обновлен.
  • Get(key) -- получить снапшот по ключу (например, по идентификатору инструмента).
  • GetAll(from, to) -- получить все снапшоты за указанный диапазон дат.
  • Clear(key) -- удалить снапшот для конкретного ключа.
  • ClearAll() -- удалить все снапшоты.

ISnapshotSerializer -- сериализация снапшотов

Интерфейс ISnapshotSerializer отвечает за преобразование снапшотов в бинарное представление и обратно:

  • DataType -- информация о типе данных снапшота.
  • Version -- версия формата сериализации.
  • Serialize(version, message) -- сериализовать сообщение в массив байтов.
  • Deserialize(version, buffer) -- десериализовать массив байтов обратно в сообщение.
  • GetKey(message) -- извлечь ключ из сообщения.
  • Update(message, changes) -- применить инкрементальные изменения к существующему снапшоту.

SnapshotRegistry -- реестр снапшотов

Класс SnapshotRegistry является центральным компонентом управления снапшотами. Он реализует интерфейс ISnapshotRegistry и координирует работу всех хранилищ снапшотов.

Основные возможности

  • Управление хранилищами -- предоставляет доступ к хранилищам снапшотов для различных типов данных.
  • Периодическая запись -- изменения сбрасываются на диск каждые 10 секунд, что обеспечивает баланс между производительностью и надежностью.
  • Потокобезопасность -- все операции безопасны для использования из нескольких потоков.

Организация файлов

Файлы снапшотов хранятся по следующему пути:

{путь}/{yyyy_MM_dd}/{имя_сериализатора}.bin

Встроенные сериализаторы

StockSharp включает четыре сериализатора для основных типов маркет-данных:

Сериализатор Тип сообщения Назначение
Level1BinarySnapshotSerializer Level1ChangeMessage Данные Level1 (цены, объемы, спреды)
QuotesBinarySnapshotSerializer QuoteChangeMessage Стакан котировок
PositionBinarySnapshotSerializer PositionChangeMessage Позиции
TransactionBinarySnapshotSerializer ExecutionMessage Транзакции (заявки и сделки)

Каждый сериализатор поддерживает версионирование формата, что обеспечивает обратную совместимость при обновлении StockSharp.

Пример кода

Создание реестра снапшотов

var snapshotRegistry = new SnapshotRegistry(Path.Combine(
    Directory.GetCurrentDirectory(), "Snapshots"));

Работа со снапшотами Level1

// Получение хранилища снапшотов Level1
var level1Snapshots = snapshotRegistry.GetSnapshotStorage(
    DataType.Level1);

// Сохранение снапшота
var level1Msg = new Level1ChangeMessage
{
    SecurityId = "SBER@TQBR".ToSecurityId(),
    ServerTime = DateTimeOffset.Now,
};
level1Msg.TryAdd(Level1Fields.LastTradePrice, 260.5m);
level1Msg.TryAdd(Level1Fields.BestBidPrice, 260.4m);
level1Msg.TryAdd(Level1Fields.BestAskPrice, 260.6m);

level1Snapshots.Update(level1Msg);

Получение снапшота

// Получение последнего снапшота для инструмента
var secId = "SBER@TQBR".ToSecurityId();
var snapshot = level1Snapshots.Get(secId);

if (snapshot != null)
{
    Console.WriteLine($"Последняя цена: {snapshot.Changes[Level1Fields.LastTradePrice]}");
}

См. также