战略中的指标
在 StockSharp 中,Strategy 类提供了一种用于处理指标的特殊机制,这使您能够控制它们的形成状态,并确定策略何时可以开始工作。
指标属性
Strategy.Indicators 属性是一组用于策略的指标集合。该集合旨在自动跟踪指标形成的状态(预热)。
// 访问指标集合
INotifyList<IIndicator> indicators = strategy.Indicators;
IsFormed 属性
默认情况下,Strategy.IsFormed 属性的实现会检查 Indicators 集合中的所有指标是否已形成:
// Strategy 类中的标准实现
public virtual bool IsFormed => _indicators.AllFormed;
当集合中的所有指标都已形成(它们的 IIndicator.IsFormed 属性返回 true)时,策略被认为是“预热”并准备工作。
将指标添加到集合中
要正确判断策略何时准备好,您需要将使用的指标添加到 Indicators 集合中:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// 创建指标
_shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
_longSma = new SimpleMovingAverage { Length = LongSmaLength };
// 将指标添加到集合
Indicators.Add(_shortSma);
Indicators.Add(_longSma);
// ...
}
添加哪些指标
您应该只向 Indicators 集合中添加 独立指标。这是一个重要规则,有助于避免不必要的等待,并正确判断策略何时准备就绪。
添加指标的规则:
独立指标 - 添加直接处理市场数据(K线、逐笔数据等)的指标:
// 独立指标 var sma = new SimpleMovingAverage { Length = 20 }; var rsi = new RelativeStrengthIndex { Length = 14 }; Indicators.Add(sma); Indicators.Add(rsi);指标链 - 当使用指标链(一个指标的输出作为另一个指标的输入)时,仅将链中的第一个指标添加到集合中:
// 指标链 var sma = new SimpleMovingAverage { Length = 20 }; var stdev = new StandardDeviation { Length = 20 }; var bollingerBands = new BollingerBands { SmaIndicator = sma, DeviationIndicator = stdev }; // 只添加指标链中的第一个指标 Indicators.Add(sma); // 不要添加依赖其他指标的指标 // Indicators.Add(stdev); - 错误 // Indicators.Add(bollingerBands); - 错误组合指标 - 对于使用多个独立指标的指标(例如, MACD),将它们全部相加:
var fastEma = new ExponentialMovingAverage { Length = 12 }; var slowEma = new ExponentialMovingAverage { Length = 26 }; var signalEma = new ExponentialMovingAverage { Length = 9 }; var macd = new MovingAverageConvergenceDivergence { FastEma = fastEma, SlowEma = slowEma, SignalEma = signalEma }; // 添加基础指标 Indicators.Add(fastEma); Indicators.Add(slowEma);
使用示例
带有两个移动平均线的基本示例
public class SmaStrategy : Strategy
{
private SimpleMovingAverage _longSma;
private SimpleMovingAverage _shortSma;
// ...
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_longSma = new SimpleMovingAverage { Length = LongSmaLength };
_shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
// 将指标添加到集合以跟踪其状态
Indicators.Add(_longSma);
Indicators.Add(_shortSma);
// ...
}
private void ProcessCandle(ICandleMessage candle)
{
// 处理指标
var longValue = _longSma.Process(candle);
var shortValue = _shortSma.Process(candle);
// 执行交易逻辑前检查策略是否就绪
if (!IsFormed)
return;
// 交易逻辑
// ...
}
}
使用 IsFormedAndOnline 的示例
为了检查策略是否准备好进行交易,通常使用 IsFormedAndOnlineAndAllowTrading 方法,该方法结合了检查指标形成、在线状态和交易许可:
private void ProcessCandle(ICandleMessage candle)
{
// 处理指标
var longValue = _longSma.Process(candle);
var shortValue = _shortSma.Process(candle);
// 全面检查策略是否就绪
if (!IsFormedAndOnlineAndAllowTrading())
return;
// 交易逻辑
// ...
}
优化指标使用
在更复杂的策略中,正确地使用指标来组织工作非常重要:
public class ComplexStrategy : Strategy
{
private SimpleMovingAverage _sma;
private RelativeStrengthIndex _rsi;
private BollingerBands _bollinger;
private StandardDeviation _stdev;
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// 创建指标
_sma = new SimpleMovingAverage { Length = 20 };
_rsi = new RelativeStrengthIndex { Length = 14 };
_stdev = new StandardDeviation { Length = 20 };
_bollinger = new BollingerBands
{
SmaIndicator = _sma,
DeviationIndicator = _stdev
};
// 只添加独立指标
Indicators.Add(_sma);
Indicators.Add(_rsi);
// 不要添加 _stdev 和 _bollinger,因为它们依赖 _sma
// ...
}
// ...
}
高级功能
如果标准行为不够用,您可以在策略中重写 IsFormed 属性:
public override bool IsFormed
{
get
{
// 标准指标检查
if (!base.IsFormed)
return false;
// 额外的策略就绪条件
return _customCondition && _additionalCheck;
}
}