コミッションシステム
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();