存储驱动器
StockSharp中的存储驱动负责市场数据的物理存放——无论是在本地磁盘还是在远程服务器上。基础接口IMarketDataDrive定义了所有实现的通用契约。
IMarketDataDrive -- 基础接口
IMarketDataDrive 接口提供以下关键功能:
- 路径 -- 数据存储的路径。
- GetAvailableSecuritiesAsync() -- 检索存储中所有可用工具的列表。
- GetAvailableDataTypesAsync() -- 检索特定交易品种可用的数据类型列表。
- GetStorageDrive() -- 获取特定交易品种和数据类型的存储驱动器。
- VerifyAsync() -- 验证存储的完整性。
- LookupSecuritiesAsync() -- 根据指定条件搜索金融工具。
LocalMarketDataDrive -- 本地文件存储
LocalMarketDataDrive 类是主要的驱动实现,用于在文件系统的本地磁盘上存储数据。
主要特点
- 文件系统 -- 数据按交易品种和日期组织在分层目录结构中。
- 索引系统 -- 内部的
Index类提供无需扫描文件系统的快速数据访问。索引文件以{instrument_path}{file_name}Dates2.bin格式存储。 - 线程安全 —— 数据访问通过锁机制保护,以确保在多线程应用中的正确操作。
- 索引构建 --
BuildIndexAsync()方法允许在批量数据操作后重建索引以提高性能。
使用示例
// 使用指定路径创建本地驱动
var localDrive = new LocalMarketDataDrive(Path.Combine(
Directory.GetCurrentDirectory(), "Storage"));
// 与存储注册表一起使用
var storageRegistry = new StorageRegistry
{
DefaultDrive = localDrive,
};
// 获取可用交易品种列表
await foreach (var secId in localDrive.GetAvailableSecuritiesAsync())
{
Console.WriteLine(secId);
}
远程市场数据驱动器 -- 远程存储
RemoteMarketDataDrive 类允许连接到远程 Hydra 服务器以通过网络访问市场数据。
连接设置
- 地址 -- 远程服务器地址。默认是
127.0.0.1:5002。 - 凭证 -- 认证凭证(电子邮件和密码)。
- TargetCompId -- 目标组件标识符,默认值为
"StockSharpHydraMD"。 - SecurityBatchSize -- 加载工具时的批量大小,默认值为 1000。
- 超时 -- 连接超时,默认是2分钟。
使用示例
// 创建远程驱动
var remoteDrive = new RemoteMarketDataDrive
{
Address = "192.168.1.100:5002".To<EndPoint>(),
Credentials = { Email = "user", Password = "pass".Secure() }
};
// 获取交易品种的可用数据类型
var secId = "AAPL@NASDAQ".ToSecurityId();
await foreach (var dataType in remoteDrive.GetAvailableDataTypesAsync(secId, StorageFormats.Binary))
{
Console.WriteLine(dataType);
}
有关使用远程存储的更多详细信息,请参阅 使用远程存储 部分。
DriveCache -- 磁盘管理
DriveCache 类管理存储驱动器的集合并提供缓存以便重复使用。
关键方法和属性
- GetDrive(path) -- 通过路径获取现有驱动器或创建一个新的驱动器。
- DeleteDrive(drive) -- 从缓存中移除一个驱动器。
- TryDefaultDrive -- 第一个可用的 LocalMarketDataDrive。
- NewDriveCreated -- 新驱动器创建事件。
- DriveDeleted -- 驱动器删除的事件。
- 已更改——驱动器收集更改的事件。
该类实现了 IPersistable 接口,该接口允许保存和加载驱动器配置。
使用示例
// 使用默认本地驱动创建缓存
var defaultDrive = new LocalMarketDataDrive(Path.Combine(
Directory.GetCurrentDirectory(), "Storage"));
var driveCache = new DriveCache(defaultDrive);
// 按路径获取或创建驱动
var anotherDrive = driveCache.GetDrive(@"D:\MarketData");
// 订阅事件
driveCache.NewDriveCreated += drive =>
Console.WriteLine($"驱动已创建: {drive.Path}");