佣金系统

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