スリッページ測定

S# は、SlippageManager を通じてスリッページを計算します。スリッページとは、注文の期待約定価格と実際の取引価格との差です。

ISlippageManager インターフェイス

ISlippageManager インターフェイスは、基本契約を定義します。

  • Slippage — 累積スリッページ合計(decimal)。
  • Reset() — マネージャーの状態をリセットします。
  • ProcessMessage(Message) — メッセージを処理します。指定された約定のスリッページを返すか、null を返します。

仕組み

スリッページマネージャーは 3 段階で動作します。

1. 市場価格の更新

Level1ChangeMessage または QuoteChangeMessage を受信すると、マネージャーは各銘柄の最良 Bid/Ask 価格を保存します。

2. 予定価格の保存

OrderRegisterMessage を受信すると、マネージャーは「予定価格」、つまり注文登録時点の最良市場価格を保存します。

  • 買い(Buy)の場合は、最良 Ask が使用されます。
  • 売り(Sell)の場合は、最良 Bid が使用されます。

3. スリッページの計算

取引を含む ExecutionMessage を受信すると、マネージャーはスリッページを計算します。

  • 買いの場合: (TradePrice - PlannedPrice) * TradeVolume
  • 売りの場合: (PlannedPrice - TradePrice) * TradeVolume

正の値は不利なスリッページ(期待より悪い価格)を意味し、負の値は有利なスリッページ(期待より良い価格)を意味します。

状態: ISlippageManagerState

ISlippageManagerState インターフェイスは、マネージャーの内部状態を保存します。

  • 各銘柄(SecurityId)の最良 Bid/Ask 価格。
  • 各トランザクション(TransactionId)の予定価格と方向。
  • 累積スリッページ合計。

デフォルト実装は SlippageManagerState です。

設定

プロパティ デフォルト 説明
CalculateNegative true 有利なスリッページを考慮します。false の場合、負の値はゼロに置き換えられます。

アダプター経由の統合

SlippageMessageAdapter クラスは内部アダプターをラップし、すべての取引についてスリッページを自動的に計算します。

戦略との統合

戦略(Strategy)は、全体的なスリッページを追跡するための Slippage プロパティを公開します。

使用例

// 状態ストアを持つマネージャーを作成
var manager = new SlippageManager(new SlippageManagerState());

// 不利なスリッページのみを考慮
manager.CalculateNegative = false;

// 市場データの処理(最良価格の更新)
manager.ProcessMessage(level1Msg);
manager.ProcessMessage(quoteChangeMsg);

// 注文登録の処理(予定価格の保存)
manager.ProcessMessage(orderRegisterMsg);

// 取引の処理(スリッページの計算)
decimal? slippage = manager.ProcessMessage(executionMsg);
if (slippage != null)
{
    Console.WriteLine($"Slippage: {slippage.Value}");
}

// 累積スリッページ合計
Console.WriteLine($"Total slippage: {manager.Slippage}");

状態のリセット

Reset() メソッドは、最良価格、予定価格、累積スリッページを含む内部状態を完全にクリアします。

manager.Reset();