Торговые режимы стратегий

Обзор

Свойство TradingMode позволяет ограничить торговую активность стратегии, не останавливая её полностью. Это полезно для управления рисками -- например, запретить открытие новых позиций, разрешив только закрытие существующих, или полностью заблокировать отправку заявок.

Режим задается перечислением StrategyTradingModes и может быть изменен во время работы стратегии.

Перечисление StrategyTradingModes

Значение Описание
Full Полный доступ к торговле. Никаких ограничений на заявки. Значение по умолчанию.
Disabled Торговля полностью запрещена. Все попытки выставить заявку будут отклонены.
CancelOrdersOnly Разрешена только отмена заявок. Новые заявки и изменение существующих запрещены.
ReducePositionOnly Разрешены только заявки, уменьшающие текущую позицию. Открытие новых позиций и увеличение существующих запрещены.
LongOnly Разрешены только длинные позиции. Продажа разрешена только для закрытия существующей длинной позиции (объем продажи не может превышать текущую позицию). Открытие коротких позиций запрещено.

Установка режима

// При создании стратегии
var strategy = new MyStrategy();
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// Динамическое изменение во время работы
strategy.TradingMode = StrategyTradingModes.Disabled;

Логика проверки режима

При попытке зарегистрировать заявку стратегия проверяет текущий режим:

  • Disabled -- заявка отклоняется с причиной "торговля запрещена".
  • ReducePositionOnly -- заявка отклоняется, если текущая позиция равна нулю, если направление заявки совпадает с направлением позиции, или если объем заявки превышает абсолютное значение позиции.
  • LongOnly -- заявка на продажу отклоняется, если текущая позиция неположительная или если объем продажи превышает текущую позицию.
  • Full -- ограничений нет.
  • CancelOrdersOnly -- разрешена только отмена заявок.

Метод IsFormedAndOnlineAndAllowTrading

Метод расширения IsFormedAndOnlineAndAllowTrading проверяет, что стратегия сформирована (IsFormed), находится в онлайн-состоянии (IsOnline) и торговый режим позволяет выполнить требуемое действие:

// Проверка разрешения на полную торговлю (по умолчанию)
if (!IsFormedAndOnlineAndAllowTrading())
    return;

// Проверка разрешения только на отмену заявок
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.CancelOrdersOnly))
    CancelActiveOrders();

// Проверка разрешения на уменьшение позиции
if (!IsFormedAndOnlineAndAllowTrading(StrategyTradingModes.ReducePositionOnly))
    return;

Логика разрешений при вызове с параметром required:

Текущий TradingMode \ required Full CancelOrdersOnly ReducePositionOnly
Full да да да
Disabled нет нет нет
CancelOrdersOnly нет да нет
ReducePositionOnly нет да да
LongOnly нет да да

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

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

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

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

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

        var subscription = SubscribeCandles(CandleType);

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

    private void ProcessCandle(ICandleMessage candle)
    {
        // Проверка, что стратегия готова к полноценной торговле
        if (!IsFormedAndOnlineAndAllowTrading())
            return;

        if (candle.ClosePrice > candle.OpenPrice)
        {
            BuyMarket(Volume);
        }
        else if (candle.ClosePrice < candle.OpenPrice)
        {
            SellMarket(Volume);
        }
    }
}

// Запуск стратегии с ограничением -- только длинные позиции
var strategy = new TradingModeStrategy();
strategy.TradingMode = StrategyTradingModes.LongOnly;
strategy.Start();

// Позже -- переключить на режим закрытия позиции
strategy.TradingMode = StrategyTradingModes.ReducePositionOnly;

// Полная блокировка торговли
strategy.TradingMode = StrategyTradingModes.Disabled;

В этом примере стратегия изначально работает в режиме LongOnly, что позволяет только покупки и закрытие длинных позиций. При изменении рыночных условий режим можно переключить на ReducePositionOnly для плавного закрытия позиций, а затем на Disabled для полной остановки торговой активности.