策略中的市场数据订阅
在 StockSharp 中,策略使用订阅机制来接收市场数据。这种方法是交易策略中获取数据的主要且首选方法。
订阅基础
策略中的订阅是基于通用的 StockSharp 订阅机制。它们提供了一种集中统一的方式来获取所有类型的市场数据。
在策略中创建订阅
在策略的 OnStarted2 方法中,您可以为所需的数据创建并启动订阅:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// 直接通过 DataType 创建 5 分钟K线订阅
var subscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
Security);
// 如需其他参数,可以配置订阅
subscription.From = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(7));
// 创建处理传入K线的规则
Connector
.WhenCandlesFinished(subscription)
.Do(ProcessCandle)
.Apply(this);
// 启动订阅
Connector.Subscribe(subscription);
}
在此示例中,使用一个方便的构造函数为5分钟K线创建订阅,该构造函数接受DataType和Security。如果需要,您还可以额外配置订阅参数,例如历史周期。
策略中订阅的优势
在策略中使用订阅相比直接订阅 Strategy.Connector 事件有几个优势:
隔离——每个订阅独立工作,允许为不同的工具接收不同类型的数据而互不干扰。这也保护策略不会接收到为其他并行运行的策略准备的数据。通过直接订阅连接器事件,你还需要额外过滤数据以排除来自其他策略的信息。
状态管理 - 订阅具有清晰的状态(SubscriptionStates),这使得可以准确判断历史数据是否正在接收,或者订阅是否已经转为在线模式。
自动策略状态控制 - 该策略会自动跟踪其所有订阅的状态,只有当所有订阅都处于在线状态时,才会切换到在线模式(IsOnline)。
代码统一性 - 订阅使用统一的方法,与所请求数据的类型无关。
与规则的整合 - 订阅可以通过规则轻松与策略 事件模型 集成。
自动订阅管理 - 当策略停止时,所有订阅将自动取消,从而释放资源。
历史数据支持 - 能够在切换到实时数据之前加载历史数据。
监控订阅状态
该策略会自动跟踪所有订阅的状态以控制其操作模式:
private void CheckRefreshOnlineState()
{
bool nowOnline = ProcessState == ProcessStates.Started;
if (nowOnline)
nowOnline = _subscriptions.CachedKeys
.Where(s => !s.SubscriptionMessage.IsHistoryOnly())
.All(s => s.State == SubscriptionStates.Online);
// 更新策略的 IsOnline 状态
IsOnline = nowOnline;
}
Strategy.IsOnline 属性只有在所有策略订阅都已转为 SubscriptionStates.Online 状态时才会是 true。这使策略能够判断自己何时正在使用当前市场数据。
订阅类型
在策略中,您可以订阅各种类型的市场数据:
// K线订阅
var candleSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(1)),
Security);
// 订阅市场深度
var depthSubscription = new Subscription(
DataType.MarketDepth,
Security);
// tick 成交订阅
var tickSubscription = new Subscription(
DataType.Ticks,
Security);
// 订阅 Level1(最优买卖价及其他基础信息)
var level1Subscription = new Subscription(
DataType.Level1,
Security);
通过规则处理订阅数据
要处理通过订阅传入的数据,建议使用 规则:
// K线订阅
var subscription = new Subscription(DataType.TimeFrame(TimeSpan.FromMinutes(5)), Security);
// 创建用于处理传入K线的规则
Connector
.WhenCandlesFinished(subscription) // 收到完成K线时激活规则
.Do(ProcessCandle) // 调用处理方法
.Apply(this); // 将规则应用到策略
// 启动订阅
Connector.Subscribe(subscription);
在上面的例子中,创建了一个规则,在接收到每个完成的K线时将调用 ProcessCandle 方法。
请求历史数据
该策略通过 Strategy.HistorySize 属性自动设置历史加载周期:
// 将历史加载周期设置为 30 天
strategy.HistorySize = TimeSpan.FromDays(30);
在创建订阅时,如果没有明确指定,策略会自动将 From 参数设置为加载历史记录。
取消订阅
可以通过调用 UnSubscribe 方法手动取消订阅:
// 取消订阅
Connector.UnSubscribe(subscription);
在停止策略时,如果 UnsubscribeOnStop 参数设置为 true(默认),所有订阅将被自动取消。