Импорт данных

В S# реализована подсистема импорта маркет-данных из CSV-файлов. Основные классы расположены в пространстве имён StockSharp.Algo.Import.

CsvParser — базовый парсер

Класс CsvParser выполняет разбор CSV-файлов и преобразование строк в сообщения S#.

  • Конструктор: (DataType dataType, IEnumerable<FieldMapping> fields)
  • ColumnSeparator — разделитель колонок (по умолчанию ",").
  • LineSeparator — разделитель строк (по умолчанию CRLF).
  • SkipFromHeader — количество строк, пропускаемых от начала файла (по умолчанию 0).
  • IgnoreNonIdSecurities — игнорировать строки с нераспознанными инструментами (по умолчанию true).
  • Parse(Stream) — метод разбора, возвращает IAsyncEnumerable<Message>.
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))
{
    // обработка каждого сообщения
}

CsvImporter — импорт с сохранением в хранилище

Класс CsvImporter расширяет CsvParser, добавляя возможность автоматического сохранения данных в хранилище маркет-данных.

  • Конструктор: (DataType dataType, IEnumerable<FieldMapping> fields, ISecurityStorage securityStorage, IExchangeInfoProvider exchangeInfoProvider, Func<SecurityId, IMarketDataStorage> getStorage)
  • Import(Stream, Action<int> progress, CancellationToken) — выполняет импорт и возвращает ValueTask<(int count, DateTime? lastTime)>.
  • UpdateDuplicateSecurities — обновлять ли дубликаты инструментов (по умолчанию false).
  • SecurityUpdated — событие, вызываемое при обновлении инструмента.
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($"Прогресс: {p}%"),
    token);

Console.WriteLine($"Импортировано {count} записей, последняя: {lastTime}");

FieldMapping — описание полей

Класс FieldMapping описывает соответствие между колонками CSV-файла и свойствами сообщений.

Основные свойства:

  • Name — имя поля в сообщении.
  • DisplayName — отображаемое имя.
  • Type — тип значения.
  • Order — порядковый номер колонки в файле (начиная с 0).
  • IsRequired — обязательное ли поле.
  • Format — формат разбора (например, формат даты).
  • DefaultValue — значение по умолчанию.
  • ZeroAsNull — интерпретировать ли нулевые значения как null.

Для пользовательских преобразований значений используется FieldMappingValue. Например, можно задать маппинг текстовых значений в перечисления:

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 — реестр стандартных полей

Статический класс FieldMappingRegistry предоставляет метод для создания стандартного набора полей:

  • CreateFields(DataType) — возвращает список FieldMapping для указанного типа данных.

Поддерживаемые типы данных: тики, свечи, стаканы, Level1, лог заявок, транзакции, инструменты, новости и позиции.

ImportSettings — настройки импорта

Класс ImportSettings объединяет все параметры импорта в единый конфигурационный объект:

  • DataType — тип импортируемых данных.
  • FileName — путь к файлу.
  • Directory — директория для поиска файлов.
  • FileMask — маска для поиска файлов (например, *.csv).
  • ColumnSeparator — разделитель колонок.
  • SkipFromHeader — количество пропускаемых строк.
  • SelectedFields — выбранные для импорта поля.
  • UpdateDuplicateSecurities — обновлять ли дубликаты инструментов.

Вспомогательные методы:

  • GetFiles(IFileSystem) — получить список файлов по маске.
  • FillParser(CsvParser) — заполнить настройки парсера.
  • FillImporter(CsvImporter) — заполнить настройки импортёра.
var settings = new ImportSettings
{
    DataType = DataType.Ticks,
    FileName = "trades.csv",
    ColumnSeparator = ";",
    SkipFromHeader = 1
};

var fields = FieldMappingRegistry.CreateFields(settings.DataType);
// настройка порядка колонок
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);

См. также

Экспорт данных

Хранение данных