マーケットメイカー保護 (MMP)
マーケットメイカー向けの約定ウィンドウ制限と自動キャンセル動作について説明します。
概要
MMPは以下の仕組みにより、急激な不利な約定からマーケットメイカーを保護します:
- ローリングタイムウィンドウ内での累積約定メトリクスの追跡
- 制限を超過した場合の注文キャンセル
- 同一ウォレット+原資産に対する他のすべてのMMP有効注文の自動キャンセル
設定
MMP設定の登録
エンドポイント: POST /mmp-config
リクエスト: SetMmpConfigRequest
{
"wallet": "0x...",
"currency": "BTC",
"interval_ms": 60000,
"frozen_time_ms": 300000,
"qty_limit": 1000000,
"delta_limit": 10.0,
"vega_limit": 5.0,
"enabled": true,
"nonce": 1,
"signature": "0x..."
}
フィールド:
wallet: ウォレットアドレスcurrency: 原資産通貨(例:"BTC"、"ETH")interval_ms: ローリングウィンドウの長さ(ミリ秒)frozen_time_ms: トリガー後のフリーズ期間(ミリ秒)qty_limit: 数量制限(契約単位、任意)delta_limit: デルタ制限(任意)vega_limit: ベガ制限(任意)enabled: このウォレット+通貨に対してMMPを有効にするかどうか
レスポンス: ApiResponse<MmpConfigData>
MMP設定の取得
エンドポイント: GET /mmp-config?wallet=...¤cy=...
クエリパラメータ:
wallet(必須)currency(任意のフィルター)
レスポンス: MmpConfigResponse
{
"success": true,
"data": [
{
"wallet_address": "0x...",
"currency": "BTC",
"interval_ms": 60000,
"frozen_time_ms": 300000,
"qty_limit": 1000000,
"delta_limit": 10.0,
"vega_limit": 5.0,
"enabled": true
}
]
}
MMP設定の削除
エンドポイント: DELETE /mmp-config
リクエスト: DeleteMmpConfigRequest
{
"wallet": "0x...",
"currency": "BTC",
"nonce": 1,
"signature": "0x..."
}
レスポンス: ApiResponse<String>
MMP状態のリセット
エンドポイント: POST /mmp-config/reset
リクエスト: ResetMmpRequest
{
"wallet": "0x...",
"currency": "BTC",
"nonce": 1,
"signature": "0x..."
}
レスポンス: ApiResponse<String>
備考: MMPの約定ウィンドウ状態をリセットします(累積メトリクスのクリア、通貨のフリーズ解除)。
MMPの動作(重要な理解事項)
約定処理の順序
MMPの評価は約定後(POST-FILL)に行われます:
- エンジンはまずマッチングを行い、約定を先に受け入れます
- その後、MMPが累積メトリクスをチェックします
- 制限が超過している場合:
- MMPがトリガーされます
- アクティブな注文の残数量の処理が停止します
- 注文は理由
"MMP triggered during fill processing"によりCANCELEDになります - エンジンが
MmpTriggeredイベントを発行します - エンジンは同一ウォレット+原資産に対する他のすべてのMMP有効なオープン注文を自動キャンセルします
含意: MMPがトリガーされる前に、設定した閾値を超える約定を受ける可能性があります。
トリガー条件
設定された制限のいずれかが超過した場合、MMPがトリガーされます:
- 数量制限:
cumulative_qty > qty_limit - デルタ制限:
|cumulative_delta| > delta_limit - ベガ制限:
|cumulative_vega| > vega_limit
累積メトリクスはローリングウィンドウ(interval_ms)にわたって計算されます。
キャンセル動作
MMPがトリガーされた場合:
- アクティブな注文: 残数量の処理が停止し、注文は理由
"MMP triggered during fill processing"によりCANCELEDになります - 他の注文: 同一ウォレット+原資産に対する他のすべてのMMP有効なオープン注文は、理由
"Order canceled by MMP trigger"により自動キャンセルされます
注意: キャンセルされるのはMMPが有効な注文のみです。mmp_enabled=false の注文は影響を受けません。
フリーズ動作
MMPトリガー後:
- 通貨は
frozen_time_msミリ秒間フリーズされます - フリーズ中は、新規の約定が拒否される場合があります(実装依存)
約定メトリクスの計算
数量
- ソース: 約定の
size(契約単位) - 累積: ローリングウィンドウ内のすべての約定の合計
デルタ
- ソース: 約定銘柄とGreeksCacheから計算
- 累積: ローリングウィンドウ内のすべての約定デルタの合計
ベガ
- ソース: 約定銘柄とGreeksCacheから計算
- 累積: ローリングウィンドウ内のすべての約定ベガの合計
ローリングウィンドウ
ウィンドウからの退去
interval_ms より古い約定は、ウィンドウから自動的に退去されます:
- 退去処理は定期的に実行されます(バックグラウンドタスク)
- 古い約定が削除されると、累積メトリクスが減算されます
ウィンドウのリセット
POST /mmp-config/reset によりMMP状態をリセットします:
- ウィンドウ内のすべての約定をクリア
- 累積メトリクスをゼロにリセット
- 通貨のフリーズを解除
MMPイベント
MmpTriggered イベント
内部イベント(現在WSクライアントには転送されません):
MmpTriggeredMessage {
wallet: WalletAddress,
currency: String,
reason: String, // "qty_limit" | "delta_limit" | "vega_limit"
}
ベストプラクティス
設定
- 適切な制限を設定する: リスク許容度と典型的な約定サイズに基づいて設定します
- 通貨ごとの設定を使用する: 原資産ごと(BTC、ETHなど)に設定します
- MMPトリガーを監視する: トリガー頻度が高い場合、制限の設定ミスや不利な市場状況を示している可能性があります
注文管理
- MMPを選択的に有効化する: 保護したい注文にのみ
mmp_enabled=trueを設定します - 一貫した通貨を使用する: 同一の原資産に対するすべての注文が、MMP設定内で同じ通貨を使用していることを確認します
- MMPによるキャンセルに対応する: MMPトリガーによるキャンセルを検出し、クオートを調整するロジックを実装します
監視
- MMPトリガーを追跡する: 理由
"MMP triggered during fill processing"および"Order canceled by MMP trigger"を監視します - 約定ウィンドウを確認する: MMP設定を通じて累積メトリクスを確認します(現在APIでは公開されていません)
- 制限を調整する: MMPのトリガーが頻繁すぎる場合は制限を引き上げ、少なすぎる場合は制限を引き下げます
よくある問題
MMPのトリガーが頻繁すぎる
原因:
- 典型的な約定サイズに対して制限が低すぎる
- 不利な市場状況
- 高頻度のクオートによる多数の約定
解決策:
qty_limit、delta_limit、またはvega_limitを引き上げるinterval_msを延長し、ウィンドウ内でより多くの約定を許容する- クオート頻度を下げる
MMPがトリガーされない
原因:
- 制限が高すぎる
- 注文でMMPが有効になっていない(
mmp_enabled=false) - 通貨の不一致(MMP設定の通貨 != 注文の原資産)
解決策:
- 制限を引き下げる
- 注文で
mmp_enabled=trueになっていることを確認する - MMP設定の通貨が注文の原資産と一致していることを確認する
予期しないキャンセル
症状: 理由 "Order canceled by MMP trigger" で注文がキャンセルされたが、想定外だった。
原因: 同一ウォレット+原資産に対する別の注文がMMPをトリガーした。
解決策: いずれかの注文がトリガーされた際は、同一原資産に対するすべてのMMP有効注文を確認してください。