Измерение проскальзывания
В S# проскальзывание (slippage) рассчитывается через менеджер SlippageManager. Проскальзывание — это разница между ожидаемой ценой исполнения заявки и фактической ценой сделки.
Интерфейс ISlippageManager
Интерфейс ISlippageManager определяет базовый контракт:
- Slippage — общее накопленное проскальзывание (decimal).
- Reset() — сброс состояния менеджера.
- ProcessMessage(Message) — обработка сообщения; возвращает проскальзывание для данного исполнения или
null.
Принцип работы
Менеджер проскальзывания работает в три этапа:
1. Обновление рыночных цен
При получении Level1ChangeMessage или QuoteChangeMessage менеджер сохраняет лучшие цены bid и ask для каждого инструмента.
2. Запоминание планируемой цены
При получении OrderRegisterMessage менеджер сохраняет "планируемую цену" — лучшую рыночную цену на момент регистрации заявки:
- Для покупки (
Buy) берётся лучший ask. - Для продажи (
Sell) берётся лучший bid.
3. Расчёт проскальзывания
При получении ExecutionMessage со сделкой менеджер вычисляет проскальзывание:
- Для покупки:
(TradePrice - PlannedPrice) * TradeVolume - Для продажи:
(PlannedPrice - TradePrice) * TradeVolume
Положительное значение означает неблагоприятное проскальзывание (цена хуже ожидаемой), отрицательное — благоприятное (цена лучше ожидаемой).
Состояние: ISlippageManagerState
Интерфейс ISlippageManagerState хранит внутреннее состояние менеджера:
- Лучшие цены bid/ask по каждому инструменту (SecurityId).
- Планируемые цены и направления по каждой транзакции (
TransactionId). - Общее накопленное проскальзывание.
Реализация по умолчанию — SlippageManagerState.
Настройки
| Свойство | По умолчанию | Описание |
|---|---|---|
CalculateNegative |
true |
Учитывать благоприятное проскальзывание. Если false, отрицательные значения заменяются нулём. |
Интеграция через адаптер
Класс SlippageMessageAdapter оборачивает внутренний адаптер и автоматически рассчитывает проскальзывание для всех сделок.
Интеграция со стратегией
Стратегия (Strategy) предоставляет свойство Slippage для отслеживания общего проскальзывания.
Пример использования
// Создание менеджера с хранилищем состояния
var manager = new SlippageManager(new SlippageManagerState());
// Учитывать только неблагоприятное проскальзывание
manager.CalculateNegative = false;
// Обработка рыночных данных (обновление лучших цен)
manager.ProcessMessage(level1Msg);
manager.ProcessMessage(quoteChangeMsg);
// Обработка регистрации заявки (запоминание планируемой цены)
manager.ProcessMessage(orderRegisterMsg);
// Обработка сделки (расчёт проскальзывания)
decimal? slippage = manager.ProcessMessage(executionMsg);
if (slippage != null)
{
Console.WriteLine($"Проскальзывание: {slippage.Value}");
}
// Общее накопленное проскальзывание
Console.WriteLine($"Итого проскальзывание: {manager.Slippage}");
Сброс состояния
Метод Reset() полностью очищает внутреннее состояние: лучшие цены, планируемые цены и накопленное проскальзывание:
manager.Reset();