Snapshot-System

Snapshots in StockSharp stellen einen Mechanismus zum Speichern des letzten aktuellen Zustands von Marktdaten dar. Statt die gesamte Historie zu scannen, ermöglichen Snapshots den sofortigen Abruf des aktuellen Level1-Werts, Orderbuchs, der Position oder Transaktion.

Zweck von Snapshots

Bei der Arbeit mit Streaming-Daten ist es häufig notwendig, den letzten Zustand eines Instruments zu kennen - aktuellen Preis, Orderbuch, offene Position. Ohne Snapshots müsste dafür die gesamte Historie geladen und verarbeitet werden. Das Snapshot-System löst dieses Problem, indem es den letzten Zustand jedes Objekts speichert und Zugriff darauf in minimaler Zeit ermöglicht.

ISnapshotStorage - Interface für Snapshot-Speicher

Das Interface ISnapshotStorage definiert den Basiskontrakt für die Arbeit mit Snapshots. Die typisierte Version ISnapshotStorage<TKey, TMessage> stellt folgende Methoden bereit:

  • Update(message) - Snapshot speichern oder aktualisieren. Wenn für den angegebenen Schlüssel bereits ein Snapshot existiert, wird er aktualisiert.
  • Get(key) - Snapshot nach Schlüssel abrufen (z. B. nach Instrumentenbezeichner).
  • GetAll(from, to) - alle Snapshots für den angegebenen Datumsbereich abrufen.
  • Clear(key) - Snapshot für einen bestimmten Schlüssel löschen.
  • ClearAll() - alle Snapshots löschen.

ISnapshotSerializer - Snapshot-Serialisierung

Das Interface ISnapshotSerializer ist für die Konvertierung von Snapshots in eine Binärdarstellung und zurück verantwortlich:

  • DataType - Informationen zum Snapshot-Datentyp.
  • Version - Version des Serialisierungsformats.
  • Serialize(version, message) - Nachricht in ein Bytearray serialisieren.
  • Deserialize(version, buffer) - Bytearray zurück in eine Nachricht deserialisieren.
  • GetKey(message) - Schlüssel aus einer Nachricht extrahieren.
  • Update(message, changes) - inkrementelle Änderungen auf einen bestehenden Snapshot anwenden.

SnapshotRegistry - Snapshot-Registry

Die Klasse SnapshotRegistry ist die zentrale Komponente für die Snapshot-Verwaltung. Sie implementiert das Interface ISnapshotRegistry und koordiniert den Betrieb aller Snapshot-Speicher.

Wichtige Eigenschaften

  • Speicherverwaltung - bietet Zugriff auf Snapshot-Speicher für verschiedene Datentypen.
  • Periodisches Schreiben - Änderungen werden alle 10 Sekunden auf den Datenträger geschrieben, wodurch ein Gleichgewicht zwischen Performance und Zuverlässigkeit erreicht wird.
  • Threadsicherheit - alle Operationen sind sicher für die Verwendung aus mehreren Threads.

Dateiorganisation

Snapshot-Dateien werden unter folgendem Pfad gespeichert:

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

Integrierte Serializer

StockSharp enthält vier Serializer für die wichtigsten Marktdatentypen:

Serializer Message Type Zweck
Level1BinarySnapshotSerializer Level1ChangeMessage Level1-Daten (Preise, Volumina, Spreads)
QuotesBinarySnapshotSerializer QuoteChangeMessage Orderbuch
PositionBinarySnapshotSerializer PositionChangeMessage Positionen
TransactionBinarySnapshotSerializer ExecutionMessage Transaktionen (Orders und Trades)

Jeder Serializer unterstützt Formatversionierung und gewährleistet damit Rückwärtskompatibilität beim Aktualisieren von StockSharp.

Codebeispiel

Snapshot Registry erstellen

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

Arbeiten mit Level1-Snapshots

// Level1-Snapshot-Speicher abrufen
var level1Snapshots = snapshotRegistry.GetSnapshotStorage(
    DataType.Level1);

// Snapshot speichern
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);

Snapshot abrufen

// Letzten Snapshot für ein Instrument abrufen
var secId = "AAPL@NASDAQ".ToSecurityId();
var snapshot = level1Snapshots.Get(secId);

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

Siehe auch