Система комиссий
В 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();