データインポート
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($"Progress: {p}%"),
token);
Console.WriteLine($"Imported {count} records, last: {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 クラスは、すべてのインポートパラメーターを 1 つの構成オブジェクトにまとめます。
- 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);