コミッションシステム

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