コンテンツにスキップ
このページの翻訳は LLM によって生成されています。誤りに気づいた場合は GitHub で issue を開いてお知らせください。

無期限先物:取引時間外のレバレッジ

Sai Perpは、取引時間が決まっている市場の時間外リスクを管理します。閉場中は通常の取引、継続的な清算、最新価格での決済が取引時間内と同様にはできないため、持ち越した未決済ポジションの実効エクスポージャーを減らします。

本ページは、取引時間外のレバレッジ機能と追加修正を通じて、sai-perps のmainブランチにマージされた動作を説明します。

AFTER_HOURS_MARKETS で有効な市場では、直近の取引終了をまたいで保有したポジションに、AFTER_HOURS_LEVERAGE の共通上限を使います。

effective_leverage = min(Trade.leverage, AFTER_HOURS_LEVERAGE)

約定済みの TradeType::Trade ポジションだけが対象です。待機中の指値・逆指値注文は、発動するまで実際のエクスポージャーがないため制限しません。

閉場中は通常の新規注文と任意の決済を禁止したままです。時間外トリガーは清算やリスク正規化の維持管理処理であり、任意の退出のために市場を再開するものではありません。

関連するストレージ:

状態型用途
AFTER_HOURS_LEVERAGEItem<Decimal>設定済みの時間外市場の共通実効レバレッジ上限
AFTER_HOURS_MARKETSMap<MarketIndex, bool>時間外上限を適用する市場
MarketInfo.block_last_closedOption<u64>直近で Closed になったブロック
MarketInfo.block_last_openedOption<u64>直近で Open に戻ったブロック
MarketInfo.last_close_priceOption<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 なら、保存されたレバレッジを維持します。

コントラクトは TriggerTrade を時間外リスク処理に振り分けられます。

  1. 通常のクエリからオラクル価格を読み込みます。
  2. 保存されたレバレッジの清算価格で、先に清算を確認します。
  3. 必要なら清算決済の処理を行います。
  4. 不要なら、保存された倍率を実効上限まで下げます。
  5. 削減するポジションサイズの差分に、注文種類 after_hours_risk_trigger で process_closing_fees を呼び出します。
  6. 未決済建玉を更新し、sai/perp/trigger_trade/after_hours を発行します。

正規化にはcatalyst報酬を支払いません。呼び出し元はリスクの同期を行っており、トレーダーのTP/SL注文を実行しているわけではありません。

正規化手数料で残りの担保を使い切る場合、手数料とリスクの更新後に取引を決済します。

閉場が長く続き通常の有効期間を過ぎても、時間外の清算・正規化は意図的に返されたオラクル価格を使います。この限定的な例外により、閉場中も高レバレッジの持越しリスクを減らせます。

通常の新規注文、任意の決済、TP/SLトリガーは、通常の市場状態と鮮度の確認を使います。last_close_price へのフォールバックはしません。

クエリは保存された状態を維持し、計算されたリスク状態を公開します。

  • get_trade は、保存された Trade.leverage を含む Trade を返します。
  • get_trade_data は、正規化対象なら needs_after_hours_trigger: true を返します。
  • get_trade_pnl は持越し取引を実効レバレッジで評価します。
  • GetAfterHoursLeverage、IsAfterHoursMarket、ListAfterHoursMarkets は上限と対象市場を公開します。

保存された倍率だけで時間外状態を推測してはいけません。KeeperやUI更新から TriggerTrade を送るか判断するときは、派生フィールドを使ってください。

持越し取引の保存倍率が時間外上限を超える場合、利用者が後で変更するときに、先に正規化を状態へ反映します。その後、正規化済みの取引に要求された変更を行います。

この確認はレバレッジ変更、TP/SL更新、ポジション拡大の前に行います。縮小時も、サイズ変更より先に清算確認を行います。