Momentaufnahmen-System

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

Zweck von Momentaufnahmen

Bei der Arbeit mit Datenströmen ist es häufig notwendig, den letzten Zustand eines Instruments zu kennen - aktuellen Preis, Orderbuch, offene Position. Ohne Momentaufnahmen müsste dafür die gesamte Historie geladen und verarbeitet werden. Das Momentaufnahmen-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 Momentaufnahmen-Speicher

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

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

ISnapshotSerializer - Momentaufnahmen-Serialisierung

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

  • DataType - Informationen zum Datentyp der Momentaufnahme.
  • 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 eine bestehende Momentaufnahme anwenden.

SnapshotRegistry - Momentaufnahmen-Register

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

Wichtige Eigenschaften

  • Speicherverwaltung - bietet Zugriff auf Momentaufnahmen-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

Momentaufnahmen-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 Nachrichtentyp 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

Momentaufnahmen-Register erstellen

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

Arbeiten mit Level1-Momentaufnahmen

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

// Momentaufnahme 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);

Momentaufnahme abrufen

// Letzte Momentaufnahme 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