Indicadores en estrategias
En StockSharp, la clase Strategy proporciona un mecanismo especial para trabajar con indicadores, que permite controlar su estado de formación y determinar cuándo la estrategia está lista para trabajar.
Propiedad Indicators
La propiedad Strategy.Indicators es una colección de indicadores usados en la estrategia. Esta colección está diseñada para realizar seguimiento automático del estado de formación de los indicadores (warm-up).
// Acceso a la colección de indicadores
INotifyList<IIndicator> indicators = strategy.Indicators;
Propiedad IsFormed
De forma predeterminada, la implementación de la propiedad Strategy.IsFormed comprueba si todos los indicadores de la colección Indicators están formados:
// Implementación estándar en la clase Strategy
public virtual bool IsFormed => _indicators.AllFormed;
Una estrategia se considera "calentada" y lista para trabajar cuando todos los indicadores de la colección están formados (su propiedad IIndicator.IsFormed devuelve true).
Agregar indicadores a la colección
Para determinar correctamente cuándo la estrategia está lista, debe agregar los indicadores que usa a la colección Indicators:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// Crear indicadores
_shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
_longSma = new SimpleMovingAverage { Length = LongSmaLength };
// Agregar indicadores a la colección
Indicators.Add(_shortSma);
Indicators.Add(_longSma);
// ...
}
Qué indicadores agregar
Debe agregar solo indicadores independientes a la colección Indicators. Esta es una regla importante que ayuda a evitar esperas innecesarias y a determinar correctamente cuándo la estrategia está lista.
Reglas para agregar indicadores:
Indicadores independientes - agregue indicadores que procesan directamente datos de mercado (velas, ticks, etc.):
// Indicadores independientes var sma = new SimpleMovingAverage { Length = 20 }; var rsi = new RelativeStrengthIndex { Length = 14 }; Indicators.Add(sma); Indicators.Add(rsi);Cadenas de indicadores - al usar una cadena de indicadores (donde la salida de uno es la entrada de otro), agregue a la colección solo el primer indicador de la cadena:
// Cadena de indicadores var sma = new SimpleMovingAverage { Length = 20 }; var stdev = new StandardDeviation { Length = 20 }; var bollingerBands = new BollingerBands { SmaIndicator = sma, DeviationIndicator = stdev }; // Agregar solo el primer indicador de la cadena Indicators.Add(sma); // NO agregue indicadores dependientes de otros indicadores // Indicators.Add(stdev); - incorrecto // Indicators.Add(bollingerBands); - incorrectoIndicadores combinados - para indicadores que usan varios indicadores independientes (por ejemplo, MACD), agréguelos todos:
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 }; // Agregar indicadores base Indicators.Add(fastEma); Indicators.Add(slowEma);
Ejemplos de uso
Ejemplo básico con dos medias móviles
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 };
// Agregar indicadores a la colección para seguir su estado
Indicators.Add(_longSma);
Indicators.Add(_shortSma);
// ...
}
private void ProcessCandle(ICandleMessage candle)
{
// Procesar indicadores
var longValue = _longSma.Process(candle);
var shortValue = _shortSma.Process(candle);
// Comprobar si la estrategia está lista antes de ejecutar la lógica de trading
if (!IsFormed)
return;
// Lógica de trading
// ...
}
}
Ejemplo usando IsFormedAndOnline
Para comprobar si la estrategia está lista para operar, a menudo se usa el método IsFormedAndOnlineAndAllowTrading, que combina la comprobación de formación de indicadores, estado online y permiso de trading:
private void ProcessCandle(ICandleMessage candle)
{
// Procesar indicadores
var longValue = _longSma.Process(candle);
var shortValue = _shortSma.Process(candle);
// Comprobación integral de preparación de la estrategia
if (!IsFormedAndOnlineAndAllowTrading())
return;
// Lógica de trading
// ...
}
Optimización del uso de indicadores
En estrategias más complejas, es importante organizar correctamente el trabajo con indicadores:
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);
// Crear indicadores
_sma = new SimpleMovingAverage { Length = 20 };
_rsi = new RelativeStrengthIndex { Length = 14 };
_stdev = new StandardDeviation { Length = 20 };
_bollinger = new BollingerBands
{
SmaIndicator = _sma,
DeviationIndicator = _stdev
};
// Agregar solo indicadores independientes
Indicators.Add(_sma);
Indicators.Add(_rsi);
// No agregue _stdev ni _bollinger, ya que dependen de _sma
// ...
}
// ...
}
Funciones avanzadas
Puede sobrescribir la propiedad IsFormed en su estrategia si el comportamiento estándar no es suficiente:
public override bool IsFormed
{
get
{
// Comprobación estándar de indicadores
if (!base.IsFormed)
return false;
// Condiciones adicionales de preparación de la estrategia
return _customCondition && _additionalCheck;
}
}