跳转到内容
本页面的翻译由 LLM 生成。如果你发现翻译有误,请在 GitHub 上提交 issue 告诉我们。

永续合约:借贷费用

Sai 永续合约的借贷逻辑主要负责:

  • 计算和累积借贷费用,用于杠杆仓位。
  • 追踪未平仓量 OI,用于交易对和借贷组。
  • 实施敞口限制,将交易活动控制在设定阈值内。

本页介绍借贷组的结构、状态更新,以及从开仓到平仓或强平的借贷费用计算。


  1. BorrowingData

    • 用途: 保存交易对和组的费率及累计费用。
    • 字段:
      • fee_per_block:每区块基础费率。
      • acc_fee_long:多头累计费用。
      • acc_fee_short:空头累计费用。
      • acc_last_updated_block:最近费用更新的区块号。
      • fee_exponent:调整费用计算对 OI 不平衡的敏感度。
  2. BorrowingPairGroup

    • 用途: 记录交易对的历史借贷组归属。
    • 字段:
      • group_index:借贷组标识。
      • block:设置组归属的区块号。
      • initial_acc_fee_long:多头初始累计费用。
      • initial_acc_fee_short:空头初始累计费用。
      • prev_group_acc_fee_long:上一组的多头累计费用。
      • prev_group_acc_fee_short:上一组的空头累计费用。
      • pair_acc_fee_long:更换组时该交易对的多头累计费用。
      • pair_acc_fee_short:更换组时该交易对的空头累计费用。
  3. OpenInterest

    • 用途: 追踪交易对和组的 OI,即仓位规模总额。
    • 字段:
      • long:多头 OI 总额。
      • short:空头 OI 总额。
      • max:允许的 OI 上限。
  4. BorrowingInitialAccFees

    • 用途: 记录开仓时的初始累计费用。
    • 字段:
      • acc_pair_fee:开仓时交易对的累计费用。
      • acc_group_fee:开仓时组的累计费用。
      • block:开仓区块号。
  • PAIRS:每个交易对的 BorrowingData。
  • PAIR_GROUPS:每个交易对的 BorrowingPairGroup 历史记录列表。
  • PAIR_OIS:每个交易对的 OpenInterest。
  • GROUPS:每个借贷组的 BorrowingData。
  • GROUP_OIS:每个借贷组的 OpenInterest。
  • INITIAL_ACC_FEES:每笔交易的 BorrowingInitialAccFees。

借贷组是一组共用借贷参数的交易对,便于费用管理和敞口控制:

  • 统一费用调整: 同时更新多个交易对的借贷费用。
  • 共享敞口限制: 管理组内所有交易对的累计 OI。
  • 费用调整: 按市场条件同时调整组内交易对。
  • 敞口控制: 汇总 OI,将整体风险保持在允许范围。
  • 历史费用追踪: 记录组变更,使未平仓交易的费用计算准确。

使用 set_borrowing_group_params 创建或更新借贷组参数。

  • 主要参数:

    • fee_per_block:每区块基础借贷费率。
    • fee_exponent:按 OI 偏差调整费用的指数。
    • max_oi:组的 OI 上限。
    • current_block:费用更新使用的当前区块号。
  • 流程:

    1. 验证 fee_exponent 在 1% 至 300% 范围内。
    2. 调用 set_group_pending_acc_fees,同步费用至 current_block。
    3. 更新 GROUPS 中的参数。
    4. 设置 GROUP_OIS 中的 max_oi。

调用 set_borrowing_pair_params 将交易对转入新组时:

  • 主要参数:

    • group_index:分配给交易对的新组索引。
  • 流程:

    1. 用 set_group_pending_acc_fees 同步新旧组费用。
    2. 用 update_group_oi 从旧组移除交易对 OI,并加入新组。
    3. 向 PAIR_GROUPS 添加 BorrowingPairGroup,记录费用数据和区块号。
    4. 更新 PAIRS 中交易对的专属参数。

每次开仓或平仓都会重新计算 OI。

  • 主要函数:

    • update_pair_oi:更新 PAIR_OIS 中交易对级别的 OI。
    • update_group_oi:更新 GROUP_OIS 中组级别的 OI。
  • 流程:

    • 开仓: 按方向增加 long 或 short OI。
    • 平仓: 相应减少 long 或 short OI。

费用随时间累积,并受 OI 不平衡影响。

  • 费用公式:

    delta = fee_per_block * (current_block - acc_last_updated_block) * (net_oi / max_oi) ^ fee_exponent
    • fee_per_block:每区块基础费率。
    • current_block - acc_last_updated_block:上次更新以来的区块数。
    • net_oi:long 与 short OI 差值的绝对值。
    • max_oi:交易对或组的 OI 上限。
    • fee_exponent:偏差增大时使费用按指数上升的指数。
  • 按方向累积:

    • 仅 OI 更多的一侧累积费用,以鼓励市场平衡。

开立新交易时:

  • 函数: handle_trade_borrowing
    • 同步: 调用 set_pair_pending_acc_fees 和 set_group_pending_acc_fees 更新费用。
    • OI: 通过 update_pair_oi 和 update_group_oi 更新。
    • 初始记录: 用 reset_trade_borrowing_fees 记录开仓时的累计费用。

关闭已有交易时:

  • 函数: handle_trade_borrowing
    • 同步费用至当前区块。
    • 减少交易对和组相应方向的 OI。
  • 借贷费用计算:
    • get_trade_borrowing_fees 计算平仓累计值与开仓 INITIAL_ACC_FEES 的差。
    • 计入持仓期间的组变更。

持仓期间交易对转入新组时:

  • 要求: 费用必须反映新旧两组。
  • 方法:
    • 用 get_borrowing_pair_group_acc_fees_deltas 计算跨组差值。
    • 每阶段取交易对差值和组差值中的较大者,再累加。

计算包含借贷费用的强平价:

  • 函数: get_trade_liquidation_price_with_fees
    • 包含平仓费、触发费及 get_trade_borrowing_fees 返回的借贷费。
    • 计算扣除全部费用后的最终强平价。

交易使用借贷逻辑的流程:

  1. 开仓

    • 用户开立交易。
    • 系统使用 handle_trade_borrowing 同步费用、更新 OI。
    • 初始累计费用保存到 INITIAL_ACC_FEES。
  2. 持仓期间

    • 费用持续累积,只有另一笔交易等事件触发更新时才写入存储。
  3. 平仓

    • 用户关闭已有交易。
    • 调用 handle_trade_borrowing 更新费用和 OI。
    • 用 get_trade_borrowing_fees 计算总借贷费用。
    • 扣除平仓和借贷费用,完成交易。
  4. 参数更新

    • 管理员更新组或交易对参数。
    • 同步费用至当前区块。
    • 交易对更换组时更新 OI。

用途: 协调开仓和平仓时的借贷逻辑。

流程:

  1. 调用 set_pair_pending_acc_fees 和 set_group_pending_acc_fees。
  2. 用 update_pair_oi 和 update_group_oi 更新 OI。
  3. 新交易将当前费用保存到 INITIAL_ACC_FEES。

用途: 计算平仓时的总借贷费用。

流程:

  1. 加载 INITIAL_ACC_FEES。
  2. 使用 get_direction_borrowing_pair_pending_acc_fees 和 get_direction_borrowing_group_pending_acc_fees 计算当前值。
  3. 对组变更阶段应用 get_borrowing_pair_group_acc_fees_deltas。
  4. 按 (Current Acc Fees - Initial Acc Fees) * (Trade Collateral * Leverage) 计算总费用。

用途: 计算上次更新至当前区块的新增费用。

流程:

  1. 判断多头或空头 OI 哪一侧更多。
  2. 用公式计算新增费用差值。
  3. 加入 acc_fee_long 或 acc_fee_short。

用途: 记录开仓时的借贷相关费用。

流程:

  • 将交易对和组的当前 BorrowingData 及区块号保存到 INITIAL_ACC_FEES。

考虑交易对 X 的多单在持仓期间从组 A转入组 B:

区块事件合约记录
100交易对 X 在组 A 时开仓将交易对和 A 的当前累计费用存入 INITIAL_ACC_FEES
150X 从 A 转入 B更新 A 至 150,OI 移入 B,变更写入 PAIR_GROUPS
200X 在 B 时平仓更新 X 和 B 至 200,计算 A 和 B 两个阶段的费用

合约不会忽略最初 50 个区块。get_trade_borrowing_fees 使用组变更记录,对每阶段应用正确的交易对和组费用差值。


借贷逻辑在交易全生命周期连接费用累积、OI 追踪和敞口管理。

  • 借贷组: 集中管理多个交易对的敞口限制和费率。
  • 累计费用: 根据时间、OI 偏差和参数更新。
  • OI: 在交易对和组两层追踪,用于风险控制。
  • 交易生命周期:
    • 开仓设置初始费用。
    • 平仓计算总借贷费并更新 OI。

这些机制使杠杆持仓期间的 OI 和借贷组变化得到正确计费。