Skip to main content

自动减仓 (ADL - Auto-Deleveraging)

当市场剧烈波动导致保险基金不足以覆盖所有清算损失时,系统会启动自动减仓(ADL)机制,对盈利最多的反向仓位进行强制平仓。

概述

ADL 触发条件

ADL 机制在以下情况触发:

  1. 某个市场的保险基金余额 < 清算损失
  2. 无法找到足够的对手方接管清算仓位
  3. 系统需要平衡市场风险

ADL 排队机制

系统会对所有用户的仓位进行排名,按以下规则确定 ADL 优先级:

ADL 优先级 = 未实现盈亏 × 杠杆倍数

规则

  • ✅ 盈利越多,杠杆越高 → 优先级越高(越容易被 ADL)
  • ✅ 只有盈利仓位会被 ADL
  • ✅ 与清算仓位反向的仓位才会被选中

查询 ADL 配置

查询特定市场的 ADL 机制配置参数。

接口信息

  • Method: GET
  • Path: /api/v1/adl/:symbol/config
  • Authentication: 不需要(公开接口)

路径参数

参数类型必须描述
symbolstring交易对(如 BTCUSDT

响应示例

{
"symbol": "BTCUSDT",
"enabled": true,
"min_profit_threshold": "100.00",
"max_positions_per_round": 10,
"insurance_fund_threshold": "10000.00",
"ranking_update_interval": 60
}

响应字段说明

字段类型描述
symbolstring交易对
enabledbooleanADL 是否启用
min_profit_thresholdstring最小盈利阈值(低于此值不会被 ADL)
max_positions_per_roundnumber单轮最多 ADL 仓位数
insurance_fund_thresholdstring保险基金阈值(低于此值可能触发 ADL)
ranking_update_intervalnumber排名更新间隔(秒)

查询 ADL 排名

查询当前市场的 ADL 排名队列,了解您的仓位位置。

接口信息

  • Method: GET
  • Path: /api/v1/adl/:symbol/rankings
  • Authentication: 需要 JWT Token

路径参数

参数类型必须描述
symbolstring交易对

Query 参数

参数类型必须描述
sidestring过滤方向(long/short
limitnumber返回数量(默认 100)

响应示例

{
"symbol": "BTCUSDT",
"side": "long",
"rankings": [
{
"rank": 1,
"position_id": "550e8400-e29b-41d4-a716-446655440000",
"user_address": "0x123...",
"unrealized_pnl": "1000.00",
"leverage": 20,
"adl_score": "20000.00",
"is_self": false
},
{
"rank": 5,
"position_id": "660e8400-e29b-41d4-a716-446655440000",
"user_address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb",
"unrealized_pnl": "500.00",
"leverage": 10,
"adl_score": "5000.00",
"is_self": true
}
],
"total_positions": 150,
"your_rank": 5,
"updated_at": 1704067200000
}

响应字段说明

字段类型描述
symbolstring交易对
sidestring仓位方向
rankingsarray排名列表
total_positionsnumber总仓位数
your_ranknumber | null您的排名(如果有仓位)
updated_atnumber更新时间(毫秒级时间戳)

Ranking 对象

字段类型描述
ranknumber排名(1 = 最高优先级)
position_idstring仓位 UUID
user_addressstring用户地址(部分隐藏)
unrealized_pnlstring未实现盈亏(Decimal 字符串)
leveragenumber杠杆倍数
adl_scorestringADL 评分(盈亏 × 杠杆)
is_selfboolean是否是当前用户的仓位

查询 ADL 事件历史

查询特定市场的 ADL 事件历史记录。

接口信息

  • Method: GET
  • Path: /api/v1/adl/:symbol/events
  • Authentication: 不需要(公开接口)

路径参数

参数类型必须描述
symbolstring交易对

Query 参数

参数类型必须描述
limitnumber返回数量(默认 50)

响应示例

{
"symbol": "BTCUSDT",
"events": [
{
"id": "770e8400-e29b-41d4-a716-446655440000",
"trigger_position_id": "550e8400-e29b-41d4-a716-446655440000",
"trigger_reason": "insufficient_insurance_fund",
"insurance_fund_deficit": "5000.00",
"adl_positions_count": 5,
"total_reduced_size": "0.5",
"average_price": "65000.00",
"created_at": 1704067200000
}
],
"total": 1
}

响应字段说明

字段类型描述
idstringADL 事件 UUID
trigger_position_idstring触发 ADL 的仓位 ID
trigger_reasonstring触发原因
insurance_fund_deficitstring保险基金不足金额
adl_positions_countnumber被 ADL 的仓位数量
total_reduced_sizestring总减仓数量
average_pricestring平均执行价格
created_atnumber发生时间(毫秒级时间戳)

查询用户 ADL 历史

查询当前用户被 ADL 的历史记录。

接口信息

  • Method: GET
  • Path: /api/v1/adl/history
  • Authentication: 需要 JWT Token

Query 参数

参数类型必须描述
symbolstring过滤交易对
limitnumber返回数量(默认 50)

响应示例

{
"adl_history": [
{
"id": "880e8400-e29b-41d4-a716-446655440000",
"adl_event_id": "770e8400-e29b-41d4-a716-446655440000",
"position_id": "660e8400-e29b-41d4-a716-446655440000",
"symbol": "BTCUSDT",
"side": "long",
"reduced_size": "0.05",
"execution_price": "65000.00",
"realized_pnl": "250.00",
"your_rank_at_time": 3,
"created_at": 1704067200000
}
],
"total": 1
}

响应字段说明

字段类型描述
idstringADL 记录 UUID
adl_event_idstring关联的 ADL 事件 ID
position_idstring被减仓的仓位 ID
symbolstring交易对
sidestring仓位方向
reduced_sizestring减仓数量
execution_pricestring执行价格
realized_pnlstring实现盈亏
your_rank_at_timenumber当时的排名
created_atnumber发生时间(毫秒级时间戳)

查询用户 ADL 统计

查询当前用户的 ADL 统计信息。

接口信息

  • Method: GET
  • Path: /api/v1/adl/:symbol/stats
  • Authentication: 需要 JWT Token

路径参数

参数类型必须描述
symbolstring交易对

响应示例

{
"symbol": "BTCUSDT",
"total_adl_count": 5,
"total_reduced_size": "0.25",
"total_realized_pnl": "1250.00",
"average_execution_price": "65000.00",
"last_adl_time": 1704067200000,
"current_positions": [
{
"position_id": "660e8400-e29b-41d4-a716-446655440000",
"side": "long",
"adl_rank": 5,
"adl_score": "5000.00",
"risk_level": "medium"
}
]
}

响应字段说明

字段类型描述
symbolstring交易对
total_adl_countnumber总 ADL 次数
total_reduced_sizestring总减仓数量
total_realized_pnlstring总实现盈亏
average_execution_pricestring平均执行价格
last_adl_timenumber | null上次 ADL 时间
current_positionsarray当前仓位的 ADL 风险

ADL 指示器

前端可以通过 ADL 排名显示风险指示器,提醒用户注意风险。

风险等级划分

function getADLRiskLevel(rank, totalPositions) {
const percentage = (rank / totalPositions) * 100;

if (percentage <= 20) {
return {
level: 'critical',
color: 'red',
description: '极高风险 - 可能随时被 ADL'
};
} else if (percentage <= 40) {
return {
level: 'high',
color: 'orange',
description: '高风险 - 注意降低杠杆'
};
} else if (percentage <= 60) {
return {
level: 'medium',
color: 'yellow',
description: '中等风险'
};
} else {
return {
level: 'low',
color: 'green',
description: '低风险'
};
}
}

UI 显示示例

// React 组件示例
function ADLIndicator({ rank, totalPositions }) {
const risk = getADLRiskLevel(rank, totalPositions);

return (
<div className={`adl-indicator adl-${risk.level}`}>
<div className="adl-lights">
{[1, 2, 3, 4, 5].map(i => (
<div
key={i}
className={rank <= (totalPositions * i / 5) ? 'active' : ''}
style={{ backgroundColor: rank <= (totalPositions * i / 5) ? risk.color : 'gray' }}
/>
))}
</div>
<span>{risk.description}</span>
</div>
);
}

如何避免被 ADL

1. 降低杠杆

// 盈利时主动降低杠杆
if (position.unrealized_pnl > 0 && position.leverage > 10) {
// 通过增加保证金降低有效杠杆
await addCollateral(
position.id,
position.collateral * 0.5 // 增加 50% 保证金
);
}

2. 部分止盈

// 在高盈利时部分平仓,降低 ADL 评分
if (position.unrealized_pnl > targetProfit * 0.8) {
// 平仓 50%
await closePosition(
position.id,
position.size_in_tokens * 0.5
);
}

3. 设置止盈订单

// 使用触发订单自动止盈
await setPositionTPSL(position.id, {
take_profit_price: calculateTPPrice(position),
stop_loss_price: calculateSLPrice(position)
});

4. 监控 ADL 排名

// 定期检查 ADL 排名
setInterval(async () => {
const { your_rank, total_positions } = await getADLRankings(symbol);

if (your_rank && your_rank <= total_positions * 0.2) {
// 在前 20%,风险很高
alert('警告:您的仓位在 ADL 高风险区,建议降低杠杆或部分止盈!');
}
}, 300000); // 每 5 分钟检查一次

最佳实践

1. 理解 ADL 机制

  • ✅ ADL 不是惩罚,是保护整个系统的机制
  • ✅ 只有盈利仓位会被 ADL
  • ✅ ADL 会按市场价格执行,您会实现盈利

2. 合理使用杠杆

低杠杆 (1-5x): 安全,但资金利用率低
中杠杆 (5-10x): 平衡,适合大多数用户
高杠杆 (10-20x): 风险高,ADL 优先级高
超高杠杆 (20x+): 极高风险,极易被 ADL

3. 主动管理风险

  • 📊 定期查看 ADL 排名
  • 🎯 设置合理的止盈位
  • 💰 盈利后主动部分平仓
  • 📉 降低杠杆锁定利润

常见问题

Q: 被 ADL 后会亏损吗?

A: 不会。ADL 只会强制平仓您的盈利仓位,您仍然会获得盈利,只是无法继续持有。

Q: ADL 的执行价格是多少?

A: ADL 按当前市场价格(标记价格)执行,与您的开仓价格无关。

Q: 可以拒绝 ADL 吗?

A: 不可以。ADL 是自动执行的系统机制,无法拒绝。但您可以通过降低杠杆和部分止盈来降低被 ADL 的概率。

Q: ADL 会扣除手续费吗?

A: ADL 执行时不收取手续费,因为这是系统强制操作,不是用户主动交易。

Q: 为什么需要 ADL 机制?

A: 当保险基金不足以覆盖清算损失时,如果没有 ADL,整个系统可能会出现坏账。ADL 确保系统的稳定性和公平性。


相关文档