佣金系统
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();