策略中的市场数据订阅

在 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线创建订阅,该构造函数接受DataTypeSecurity。如果需要,您还可以额外配置订阅参数,例如历史周期。

策略中订阅的优势

在策略中使用订阅相比直接订阅 Strategy.Connector 事件有几个优势:

  1. 隔离——每个订阅独立工作,允许为不同的工具接收不同类型的数据而互不干扰。这也保护策略不会接收到为其他并行运行的策略准备的数据。通过直接订阅连接器事件,你还需要额外过滤数据以排除来自其他策略的信息。

  2. 状态管理 - 订阅具有清晰的状态(SubscriptionStates),这使得可以准确判断历史数据是否正在接收,或者订阅是否已经转为在线模式。

  3. 自动策略状态控制 - 该策略会自动跟踪其所有订阅的状态,只有当所有订阅都处于在线状态时,才会切换到在线模式(IsOnline)。

  4. 代码统一性 - 订阅使用统一的方法,与所请求数据的类型无关。

  5. 与规则的整合 - 订阅可以通过规则轻松与策略 事件模型 集成。

  6. 自动订阅管理 - 当策略停止时,所有订阅将自动取消,从而释放资源。

  7. 历史数据支持 - 能够在切换到实时数据之前加载历史数据。

监控订阅状态

该策略会自动跟踪所有订阅的状态以控制其操作模式:

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(默认),所有订阅将被自动取消。

另请参阅