Управление рисками

Обзор

Каждая стратегия в StockSharp имеет встроенный менеджер рисков RiskManager, который позволяет автоматически контролировать торговые риски. При срабатывании правила менеджер может закрыть позиции, отменить активные заявки или полностью остановить торговлю стратегии.

Риск-менеджер обрабатывает все торговые сообщения, проходящие через стратегию, и при выполнении условий правила автоматически выполняет заданное действие без дополнительного кода в логике стратегии.

Свойства стратегии

RiskManager

Объект IRiskManager, управляющий списком правил. Создается автоматически при инициализации стратегии:

// Доступ к менеджеру рисков
IRiskManager manager = strategy.RiskManager;

RiskRules

Удобное свойство для чтения и установки списка правил:

// Чтение текущих правил
IEnumerable<IRiskRule> rules = strategy.RiskRules;

// Установка новых правил
strategy.RiskRules = new IRiskRule[]
{
    new RiskPnLRule { PnL = -1000m, Action = RiskActions.StopTrading },
    new RiskPositionSizeRule { Position = 100m, Action = RiskActions.ClosePositions },
};

Действия при срабатывании

Перечисление RiskActions определяет возможные действия:

Действие Описание
ClosePositions Закрыть все открытые позиции рыночной заявкой
StopTrading Заблокировать торговлю стратегии
CancelOrders Отменить все активные заявки

При срабатывании правила стратегия записывает предупреждение в лог с указанием имени правила, его параметров и выполненного действия.

Доступные правила

RiskPnLRule -- контроль прибыли/убытка

Срабатывает при достижении заданного уровня P&L. Положительное значение -- контроль прибыли, отрицательное -- контроль убытка:

// Остановить торговлю при убытке более 5000
new RiskPnLRule
{
    PnL = -5000m,
    Action = RiskActions.StopTrading
}

RiskPositionSizeRule -- контроль размера позиции

Срабатывает при достижении указанного размера позиции:

// Отменить заявки при позиции >= 100
new RiskPositionSizeRule
{
    Position = 100m,
    Action = RiskActions.CancelOrders
}

RiskOrderFreqRule -- контроль частоты заявок

Срабатывает, когда количество заявок за указанный интервал превышает лимит:

// Остановить при более 50 заявок за минуту
new RiskOrderFreqRule
{
    Count = 50,
    Interval = TimeSpan.FromMinutes(1),
    Action = RiskActions.StopTrading
}

RiskOrderVolumeRule -- контроль объема заявки

Срабатывает при превышении объема одной заявки.

RiskOrderPriceRule -- контроль цены заявки

Срабатывает при выходе цены заявки за установленные границы.

RiskTradeVolumeRule -- контроль объема сделки

Срабатывает при превышении объема одной сделки.

RiskTradePriceRule -- контроль цены сделки

Срабатывает при выходе цены сделки за установленные границы.

RiskTradeFreqRule -- контроль частоты сделок

Срабатывает при превышении количества сделок за интервал.

RiskPositionTimeRule -- контроль времени удержания позиции

Срабатывает, когда позиция удерживается дольше установленного времени.

RiskCommissionRule -- контроль комиссии

Срабатывает при превышении суммарной комиссии.

RiskSlippageRule -- контроль проскальзывания

Срабатывает при превышении уровня проскальзывания.

RiskErrorRule -- контроль ошибок

Срабатывает при накоплении определенного количества ошибок.

RiskOrderErrorRule -- контроль ошибок регистрации заявок

Срабатывает при накоплении ошибок регистрации заявок.

Пример использования

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);

        // Настройка правил риск-менеджмента
        RiskRules = new IRiskRule[]
        {
            // Закрыть позиции при убытке более 10000
            new RiskPnLRule
            {
                PnL = -10000m,
                Action = RiskActions.ClosePositions
            },

            // Остановить торговлю при позиции более 500 контрактов
            new RiskPositionSizeRule
            {
                Position = 500m,
                Action = RiskActions.StopTrading
            },

            // Отменить заявки при частоте более 100 в минуту
            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;

        // Торговая логика
        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));
    }
}

В этом примере правила риск-менеджмента устанавливаются при запуске стратегии. При достижении убытка в 10000 позиции будут автоматически закрыты. При превышении размера позиции в 500 контрактов торговля будет заблокирована. При слишком частом выставлении заявок активные заявки будут отменены. Все эти проверки выполняются автоматически без дополнительного кода в методе ProcessCandle.