Provisionssystem

S# implementiert ein flexibles System zur Provisionsberechnung über den CommissionManager. Der Manager nimmt Order- und Trade-Nachrichten entgegen und berechnet Provisionen anhand konfigurierter Regeln.

Die Schnittstelle ICommissionManager

Die Schnittstelle ICommissionManager definiert den Basisvertrag:

  • Rules — eine Sammlung von ICommissionRule-Regeln zur Provisionsberechnung.
  • Commission — der gesamte aufgelaufene Provisionsbetrag (decimal).
  • Reset() — setzt den Zustand des Managers und aller Regeln zurück.
  • Process(Message) — verarbeitet eine Nachricht; gibt die Provision für die angegebene Nachricht oder null zurück.

Die Schnittstelle ICommissionRule

Jede Regel implementiert ICommissionRule:

  • Title — der Titel der Regel.
  • Value — der Provisionswert (Unit), kann absolut oder prozentual sein.
  • Process(ExecutionMessage) — berechnet die Provision für eine bestimmte Nachricht.

Die Basisklasse CommissionRule enthält eine Hilfsmethode GetValue(price, volume):

  • Für absolute Werte gibt sie Value unverändert zurück.
  • Für prozentuale Werte berechnet sie (price * volume * Value) / 100.

Regeltypen

Order-Regeln

Klasse Beschreibung
CommissionOrderRule Provision pro Order (basierend auf Orderpreis und -volumen).
CommissionOrderVolumeRule Provision basierend auf dem Ordervolumen. Für absolute Werte: Value * volume.
CommissionOrderCountRule Provision für jeweils N Orders. Die Eigenschaft Count legt den Schwellenwert fest.

Trade-Regeln

Klasse Beschreibung
CommissionTradeRule Provision pro Trade (basierend auf Trade-Preis und -Volumen).
CommissionTradeVolumeRule Provision basierend auf dem Trade-Volumen.
CommissionTradePriceRule Provision: price * volume * Value.
CommissionTradeCountRule Provision für jeweils N Trades. Die Eigenschaft Count legt den Schwellenwert fest.
CommissionTurnOverRule Provision für jeden Umsatzschwellenwert. Die Eigenschaft TurnOver legt den Schwellenwert fest.

Filter-Regeln

Klasse Beschreibung
CommissionSecurityIdRule Provision nur für ein bestimmtes Instrument. Eigenschaft Security.
CommissionBoardCodeRule Provision nur für ein bestimmtes Börsenboard. Eigenschaft Board.
CommissionSecurityTypeRule Provision nur für einen bestimmten Instrumententyp. Eigenschaft SecurityType.

Integration über den Adapter

Die Klasse CommissionMessageAdapter umschließt einen inneren Adapter und berechnet automatisch Provisionen für ein- und ausgehende ExecutionMessage-Nachrichten. Wenn bei einer Nachricht das Feld Commission nicht gesetzt ist, füllt der Adapter es aus dem Manager.

Integration mit der Strategy

Die Strategie (Strategy) stellt die Eigenschaft Commission bereit, über die Sie die aufgelaufene Provision verfolgen können.

Anwendungsbeispiel

var manager = new CommissionManager();

// Feste Kommission von 1,5 pro Trade
manager.Rules.Add(new CommissionTradeRule { Value = 1.5m });

// 0,1 % des Umsatzes für Futures
manager.Rules.Add(new CommissionSecurityTypeRule
{
    SecurityType = SecurityTypes.Future,
    Value = new Unit(0.1m, UnitTypes.Percent)
});

// Kommission von 50 je 100 Orders
manager.Rules.Add(new CommissionOrderCountRule
{
    Count = 100,
    Value = 50m
});

// Kommission von 10 je 1.000.000 Umsatz
manager.Rules.Add(new CommissionTurnOverRule
{
    TurnOver = 1_000_000m,
    Value = 10m
});

// Nachricht verarbeiten
decimal? commission = manager.Process(executionMsg);
if (commission != null)
{
    Console.WriteLine($"Kommission für Nachricht: {commission.Value}");
}

// Gesamte aufgelaufene Kommission
Console.WriteLine($"Gesamte Kommission: {manager.Commission}");

Zustand zurücksetzen

Die Methode Reset() setzt die Gesamtprovision auf null zurück und ruft Reset() bei jeder Regel auf, wodurch interne Zähler (Orderanzahl, aktueller Umsatz usw.) gelöscht werden:

manager.Reset();