本页面的翻译由 LLM 生成。如果你发现翻译有误,请在 GitHub 上提交 issue 告诉我们。
永续合约:借贷费用
Sai 永续合约的借贷逻辑主要负责:
- 计算和累积借贷费用,用于杠杆仓位。
- 追踪未平仓量 OI,用于交易对和借贷组。
- 实施敞口限制,将交易活动控制在设定阈值内。
本页介绍借贷组的结构、状态更新,以及从开仓到平仓或强平的借贷费用计算。
-
BorrowingData
- 用途: 保存交易对和组的费率及累计费用。
- 字段:
fee_per_block:每区块基础费率。acc_fee_long:多头累计费用。acc_fee_short:空头累计费用。acc_last_updated_block:最近费用更新的区块号。fee_exponent:调整费用计算对 OI 不平衡的敏感度。
-
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:更换组时该交易对的空头累计费用。
-
OpenInterest
- 用途: 追踪交易对和组的 OI,即仓位规模总额。
- 字段:
long:多头 OI 总额。short:空头 OI 总额。max:允许的 OI 上限。
-
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。
什么是借贷组?
Section titled “什么是借贷组?”借贷组是一组共用借贷参数的交易对,便于费用管理和敞口控制:
- 统一费用调整: 同时更新多个交易对的借贷费用。
- 共享敞口限制: 管理组内所有交易对的累计 OI。
借贷组的作用
Section titled “借贷组的作用”- 费用调整: 按市场条件同时调整组内交易对。
- 敞口控制: 汇总 OI,将整体风险保持在允许范围。
- 历史费用追踪: 记录组变更,使未平仓交易的费用计算准确。
如何更新借贷组
Section titled “如何更新借贷组”设置借贷组参数
Section titled “设置借贷组参数”使用 set_borrowing_group_params 创建或更新借贷组参数。
-
主要参数:
fee_per_block:每区块基础借贷费率。fee_exponent:按 OI 偏差调整费用的指数。max_oi:组的 OI 上限。current_block:费用更新使用的当前区块号。
-
流程:
- 验证
fee_exponent在 1% 至 300% 范围内。 - 调用
set_group_pending_acc_fees,同步费用至current_block。 - 更新
GROUPS中的参数。 - 设置
GROUP_OIS中的max_oi。
- 验证
更换交易对的借贷组
Section titled “更换交易对的借贷组”调用 set_borrowing_pair_params 将交易对转入新组时:
-
主要参数:
group_index:分配给交易对的新组索引。
-
流程:
- 用
set_group_pending_acc_fees同步新旧组费用。 - 用
update_group_oi从旧组移除交易对 OI,并加入新组。 - 向
PAIR_GROUPS添加BorrowingPairGroup,记录费用数据和区块号。 - 更新
PAIRS中交易对的专属参数。
- 用
更新未平仓量
Section titled “更新未平仓量”每次开仓或平仓都会重新计算 OI。
-
主要函数:
update_pair_oi:更新PAIR_OIS中交易对级别的 OI。update_group_oi:更新GROUP_OIS中组级别的 OI。
-
流程:
- 开仓: 按方向增加
long或shortOI。 - 平仓: 相应减少
long或shortOI。
- 开仓: 按方向增加
累积借贷费用
Section titled “累积借贷费用”费用随时间累积,并受 OI 不平衡影响。
-
费用公式:
delta = fee_per_block * (current_block - acc_last_updated_block) * (net_oi / max_oi) ^ fee_exponentfee_per_block:每区块基础费率。current_block - acc_last_updated_block:上次更新以来的区块数。net_oi:long与shortOI 差值的绝对值。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计算跨组差值。 - 每阶段取交易对差值和组差值中的较大者,再累加。
- 用
包含费用的强平价
Section titled “包含费用的强平价”计算包含借贷费用的强平价:
- 函数:
get_trade_liquidation_price_with_fees- 包含平仓费、触发费及
get_trade_borrowing_fees返回的借贷费。 - 计算扣除全部费用后的最终强平价。
- 包含平仓费、触发费及
交易使用借贷逻辑的流程:
-
开仓
- 用户开立交易。
- 系统使用
handle_trade_borrowing同步费用、更新 OI。 - 初始累计费用保存到
INITIAL_ACC_FEES。
-
持仓期间
- 费用持续累积,只有另一笔交易等事件触发更新时才写入存储。
-
平仓
- 用户关闭已有交易。
- 调用
handle_trade_borrowing更新费用和 OI。 - 用
get_trade_borrowing_fees计算总借贷费用。 - 扣除平仓和借贷费用,完成交易。
-
参数更新
- 管理员更新组或交易对参数。
- 同步费用至当前区块。
- 交易对更换组时更新 OI。
handle_trade_borrowing
Section titled “handle_trade_borrowing”用途: 协调开仓和平仓时的借贷逻辑。
流程:
- 调用
set_pair_pending_acc_fees和set_group_pending_acc_fees。 - 用
update_pair_oi和update_group_oi更新 OI。 - 新交易将当前费用保存到
INITIAL_ACC_FEES。
get_trade_borrowing_fees
Section titled “get_trade_borrowing_fees”用途: 计算平仓时的总借贷费用。
流程:
- 加载
INITIAL_ACC_FEES。 - 使用
get_direction_borrowing_pair_pending_acc_fees和get_direction_borrowing_group_pending_acc_fees计算当前值。 - 对组变更阶段应用
get_borrowing_pair_group_acc_fees_deltas。 - 按
(Current Acc Fees - Initial Acc Fees) * (Trade Collateral * Leverage)计算总费用。
get_borrowing_pending_acc_fees
Section titled “get_borrowing_pending_acc_fees”用途: 计算上次更新至当前区块的新增费用。
流程:
- 判断多头或空头 OI 哪一侧更多。
- 用公式计算新增费用差值。
- 加入
acc_fee_long或acc_fee_short。
reset_trade_borrowing_fees
Section titled “reset_trade_borrowing_fees”用途: 记录开仓时的借贷相关费用。
流程:
- 将交易对和组的当前
BorrowingData及区块号保存到INITIAL_ACC_FEES。
示例:交易对更换借贷组
Section titled “示例:交易对更换借贷组”考虑交易对 X 的多单在持仓期间从组 A转入组 B:
| 区块 | 事件 | 合约记录 |
|---|---|---|
| 100 | 交易对 X 在组 A 时开仓 | 将交易对和 A 的当前累计费用存入 INITIAL_ACC_FEES |
| 150 | X 从 A 转入 B | 更新 A 至 150,OI 移入 B,变更写入 PAIR_GROUPS |
| 200 | X 在 B 时平仓 | 更新 X 和 B 至 200,计算 A 和 B 两个阶段的费用 |
合约不会忽略最初 50 个区块。get_trade_borrowing_fees 使用组变更记录,对每阶段应用正确的交易对和组费用差值。
借贷逻辑在交易全生命周期连接费用累积、OI 追踪和敞口管理。
- 借贷组: 集中管理多个交易对的敞口限制和费率。
- 累计费用: 根据时间、OI 偏差和参数更新。
- OI: 在交易对和组两层追踪,用于风险控制。
- 交易生命周期:
- 开仓设置初始费用。
- 平仓计算总借贷费并更新 OI。
这些机制使杠杆持仓期间的 OI 和借贷组变化得到正确计费。