Sistema de comisiones
S# implementa un sistema flexible de cálculo de comisiones a través de CommissionManager. El gestor acepta mensajes de órdenes y operaciones y calcula las comisiones en función de las reglas configuradas.
Interfaz ICommissionManager
La interfaz ICommissionManager define el contrato base:
- Rules — una colección de reglas ICommissionRule para el cálculo de comisiones.
- Commission — el monto total acumulado de la comisión (decimal).
- Reset() — restablece el estado del gestor y de todas las reglas.
- Process(Message) — procesa un mensaje; devuelve la comisión para el mensaje dado o
null.
Interfaz ICommissionRule
Cada regla implementa ICommissionRule:
- Title — el título de la regla.
- Value — el valor de la comisión (Unit), puede ser absoluto o basado en porcentaje.
- Process(ExecutionMessage) — calcula la comisión para un mensaje específico.
La clase base CommissionRule contiene un método auxiliar GetValue(price, volume):
- Para valores absolutos, devuelve
Valuetal cual. - Para valores porcentuales, calcula
(price * volume * Value) / 100.
Tipos de reglas
Reglas de órdenes
| Clase | Descripción |
|---|---|
| CommissionOrderRule | Comisión por orden (basada en el precio y el volumen de la orden). |
| CommissionOrderVolumeRule | Comisión basada en el volumen de la orden. Para valores absolutos: Value * volume. |
| CommissionOrderCountRule | Comisión por cada N órdenes. La propiedad Count establece el umbral. |
Reglas de operaciones
| Clase | Descripción |
|---|---|
| CommissionTradeRule | Comisión por operación (basada en el precio y el volumen de la operación). |
| CommissionTradeVolumeRule | Comisión basada en el volumen de la operación. |
| CommissionTradePriceRule | Comisión: price * volume * Value. |
| CommissionTradeCountRule | Comisión por cada N operaciones. La propiedad Count establece el umbral. |
| CommissionTurnOverRule | Comisión por cada umbral de volumen de negociación. La propiedad TurnOver establece el umbral. |
Reglas de filtro
| Clase | Descripción |
|---|---|
| CommissionSecurityIdRule | Comisión solo para un instrumento específico. Propiedad Security. |
| CommissionBoardCodeRule | Comisión solo para una plataforma de negociación específica. Propiedad Board. |
| CommissionSecurityTypeRule | Comisión solo para un tipo de instrumento específico. Propiedad SecurityType. |
Integración mediante adaptador
La clase CommissionMessageAdapter envuelve un adaptador interno y calcula automáticamente las comisiones en los mensajes ExecutionMessage entrantes y salientes. Si un mensaje no tiene establecido el campo Commission, el adaptador lo completa a partir del gestor.
Integración con Strategy
La estrategia (Strategy) expone la propiedad Commission, mediante la cual se puede rastrear la comisión acumulada.
Ejemplo de uso
var manager = new CommissionManager();
// Comisión fija de 1,5 por operación
manager.Rules.Add(new CommissionTradeRule { Value = 1.5m });
// 0,1 % del volumen de negocio para futuros
manager.Rules.Add(new CommissionSecurityTypeRule
{
SecurityType = SecurityTypes.Future,
Value = new Unit(0.1m, UnitTypes.Percent)
});
// Comisión de 50 por cada 100 órdenes
manager.Rules.Add(new CommissionOrderCountRule
{
Count = 100,
Value = 50m
});
// Comisión de 10 por cada 1.000.000 de volumen
manager.Rules.Add(new CommissionTurnOverRule
{
TurnOver = 1_000_000m,
Value = 10m
});
// Procesar mensaje
decimal? commission = manager.Process(executionMsg);
if (commission != null)
{
Console.WriteLine($"Comisión por mensaje: {commission.Value}");
}
// Comisión acumulada total
Console.WriteLine($"Comisión total: {manager.Commission}");
Restablecimiento del estado
El método Reset() restablece la comisión total a cero y llama a Reset() en cada regla, lo que borra los contadores internos (número de órdenes, volumen de negociación actual, etc.):
manager.Reset();