佣金系统

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)
});

// 每 100 个订单收取 50 佣金
manager.Rules.Add(new CommissionOrderCountRule
{
    Count = 100,
    Value = 50m
});

// 每 1,000,000 成交额收取 10 佣金
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();