Datenimport

S# implementiert ein Subsystem zum Import von Marktdaten aus CSV-Dateien. Die wichtigsten Klassen befinden sich im Namespace StockSharp.Algo.Import.

CsvParser - Basisparser

Die Klasse CsvParser parst CSV-Dateien und konvertiert Zeilen in S#-Nachrichten.

  • Konstruktor: (DataType dataType, IEnumerable<FieldMapping> fields)
  • ColumnSeparator - Spaltentrennzeichen (Standard ",").
  • LineSeparator - Zeilentrennzeichen (Standard CRLF).
  • SkipFromHeader - Anzahl der Zeilen, die am Dateianfang übersprungen werden (Standard 0).
  • IgnoreNonIdSecurities - Zeilen mit nicht erkannten Instrumenten ignorieren (Standard true).
  • Parse(Stream) - Parsingmethode, gibt IAsyncEnumerable<Message> zurück.
var fields = FieldMappingRegistry.CreateFields(DataType.Ticks);
var parser = new CsvParser(DataType.Ticks, fields)
{
    ColumnSeparator = ";",
    SkipFromHeader = 1
};

await using var stream = File.OpenRead("trades.csv");

await foreach (var msg in parser.Parse(stream))
{
    // Jede Nachricht verarbeiten
}

CsvImporter - Import mit Speichersicherung

Die Klasse CsvImporter erweitert CsvParser und fügt die Möglichkeit hinzu, Daten automatisch in einem Marktdatenspeicher abzulegen.

  • Konstruktor: (DataType dataType, IEnumerable<FieldMapping> fields, ISecurityStorage securityStorage, IExchangeInfoProvider exchangeInfoProvider, Func<SecurityId, IMarketDataStorage> getStorage)
  • Import(Stream, Action<int> progress, CancellationToken) - führt den Import aus und gibt ValueTask<(int count, DateTime? lastTime)> zurück.
  • UpdateDuplicateSecurities - ob doppelte Instrumente aktualisiert werden sollen (Standard false).
  • SecurityUpdated - Ereignis, das ausgelöst wird, wenn ein Instrument aktualisiert wird.
var fields = FieldMappingRegistry.CreateFields(DataType.Ticks);

var importer = new CsvImporter(
    DataType.Ticks,
    fields,
    securityStorage,
    exchangeInfoProvider,
    secId => storageRegistry.GetStorage(secId, DataType.Ticks))
{
    ColumnSeparator = ";",
    SkipFromHeader = 1
};

await using var stream = File.OpenRead("trades.csv");
var (count, lastTime) = await importer.Import(
    stream,
    p => Console.WriteLine($"Fortschritt: {p}%"),
    token);

Console.WriteLine($"{count} Datensätze importiert, letzter: {lastTime}");

FieldMapping - Feldbeschreibungen

Die Klasse FieldMapping beschreibt die Zuordnung zwischen CSV-Dateispalten und Nachrichteneigenschaften.

Wichtigste Eigenschaften:

  • Name - Feldname in der Nachricht.
  • DisplayName - Anzeigename.
  • Type - Werttyp.
  • Order - Spaltenindex in der Datei (beginnend bei 0).
  • IsRequired - ob das Feld erforderlich ist.
  • Format - Parsingformat (z. B. Datumsformat).
  • DefaultValue - Standardwert.
  • ZeroAsNull - ob Nullwerte als null interpretiert werden sollen.

Für benutzerdefinierte Werttransformationen verwenden Sie FieldMappingValue. Sie können beispielsweise eine Zuordnung von Textwerten zu Enumerationen definieren:

var sideField = fields.First(f => f.Name == "Side");
sideField.Order = 3;
sideField.Values.Add(new FieldMappingValue
{
    ValueFrom = "B",
    ValueTo = Sides.Buy
});
sideField.Values.Add(new FieldMappingValue
{
    ValueFrom = "S",
    ValueTo = Sides.Sell
});

FieldMappingRegistry - Registry für Standardfelder

Die statische Klasse FieldMappingRegistry stellt eine Methode zum Erstellen eines Standardsatzes von Feldern bereit:

  • CreateFields(DataType) - gibt eine Liste von FieldMapping für den angegebenen Datentyp zurück.

Unterstützte Datentypen: Ticks, Kerzen, Orderbücher, Level1, Orderlog, Transaktionen, Instrumente, Nachrichten und Positionen.

ImportSettings - Importeinstellungen

Die Klasse ImportSettings fasst alle Importparameter in einem einzigen Konfigurationsobjekt zusammen:

  • DataType - Typ der zu importierenden Daten.
  • FileName - Dateipfad.
  • Directory - Verzeichnis für die Dateisuche.
  • FileMask - Suchmaske für Dateien (z. B. *.csv).
  • ColumnSeparator - Spaltentrennzeichen.
  • SkipFromHeader - Anzahl der zu überspringenden Zeilen.
  • SelectedFields - für den Import ausgewählte Felder.
  • UpdateDuplicateSecurities - ob doppelte Instrumente aktualisiert werden sollen.

Hilfsmethoden:

  • GetFiles(IFileSystem) - Liste der Dateien abrufen, die zur Maske passen.
  • FillParser(CsvParser) - Parser-Einstellungen ausfüllen.
  • FillImporter(CsvImporter) - Importer-Einstellungen ausfüllen.
var settings = new ImportSettings
{
    DataType = DataType.Ticks,
    FileName = "trades.csv",
    ColumnSeparator = ";",
    SkipFromHeader = 1
};

var fields = FieldMappingRegistry.CreateFields(settings.DataType);
// Spaltenreihenfolge konfigurieren
fields[0].Order = 0; // SecurityId
fields[1].Order = 1; // Date
fields[2].Order = 2; // Price
fields[3].Order = 3; // Volume

var importer = new CsvImporter(
    settings.DataType,
    fields,
    securityStorage,
    exchangeInfoProvider,
    secId => storageRegistry.GetStorage(secId, settings.DataType));

settings.FillImporter(importer);

await using var stream = File.OpenRead(settings.FileName);
var (count, lastTime) = await importer.Import(stream, p => { }, token);

Siehe auch

Datenexport

Datenspeicherung