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]}");
}