Система комиссий

В S# реализована гибкая система расчёта комиссий через менеджер CommissionManager. Менеджер принимает сообщения о заявках и сделках и вычисляет комиссию на основе настроенных правил.

Интерфейс ICommissionManager

Интерфейс ICommissionManager определяет базовый контракт:

  • Rules — коллекция правил ICommissionRule для расчёта комиссии.
  • Commission — общая накопленная сумма комиссии (decimal).
  • Reset() — сброс состояния менеджера и всех правил.
  • Process(Message) — обработка сообщения; возвращает комиссию за данное сообщение или null.

Интерфейс ICommissionRule

Каждое правило реализует ICommissionRule:

  • Title — заголовок правила.
  • Value — значение комиссии (Unit), может быть абсолютным или процентным.
  • Process(ExecutionMessage) — рассчитать комиссию для конкретного сообщения.

Базовый класс CommissionRule содержит вспомогательный метод GetValue(price, volume):

  • Для абсолютных значений возвращает Value как есть.
  • Для процентных значений вычисляет (price * volume * Value) / 100.

Типы правил

Правила для заявок

Класс Описание
CommissionOrderRule Комиссия за каждую заявку (по цене и объёму заявки).
CommissionOrderVolumeRule Комиссия за объём заявки. Для абсолютных значений: Value * volume.
CommissionOrderCountRule Комиссия за каждые N заявок. Свойство Count задаёт порог.

Правила для сделок

Класс Описание
CommissionTradeRule Комиссия за каждую сделку (по цене и объёму сделки).
CommissionTradeVolumeRule Комиссия за объём сделки.
CommissionTradePriceRule Комиссия: price * volume * Value.
CommissionTradeCountRule Комиссия за каждые N сделок. Свойство Count задаёт порог.
CommissionTurnOverRule Комиссия за каждый порог оборота. Свойство TurnOver задаёт порог.

Правила-фильтры

Класс Описание
CommissionSecurityIdRule Комиссия только для конкретного инструмента. Свойство Security.
CommissionBoardCodeRule Комиссия только для конкретной площадки. Свойство Board.
CommissionSecurityTypeRule Комиссия только для определённого типа инструмента. Свойство SecurityType.

Интеграция через адаптер

Класс CommissionMessageAdapter оборачивает внутренний адаптер и автоматически рассчитывает комиссию на входящих и исходящих ExecutionMessage. Если у сообщения не установлено поле Commission, адаптер заполняет его из менеджера.

Интеграция со стратегией

Стратегия (Strategy) предоставляет свойство Commission, через которое можно отслеживать накопленную комиссию.

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

var manager = new CommissionManager();

// Фиксированная комиссия 1.5 за каждую сделку
manager.Rules.Add(new CommissionTradeRule { Value = 1.5m });

// 0.1% от оборота для фьючерсов
manager.Rules.Add(new CommissionSecurityTypeRule
{
    SecurityType = SecurityTypes.Future,
    Value = new Unit(0.1m, UnitTypes.Percent)
});

// Комиссия 50 за каждые 100 заявок
manager.Rules.Add(new CommissionOrderCountRule
{
    Count = 100,
    Value = 50m
});

// Комиссия 10 за каждые 1 000 000 оборота
manager.Rules.Add(new CommissionTurnOverRule
{
    TurnOver = 1_000_000m,
    Value = 10m
});

// Обработка сообщения
decimal? commission = manager.Process(executionMsg);
if (commission != null)
{
    Console.WriteLine($"Комиссия за сообщение: {commission.Value}");
}

// Общая накопленная комиссия
Console.WriteLine($"Итого комиссия: {manager.Commission}");

Сброс состояния

Метод Reset() обнуляет общую комиссию и вызывает Reset() у каждого правила, что сбрасывает внутренние счётчики (количество заявок, текущий оборот и т.д.):

manager.Reset();