セルフトレード防止 (STP)
セルフトレード(自己取引)に対する自動保護機能です。
概要
新規(テイカー)注文が同一ウォレットの待機(メイカー)注文とマッチしそうになった場合、エンジンは約定させる代わりに両方の注文をキャンセルします。これにより、ウォッシュトレードを防止し、マーケットメイカーが誤って自身のクォートとクロスすることを防ぎます。
STP は常に有効です。設定項目、オプトアウト、代替モードは一切ありません。
動作
戦略:両注文キャンセル (Cancel Both)
セルフトレードが検出された場合:
- メイカー注文は理由
"Self-trade prevention"でキャンセルされます - テイカー注文は拒否(それまでの約定がない場合)またはキャンセル(部分約定している場合)されます
2 つの注文間で約定は発生しません。
ウォレット単位でのマッチング
STP はエージェントキーではなく、ウォレットアドレスを比較します。エージェント認可を使用して複数のキーから注文に署名している場合でも、同一のトレーディングウォレット配下のすべての注文は相互に STP の対象となります。
部分約定は保持されます
テイカー注文がセルフトレードに遭遇する前に他のカウンターパーティと約定した場合、それらの約定は保持されます。
例: 注文板にウォレット B が提示する 5 契約、続いてウォレット A が提示する 5 契約があるとします。ウォレット A が 10 契約の買い注文を出した場合:
| ステップ | マッチ相手 | 結果 |
|---|---|---|
| 1 | ウォレット B (5 契約) | 約定: 5 契約が執行される |
| 2 | ウォレット A (5 契約) | セルフトレードを検出 |
結果:
- ウォレット A はウォレット B に対して 5 契約の約定を受け取ります
- ウォレット A のメイカー注文 (5 契約) はキャンセルされます
- ウォレット A のテイカー注文は
filled_size: 5の状態でキャンセルされます
注文ステータス
| シナリオ | テイカーのステータス | 理由 |
|---|---|---|
| 事前の約定なし | Rejected | "Self-trade prevention" |
| セルフトレード前に部分約定あり | Canceled | "Self-trade prevention (partial fill kept)" |
メイカー注文は常に理由 "Self-trade prevention" で Canceled となります。
GTC 注文はセルフトレード後に板に残りません
GTC のテイカー注文が STP をトリガーした場合、通常であれば板に残る注文であっても、残数量は注文板に追加されません。注文は完全に終了します。
WebSocket 通知
テイカーとメイカー双方のキャンセル/拒否は、order_updates チャンネルで配信されます。reason フィールドが STP が原因であることを示します。
モニタリング
STP イベントは Prometheus カウンター ht_engine_self_trade_prevented_total をインクリメントします。
FAQ
別の STP モード(例: 新しい注文のキャンセル (cancel-newest) や数量減算 (decrement))を選択できますか? いいえ。Hypercall は両注文キャンセル (cancel-both) のみを使用します。
STP はパーペチュアル注文にも適用されますか? はい。STP は、オプションとパーペチュアルの両方を含む、マッチングエンジン上のすべての注文タイプに適用されます。
STP は RFQ 取引にも適用されますか? はい。テイカーとクォート提供者が同一のウォレットを共有している場合、そのクォートは拒否されます。
両サイドにクォートを出しているマーケットメイカーです。自分のクォート同士がキャンセルされることはありますか? 新規注文によってクォート同士がクロスする場合に限られます。注文板の反対サイドに異なる価格で待機している注文は、通常どおり共存できます。STP はマッチング時にのみトリガーされます。