リモートストレージの操作

はじめに

ローカルストレージに加えて、API はリモート市場データストレージを扱う機能を提供します。これは、サーバーモード の Hydra を使用する場合や、Hydra サーバー に接続する場合に特に便利です。

リモートストレージへの接続

リモートストレージを扱うには、RemoteMarketDataDrive クラスを使用します。

// RemoteMarketDataDrive を作成します
var remoteDrive = new RemoteMarketDataDrive(RemoteMarketDataDrive.DefaultAddress, new FixMessageAdapter(new IncrementalIdGenerator()))
{
	Credentials = { Email = "hydra_user", Password = "hydra_user".To<SecureString>() }
};

// このコードは、リモートストレージに接続するための RemoteMarketDataDrive のインスタンスを作成します。
// 通信には既定のアドレスと FixMessageAdapter を使用します。
// 認証のために資格情報を設定します。

銘柄情報の読み込み

市場データを読み込む前に、利用可能な銘柄に関する情報を取得する必要があります。

// 銘柄情報を読み込みます
var exchangeInfoProvider = new InMemoryExchangeInfoProvider();
remoteDrive.LookupSecurities(Extensions.LookupAllCriteriaMessage, registry.Securities,
	s => securityStorage.Save(s.ToSecurity(exchangeInfoProvider), false), () => false,
	(c, t) => Console.WriteLine($"ダウンロード済み [{c}]/[{t}]"));

var securities = securityStorage.LookupAll();

// このコードは、リモートストレージから利用可能なすべての銘柄に関する情報を読み込みます。
// 読み込まれた銘柄はローカルストレージに保存され、コンソールに出力されます。

市場データの読み込み

銘柄情報を取得した後、市場データの読み込みに進むことができます。

// 市場データを読み込みます
foreach (var dataType in remoteDrive.GetAvailableDataTypes(secId, format))
{
	var localStorage = storageRegistry.GetStorage(secId, dataType.MessageType, dataType.Arg, localDrive, format);
	var remoteStorage = remoteDrive.GetStorageDrive(secId, dataType, format);

	// ...(データ読み込みコード)
}

// このループは、指定した銘柄で利用可能なすべてのデータ型を反復処理します。
// 各データ型について、ローカルストレージを作成し、リモートストレージにアクセスします。

ローカルへのデータ保存

読み込まれたデータは、後で使用するためにローカルに保存できます。

// データをローカルに保存します
foreach (var dateTime in dates)
{
	using (var stream = remoteStorage.LoadStream(dateTime))
	{
		if (stream == Stream.Null)
			continue;

		localStorage.Drive.SaveStream(dateTime, stream);
	}

	// ...(データ出力コード)
}

// このコードは、各日付のデータをリモートストレージから読み込み、ローカルストレージに保存します。

テストでのデータ使用

読み込んでローカルに保存したデータは、HistoryEmulationConnector を使用した取引ストラテジーのテストに使用できます。

// HistoryEmulationConnector を使用します
var connector = new HistoryEmulationConnector(secProvider, new[] { pf }, new StorageRegistry { DefaultDrive = remoteDrive });

利用可能な日付範囲の取得

// さまざまなデータ型を扱います
foreach (var dataType in remoteDrive.GetAvailableDataTypes(secId, format))
{
	// ...(データ処理コード)

	// エラー処理とログ記録
	Console.WriteLine($"Remote {dataType}: {remoteStorage.Dates.FirstOrDefault()}-{remoteStorage.Dates.LastOrDefault()}");
	Console.WriteLine($"{dataType}={dateTime}");
}

まとめ

API のリモート市場データストレージ機能は、ヒストリカルデータを取得して使用するための柔軟な機能を提供します。これにより、Hydra サーバー を通じて利用可能な大規模データセットを使用して、取引ストラテジーの効率的なテストと市場分析を行えます。