Gestión de riesgos

Descripción general

Cada estrategia en StockSharp tiene un RiskManager integrado que permite el control automático de riesgos de trading. Cuando se activa una regla, el gestor puede cerrar posiciones, cancelar órdenes activas o detener por completo el trading de la estrategia.

El gestor de riesgos procesa todos los mensajes de trading que pasan por la estrategia y, cuando se cumplen las condiciones de una regla, realiza automáticamente la acción especificada sin código adicional en la lógica de la estrategia.

Propiedades de estrategia

RiskManager

El objeto IRiskManager que gestiona la lista de reglas. Se crea automáticamente cuando se inicializa la estrategia:

// Acceder al gestor de riesgos
IRiskManager manager = strategy.RiskManager;

RiskRules

Una propiedad cómoda para leer y establecer la lista de reglas:

// Leer reglas actuales
IEnumerable<IRiskRule> rules = strategy.RiskRules;

// Establecer nuevas reglas
strategy.RiskRules = new IRiskRule[]
{
    new RiskPnLRule { PnL = -1000m, Action = RiskActions.StopTrading },
    new RiskPositionSizeRule { Position = 100m, Action = RiskActions.ClosePositions },
};

Acciones de activación

La enumeración RiskActions define las acciones posibles:

Acción Descripción
ClosePositions Cerrar todas las posiciones abiertas con una orden de mercado
StopTrading Bloquear el trading de la estrategia
CancelOrders Cancelar todas las órdenes activas

Cuando se activa una regla, la estrategia registra una advertencia con el nombre de la regla, sus parámetros y la acción realizada.

Reglas disponibles

RiskPnLRule -- control de beneficios/pérdidas

Se activa cuando se alcanza el nivel de P&L especificado. Un valor positivo controla beneficios y uno negativo controla pérdidas:

// Detener el trading ante una pérdida superior a 5000
new RiskPnLRule
{
    PnL = -5000m,
    Action = RiskActions.StopTrading
}

RiskPositionSizeRule -- control del tamaño de posición

Se activa cuando se alcanza el tamaño de posición especificado:

// Cancelar órdenes cuando position >= 100
new RiskPositionSizeRule
{
    Position = 100m,
    Action = RiskActions.CancelOrders
}

RiskOrderFreqRule -- control de frecuencia de órdenes

Se activa cuando el número de órdenes dentro del intervalo especificado supera el límite:

// Detener con más de 50 órdenes por minuto
new RiskOrderFreqRule
{
    Count = 50,
    Interval = TimeSpan.FromMinutes(1),
    Action = RiskActions.StopTrading
}

RiskOrderVolumeRule -- control de volumen de órdenes

Se activa cuando se supera el volumen de una sola orden.

RiskOrderPriceRule -- control de precio de órdenes

Se activa cuando el precio de la orden va más allá de los límites establecidos.

RiskTradeVolumeRule -- control de volumen de operaciones

Se activa cuando se supera el volumen de una sola operación.

RiskTradePriceRule -- control de precio de operaciones

Se activa cuando el precio de la operación va más allá de los límites establecidos.

RiskTradeFreqRule -- control de frecuencia de operaciones

Se activa cuando se supera el número de operaciones dentro del intervalo.

RiskPositionTimeRule -- control del tiempo de mantenimiento de posición

Se activa cuando una posición se ha mantenido durante más tiempo que el establecido.

RiskCommissionRule -- control de comisión

Se activa cuando se supera la comisión total.

RiskSlippageRule -- control de slippage

Se activa cuando se supera el nivel de slippage.

RiskErrorRule -- control de errores

Se activa cuando se ha acumulado una determinada cantidad de errores.

RiskOrderErrorRule -- control de errores de registro de órdenes

Se activa cuando se han acumulado errores de registro de órdenes.

Ejemplo de uso

public class RiskAwareStrategy : Strategy
{
    private readonly StrategyParam<DataType> _candleType;

    public DataType CandleType
    {
        get => _candleType.Value;
        set => _candleType.Value = value;
    }

    public RiskAwareStrategy()
    {
        _candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
    }

    protected override void OnStarted2(DateTime time)
    {
        base.OnStarted2(time);

        // Configurar reglas de gestión de riesgos
        RiskRules = new IRiskRule[]
        {
            // Cerrar posiciones ante una pérdida superior a 10000
            new RiskPnLRule
            {
                PnL = -10000m,
                Action = RiskActions.ClosePositions
            },

            // Detener el trading cuando la posición supera 500 contratos
            new RiskPositionSizeRule
            {
                Position = 500m,
                Action = RiskActions.StopTrading
            },

            // Cancelar órdenes cuando la frecuencia supera 100 por minuto
            new RiskOrderFreqRule
            {
                Count = 100,
                Interval = TimeSpan.FromMinutes(1),
                Action = RiskActions.CancelOrders
            },
        };

        var subscription = SubscribeCandles(CandleType);

        subscription
            .Bind(ProcessCandle)
            .Start();
    }

    private void ProcessCandle(ICandleMessage candle)
    {
        if (!IsFormedAndOnlineAndAllowTrading())
            return;

        // Lógica de trading
        if (candle.OpenPrice < candle.ClosePrice && Position <= 0)
            BuyMarket(Volume + Math.Abs(Position));
        else if (candle.OpenPrice > candle.ClosePrice && Position >= 0)
            SellMarket(Volume + Math.Abs(Position));
    }
}

En este ejemplo, las reglas de gestión de riesgos se establecen cuando se inicia la estrategia. Cuando se alcanza una pérdida de 10000, las posiciones se cerrarán automáticamente. Cuando el tamaño de posición supera 500 contratos, el trading se bloqueará. Cuando las órdenes se colocan con demasiada frecuencia, las órdenes activas se cancelarán. Todas estas comprobaciones se realizan automáticamente sin código adicional en el método ProcessCandle.