Sistema de instantáneas
Las instantáneas en StockSharp representan un mecanismo para guardar el último estado real de los datos de mercado. En lugar de escanear todo el histórico, las instantáneas permiten obtener instantáneamente el valor Level1 actual, el libro de órdenes, la posición o la transacción.
Propósito de las instantáneas
Al trabajar con datos en flujo continuo, a menudo es necesario conocer el último estado de un instrumento: precio actual, libro de órdenes, posición abierta. Sin instantáneas, obtener esta información requeriría cargar y procesar todo el histórico. El sistema de instantáneas resuelve este problema guardando el último estado de cada objeto y proporcionando acceso a él en tiempo mínimo.
ISnapshotStorage -- Interfaz de almacenamiento de instantáneas
La interfaz ISnapshotStorage define el contrato base para trabajar con instantáneas. La versión tipada ISnapshotStorage<TKey, TMessage> proporciona los siguientes métodos:
- Update(message) -- guardar o actualizar una instantánea. Si ya existe una instantánea para la clave dada, se actualizará.
- Get(key) -- obtener una instantánea por clave (por ejemplo, por identificador de instrumento).
- GetAll(from, to) -- obtener todas las instantáneas para el rango de fechas especificado.
- Clear(key) -- eliminar la instantánea de una clave específica.
- ClearAll() -- eliminar todas las instantáneas.
ISnapshotSerializer -- Serialización de instantáneas
La interfaz ISnapshotSerializer es responsable de convertir instantáneas a una representación binaria y viceversa:
DataType-- información del tipo de datos de la instantánea.- 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 una instantánea existente.
SnapshotRegistry -- Registro de instantáneas
La clase SnapshotRegistry es el componente central para la gestión de instantáneas. Implementa la interfaz ISnapshotRegistry y coordina el funcionamiento de todos los almacenamientos de instantáneas.
Características clave
- Gestión de almacenamiento -- proporciona acceso a almacenamientos de instantáneas 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 instantáneas 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 operaciones) |
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 instantáneas
var snapshotRegistry = new SnapshotRegistry(Path.Combine(
Directory.GetCurrentDirectory(), "Snapshots"));
Trabajo con instantáneas Level1
// Obtener el almacenamiento de instantáneas Level1
var level1Snapshots = snapshotRegistry.GetSnapshotStorage(
DataType.Level1);
// Guardar una instantánea
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 una instantánea
// Obtener la última instantánea de un instrumento
var secId = "AAPL@NASDAQ".ToSecurityId();
var snapshot = level1Snapshots.Get(secId);
if (snapshot != null)
{
Console.WriteLine($"Último precio: {snapshot.Changes[Level1Fields.LastTradePrice]}");
}