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 Value tal 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();