Table of Contents

Защита позиций

Введение

В данной модификации SMA стратегии реализован механизм защиты открытых позиций с использованием локального защитного контроллера. Этот подход позволяет гибко управлять рисками и автоматически закрывать позиции при достижении определенных условий.

Ключевые компоненты защиты позиций

Защитный контроллер

В стратегии используются два ключевых объекта для защиты позиций:

// Объявление защитных контроллеров
private readonly ProtectiveController _protectiveController = new();
private IProtectivePositionController _posController;

// Этот код инициализирует основной защитный контроллер и создает место для
// контроллера конкретной позиции. ProtectiveController управляет всеми позициями,
// а IProtectivePositionController отвечает за конкретную позицию.
  • _protectiveController: Основной контроллер, управляющий защитой всех позиций.
  • _posController: Контроллер для конкретной позиции.

Инициализация защиты

При открытии новой позиции или изменении существующей происходит инициализация защитного контроллера:

// Инициализация защитного контроллера для новой позиции
this.WhenNewMyTrade()
    .Do(t =>
    {
        // ... (другой код)

        if (TakeValue.IsSet() || StopValue.IsSet())
        {
            _posController ??= _protectiveController.GetController(
                security.ToSecurityId(),
                portfolio.Name,
                new LocalProtectiveBehaviourFactory(security.PriceStep, security.Decimals),
                TakeValue, StopValue, true, default, default, true);
        }

        var info = _posController?.Update(t.Trade.Price, t.GetPosition());

        if (info is not null)
            ActiveProtection(info.Value);
    })
    .Apply(this);

// Этот код создает и инициализирует защитный контроллер для новой позиции
// при получении информации о новой сделке. Он также обновляет информацию
// о позиции в контроллере и активирует защиту, если необходимо.

Здесь создается контроллер для конкретной позиции с заданными параметрами take-profit и stop-loss.

Обновление информации о позиции

var info = _posController?.Update(t.Trade.Price, t.GetPosition());

if (info is not null)
   ActiveProtection(info.Value);

Это позволяет контроллеру отслеживать текущее состояние позиции и корректировать защитные заявки при необходимости.

Проверка условий активации защиты

В методе обработки новых данных (например, при получении новой свечи) происходит проверка условий активации защитных заявок:

// Проверка условий активации защиты в методе ProcessCandle
var info = _posController?.TryActivate(candle.ClosePrice, CurrentTime);

if (info is not null)
    ActiveProtection(info.Value);

// Этот код проверяет, нужно ли активировать защитная заявка на основе
// текущей цены (в данном случае, цены закрытия свечи) и времени.
// Если условия выполнены, вызывается метод ActiveProtection.

Здесь в качестве текущей цены используется цена закрытия свечи, но это может быть любое актуальное значение цены (например, цена последней сделки или текущий спред в стакане).

Активация защитной заявки

Если условия для активации защитной заявки выполнены, срабатывает соответствующая логика:

// Метод активации защитной заявки
private void ActiveProtection((bool isTake, Sides side, decimal price, decimal volume, OrderCondition condition) info)
{
    // отправка защитной (закрывающего позицию) заявки как обычной заявки
    RegisterOrder(this.CreateOrder(info.side, info.price, info.volume));
}

// Этот метод создает и регистрирует заявку на закрытие позиции
// на основе информации, полученной от защитного контроллера.

Этот метод создает и регистрирует заявку на закрытие позиции согласно параметрам, возвращенным защитным контроллером.

Сравнение с серверными стоп-заявками

Преимущества серверных стоп-заявок

  1. Стоп-заявка (stop loss и take profit) отправляются напрямую брокеру.
  2. Брокер самостоятельно отслеживает достижение условий стопа.
  3. При срабатывании стопа брокер автоматически выставляет рыночная или лимитная заявка.

Преимущества локального подхода

  1. Гибкость: Возможность реализации сложной логики защиты, недоступной в стандартных серверных стопах.
  2. Конфиденциальность: Информация о стоп-уровнях не передается брокеру, что может быть важно на некоторых рынках.
  3. Скорость реакции: Потенциально более быстрая реакция на изменение рыночных условий.
  4. Адаптивность: Возможность динамически корректировать уровни защиты на основе рыночных данных или логики стратегии.
  5. Независимость от реализации брокера/биржи: Локальный подход работает одинаково вне зависимости от того, поддерживает ли брокер или биржа все необходимые типы защитных заявок.
  6. Тестирование на исторических данных: Возможность полноценного тестирования стратегии с защитой позиций на исторических данных, что невозможно с серверными стопами.

Недостатки локального подхода

  1. Зависимость от работоспособности торгового терминала: При отключении терминала защита не сработает.
  2. Нагрузка на систему: Требует постоянных вычислений на стороне клиента.
  3. Задержки: Возможны задержки при выставлении заявки после срабатывания условий защиты.

Недостатки серверных стоп-заявок

  1. Зависимость от реализации брокера/биржи: Не все брокеры или биржи поддерживают все типы защитных заявок, что может ограничивать функциональность стратегии.
  2. Невозможность полноценного тестирования на исторических данных: Серверные стопы не могут быть точно смоделированы при тестировании на исторических данных, что затрудняет оценку реальной эффективности стратегии.
  3. Ограниченная гибкость: Обычно доступны только базовые типы стоп-заявок, что ограничивает возможности реализации сложных защитных механизмов.

Заключение

Использование локального защитного контроллера в SMA стратегии позволяет эффективно управлять рисками открытых позиций. Такой подход обеспечивает гибкость в настройке параметров защиты и быструю реакцию на изменения рыночной ситуации, что критично для успешной торговли.