無期限先物:取引時間外のレバレッジ
Sai Perpは、取引時間が決まっている市場の時間外リスクを管理します。閉場中は通常の取引、継続的な清算、最新価格での決済が取引時間内と同様にはできないため、持ち越した未決済ポジションの実効エクスポージャーを減らします。
本ページは、取引時間外のレバレッジ機能と追加修正を通じて、sai-perps のmainブランチにマージされた動作を説明します。
AFTER_HOURS_MARKETS で有効な市場では、直近の取引終了をまたいで保有したポジションに、AFTER_HOURS_LEVERAGE の共通上限を使います。
effective_leverage = min(Trade.leverage, AFTER_HOURS_LEVERAGE)約定済みの TradeType::Trade ポジションだけが対象です。待機中の指値・逆指値注文は、発動するまで実際のエクスポージャーがないため制限しません。
閉場中は通常の新規注文と任意の決済を禁止したままです。時間外トリガーは清算やリスク正規化の維持管理処理であり、任意の退出のために市場を再開するものではありません。
関連するストレージ:
| 状態 | 型 | 用途 |
|---|---|---|
AFTER_HOURS_LEVERAGE | Item<Decimal> | 設定済みの時間外市場の共通実効レバレッジ上限 |
AFTER_HOURS_MARKETS | Map<MarketIndex, bool> | 時間外上限を適用する市場 |
MarketInfo.block_last_closed | Option<u64> | 直近で Closed になったブロック |
MarketInfo.block_last_opened | Option<u64> | 直近で Open に戻ったブロック |
MarketInfo.last_close_price | Option<Decimal> | 可能な範囲で記録する閉場時の価格スナップショット |
last_close_price は時間外リスク確認の決済価格ではありません。清算と正規化は通常の価格クエリが返すオラクル価格を使います。
次をすべて満たさない限り、get_effective_leverage は保存された Trade.leverage を返します。
- 未決済で、
trade_type == TradeType::Tradeである。 - 市場が
AFTER_HOURS_MARKETSで有効である。 block_last_closedとblock_last_openedが初期化されている。- 直近の再開ブロック以降に新規作成・リスク変更されていない。
Trade.leverageがAFTER_HOURS_LEVERAGEを超えている。
再開ブロックは境界に含みます。TradeInfo.created_block >= MarketInfo.block_last_opened なら、保存されたレバレッジを維持します。
トリガーの動作
Section titled “トリガーの動作”コントラクトは TriggerTrade を時間外リスク処理に振り分けられます。
- 通常のクエリからオラクル価格を読み込みます。
- 保存されたレバレッジの清算価格で、先に清算を確認します。
- 必要なら清算決済の処理を行います。
- 不要なら、保存された倍率を実効上限まで下げます。
- 削減するポジションサイズの差分に、注文種類
after_hours_risk_triggerでprocess_closing_feesを呼び出します。 - 未決済建玉を更新し、
sai/perp/trigger_trade/after_hoursを発行します。
正規化にはcatalyst報酬を支払いません。呼び出し元はリスクの同期を行っており、トレーダーのTP/SL注文を実行しているわけではありません。
正規化手数料で残りの担保を使い切る場合、手数料とリスクの更新後に取引を決済します。
オラクル価格の鮮度
Section titled “オラクル価格の鮮度”閉場が長く続き通常の有効期間を過ぎても、時間外の清算・正規化は意図的に返されたオラクル価格を使います。この限定的な例外により、閉場中も高レバレッジの持越しリスクを減らせます。
通常の新規注文、任意の決済、TP/SLトリガーは、通常の市場状態と鮮度の確認を使います。last_close_price へのフォールバックはしません。
クエリの意味
Section titled “クエリの意味”クエリは保存された状態を維持し、計算されたリスク状態を公開します。
get_tradeは、保存されたTrade.leverageを含むTradeを返します。get_trade_dataは、正規化対象ならneeds_after_hours_trigger: trueを返します。get_trade_pnlは持越し取引を実効レバレッジで評価します。GetAfterHoursLeverage、IsAfterHoursMarket、ListAfterHoursMarketsは上限と対象市場を公開します。
保存された倍率だけで時間外状態を推測してはいけません。KeeperやUI更新から TriggerTrade を送るか判断するときは、派生フィールドを使ってください。
変更前の遅延正規化
Section titled “変更前の遅延正規化”持越し取引の保存倍率が時間外上限を超える場合、利用者が後で変更するときに、先に正規化を状態へ反映します。その後、正規化済みの取引に要求された変更を行います。
この確認はレバレッジ変更、TP/SL更新、ポジション拡大の前に行います。縮小時も、サイズ変更より先に清算確認を行います。