Sistema de snapshots

Los snapshots en StockSharp representan un mecanismo para guardar el último estado real de los datos de mercado. En lugar de escanear todo el histórico, los snapshots permiten obtener instantáneamente el valor Level1 actual, el libro de órdenes, la posición o la transacción.

Propósito de los snapshots

Al trabajar con datos en streaming, a menudo es necesario conocer el último estado de un instrumento: precio actual, libro de órdenes, posición abierta. Sin snapshots, obtener esta información requeriría cargar y procesar todo el histórico. El sistema de snapshots resuelve este problema guardando el último estado de cada objeto y proporcionando acceso a él en tiempo mínimo.

ISnapshotStorage -- Interfaz de almacenamiento de snapshots

La interfaz ISnapshotStorage define el contrato base para trabajar con snapshots. La versión tipada ISnapshotStorage<TKey, TMessage> proporciona los siguientes métodos:

  • Update(message) -- guardar o actualizar un snapshot. Si ya existe un snapshot para la clave dada, se actualizará.
  • Get(key) -- obtener un snapshot por clave (por ejemplo, por identificador de instrumento).
  • GetAll(from, to) -- obtener todos los snapshots para el rango de fechas especificado.
  • Clear(key) -- eliminar el snapshot de una clave específica.
  • ClearAll() -- eliminar todos los snapshots.

ISnapshotSerializer -- Serialización de snapshots

La interfaz ISnapshotSerializer es responsable de convertir snapshots a representación binaria y viceversa:

  • DataType -- información del tipo de datos del snapshot.
  • Version -- versión del formato de serialización.
  • Serialize(version, message) -- serializar un mensaje a un array de bytes.
  • Deserialize(version, buffer) -- deserializar un array de bytes de vuelta a un mensaje.
  • GetKey(message) -- extraer la clave de un mensaje.
  • Update(message, changes) -- aplicar cambios incrementales a un snapshot existente.

SnapshotRegistry -- Registro de snapshots

La clase SnapshotRegistry es el componente central para la gestión de snapshots. Implementa la interfaz ISnapshotRegistry y coordina el funcionamiento de todos los almacenamientos de snapshots.

Características clave

  • Gestión de almacenamiento -- proporciona acceso a almacenamientos de snapshots para varios tipos de datos.
  • Escritura periódica -- los cambios se vuelcan a disco cada 10 segundos, lo que garantiza un equilibrio entre rendimiento y fiabilidad.
  • Seguridad de hilos -- todas las operaciones son seguras para su uso desde varios hilos.

Organización de archivos

Los archivos de snapshots se almacenan en la siguiente ruta:

{path}/{yyyy_MM_dd}/{serializer_name}.bin

Serializadores integrados

StockSharp incluye cuatro serializadores para los principales tipos de datos de mercado:

Serializador Tipo de mensaje Propósito
Level1BinarySnapshotSerializer Level1ChangeMessage Datos Level1 (precios, volúmenes, spreads)
QuotesBinarySnapshotSerializer QuoteChangeMessage Libro de órdenes
PositionBinarySnapshotSerializer PositionChangeMessage Posiciones
TransactionBinarySnapshotSerializer ExecutionMessage Transacciones (órdenes y trades)

Cada serializador admite versionado de formato, lo que garantiza compatibilidad hacia atrás al actualizar StockSharp.

Ejemplo de código

Creación de un registro de snapshots

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

Trabajo con snapshots Level1

// Obtener el almacenamiento de snapshots Level1
var level1Snapshots = snapshotRegistry.GetSnapshotStorage(
    DataType.Level1);

// Guardar un snapshot
var level1Msg = new Level1ChangeMessage
{
    SecurityId = "AAPL@NASDAQ".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);

Recuperación de un snapshot

// Obtener el último snapshot de un instrumento
var secId = "AAPL@NASDAQ".ToSecurityId();
var snapshot = level1Snapshots.Get(secId);

if (snapshot != null)
{
    Console.WriteLine($"Último precio: {snapshot.Changes[Level1Fields.LastTradePrice]}");
}

Véase también