Защита позиций
Введение
В данной модификации 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));
}
// Этот метод создает и регистрирует заявку на закрытие позиции
// на основе информации, полученной от защитного контроллера.
Этот метод создает и регистрирует заявку на закрытие позиции согласно параметрам, возвращенным защитным контроллером.
Сравнение с серверными стоп-заявками
Преимущества серверных стоп-заявок
- Стоп-заявка (stop loss и take profit) отправляются напрямую брокеру.
- Брокер самостоятельно отслеживает достижение условий стопа.
- При срабатывании стопа брокер автоматически выставляет рыночная или лимитная заявка.
Преимущества локального подхода
- Гибкость: Возможность реализации сложной логики защиты, недоступной в стандартных серверных стопах.
- Конфиденциальность: Информация о стоп-уровнях не передается брокеру, что может быть важно на некоторых рынках.
- Скорость реакции: Потенциально более быстрая реакция на изменение рыночных условий.
- Адаптивность: Возможность динамически корректировать уровни защиты на основе рыночных данных или логики стратегии.
- Независимость от реализации брокера/биржи: Локальный подход работает одинаково вне зависимости от того, поддерживает ли брокер или биржа все необходимые типы защитных заявок.
- Тестирование на исторических данных: Возможность полноценного тестирования стратегии с защитой позиций на исторических данных, что невозможно с серверными стопами.
Недостатки локального подхода
- Зависимость от работоспособности торгового терминала: При отключении терминала защита не сработает.
- Нагрузка на систему: Требует постоянных вычислений на стороне клиента.
- Задержки: Возможны задержки при выставлении заявки после срабатывания условий защиты.
Недостатки серверных стоп-заявок
- Зависимость от реализации брокера/биржи: Не все брокеры или биржи поддерживают все типы защитных заявок, что может ограничивать функциональность стратегии.
- Невозможность полноценного тестирования на исторических данных: Серверные стопы не могут быть точно смоделированы при тестировании на исторических данных, что затрудняет оценку реальной эффективности стратегии.
- Ограниченная гибкость: Обычно доступны только базовые типы стоп-заявок, что ограничивает возможности реализации сложных защитных механизмов.
Заключение
Использование локального защитного контроллера в SMA стратегии позволяет эффективно управлять рисками открытых позиций. Такой подход обеспечивает гибкость в настройке параметров защиты и быструю реакцию на изменения рыночной ситуации, что критично для успешной торговли.