清算机制 (Liquidation)
当用户的仓位保证金率低于维持保证金要求时,系统会自动触发清算,强制平仓以保护系统和其他用户免受损失。
清算概述
什么是清算?
清算是去中心化交易所的风险控制机制。当市场价格波动导致用户的保证金不足以维持仓位时,系统会自动平仓该仓位。
清算触发条件
保证金率 = 保证金 / (仓位价值 × 维持保证金率) < 1.0
示例:
- 仓位价值:10,000 USDT
- 保证金:500 USDT
- 维持保证金率:5%
- 所需维持保证金:10,000 × 0.05 = 500 USDT
- 保证金率 = 500 / 500 = 1.0(临界点)
如果市场价格继续不利变动,保证金率 < 1.0,触发清算。
清算价格计算
多仓清算价格
清算价格 = 开仓价格 × (1 - 1/杠杆 + 维持保证金率)
示例:
- 开仓价格:65,000 USDT
- 杠杆:10x
- 维持保证金率:0.5%
- 清算价格 = 65,000 × (1 - 0.1 + 0.005) = 58,825 USDT
空仓清算价格
清算价格 = 开仓价格 × (1 + 1/杠杆 - 维持保证金率)
示例:
- 开仓价格:65,000 USDT
- 杠杆:10x
- 维持保证金率:0.5%
- 清算价格 = 65,000 × (1 + 0.1 - 0.005) = 71,175 USDT
清算流程
1. 监控阶段
系统实时监控所有仓位的保证金率:
每秒检查:
for position in all_positions:
if position.margin_rate < 1.0:
触发清算流程
2. 清算执行
graph TD
A[检测到保证金不足] --> B[标记仓位为清算中]
B --> C[尝试市场平仓]
C --> D{市场有足够流动性?}
D -->|是| E[市场价格平仓]
D -->|否| F[触发ADL机制]
E --> G[计算清算损失]
F --> G
G --> H{损失 > 0?}
H -->|是| I[保险基金覆盖]
H -->|否| J[剩余保证金退还用户]
I --> K[清算完成]
J --> K
3. 清算结算
清算完成后的资金分配:
- 清算收益 = 平仓价格 - 破产价格
- 保险基金增加 = min(清算收益, 剩余保证金)
- 用户损失 = 初始保证金 - 剩余保证金
API 接口
查询清算历史
获取用户的清算记录。
接口信息
- Method:
GET - Path:
/api/v1/liquidations/history - Authentication: 需要 JWT Token
Query 参数
| 参数 | 类型 | 必须 | 描述 |
|---|---|---|---|
| symbol | string | 否 | 过滤特定交易对 |
| limit | number | 否 | 返回数量(默认 50) |
| offset | number | 否 | 偏移量(分页) |
响应示例
{
"liquidations": [
{
"id": "880e8400-e29b-41d4-a716-446655440000",
"user_address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb",
"position_id": "660e8400-e29b-41d4-a716-446655440000",
"symbol": "BTCUSDT",
"side": "long",
"size": "0.1",
"entry_price": "65000.00",
"liquidation_price": "58825.00",
"mark_price_at_liquidation": "58800.00",
"collateral": "650.00",
"realized_loss": "620.00",
"insurance_fund_payment": "30.00",
"liquidation_fee": "0.00",
"liquidated_at": 1704067200000
}
],
"total": 1
}
响应字段说明
| 字段 | 类型 | 描述 |
|---|---|---|
| id | string | 清算记录 UUID |
| user_address | string | 用户地址 |
| position_id | string | 仓位 UUID |
| symbol | string | 交易对 |
| side | string | 仓位方向 |
| size | string | 清算数量 |
| entry_price | string | 开仓价格 |
| liquidation_price | string | 清算价格 |
| mark_price_at_liquidation | string | 清算时标记价格 |
| collateral | string | 初始保证金 |
| realized_loss | string | 实现亏损 |
| insurance_fund_payment | string | 保险基金支付 |
| liquidation_fee | string | 清算费用 |
| liquidated_at | number | 清算时间(毫秒级时间戳) |
查询市场清算历史
查询特定市场的清算事件(公开接口)。
接口信息
- Method:
GET - Path:
/api/v1/liquidations/:symbol - Authentication: 不需要
路径参数
| 参数 | 类型 | 必须 | 描述 |
|---|---|---|---|
| symbol | string | 是 | 交易对(如 BTCUSDT) |
Query 参数
| 参数 | 类型 | 必须 | 描述 |
|---|---|---|---|
| limit | number | 否 | 返回数量(默认 50) |
响应示例
{
"symbol": "BTCUSDT",
"liquidations": [
{
"id": "880e8400-e29b-41d4-a716-446655440000",
"side": "long",
"size": "0.5",
"liquidation_price": "58825.00",
"timestamp": 1704067200000
}
],
"total": 1
}
查询清算配置
查询特定市场的清算机制配置参数。
接口信息
- Method:
GET - Path:
/api/v1/liquidations/:symbol/config - Authentication: 不需要
响应示例
{
"symbol": "BTCUSDT",
"maintenance_margin_rate": "0.005",
"liquidation_fee_rate": "0.000",
"max_leverage": 50,
"bankruptcy_price_protection": true,
"partial_liquidation_enabled": false
}
配置字段说明
| 字段 | 类型 | 描述 |
|---|---|---|
| maintenance_margin_rate | string | 维持保证金率(如 0.5%) |
| liquidation_fee_rate | string | 清算费率 |
| max_leverage | number | 最大杠杆倍数 |
| bankruptcy_price_protection | boolean | 是否启用破产价格保护 |
| partial_liquidation_enabled | boolean | 是否启用部分清算 |
保险基金
保险基金用于覆盖清算产生的损失,保护系统稳定性。
保险基金来源
- 清算收益:清算价格优于破产价格的部分
- 平台注资:初始和定期注入
- 手续费分成:部分交易手续费
保险基金用途
- 覆盖清算损失:当 清算价格劣于破产价格时
- ADL前的缓冲:保险基金耗尽后才触发ADL
查询保险基金
接口信息
- Method:
GET - Path:
/api/v1/insurance-fund/:symbol - Authentication: 不需要
响应示例
{
"symbol": "BTCUSDT",
"balance": "50000.00",
"total_contributions": "100000.00",
"total_payouts": "50000.00",
"last_updated": 1704067200000,
"history": [
{
"type": "contribution",
"amount": "1000.00",
"source": "liquidation_profit",
"timestamp": 1704063600000
},
{
"type": "payout",
"amount": "500.00",
"reason": "liquidation_loss",
"timestamp": 1704060000000
}
]
}
如何避免清算
1. 合理使用杠杆
风险等级:
1-5x: 低风险,适合新手
5-10x: 中风险,适合进阶
10-20x: 高风险,需要经验
20x+: 极高风险,专业交易者
2. 设置止损
// 开仓后立即设置止损
const position = await getPosition(positionId);
const stopLossPrice = position.side === 'long'
? position.entry_price * 0.95 // 多仓:-5%
: position.entry_price * 1.05; // 空仓:+5%
await setPositionTPSL(position.id, {
stop_loss_price: stopLossPrice.toString()
});
3. 监控保证金率
// 实时监控保证金率
setInterval(async () => {
const positions = await getPositions();
for (const position of positions) {
const liquidation = await getLiquidationStatus(position.id);
if (liquidation.health_factor < 1.3) {
// 健康系数 < 1.3,增加保证金
const additionalCollateral = position.collateral * 0.2;
await addCollateral(position.id, additionalCollateral);
alert(`已为 ${position.symbol} 增加保证金`);
}
}
}, 60000); // 每分钟检查
4. 使用价格警报
// 设置价格警报
function setupPriceAlert(position) {
const warningPrice = position.side === 'long'
? position.liquidation_price * 1.05 // 多仓:清算价上方5%
: position.liquidation_price * 0.95; // 空仓:清算价下方5%
ws.subscribe('ticker', position.symbol);
ws.on('ticker', (data) => {
if (
(position.side === 'long' && data.mark_price <= warningPrice) ||
(position.side === 'short' && data.mark_price >= warningPrice)
) {
alert(`警告:${position.symbol} 接近清算价格!`);
}
});
}
5. 分批降低杠杆
// 盈利时主动降低杠杆
if (position.unrealized_pnl > 0) {
// 增加保证金 = 降低有效杠杆
const targetLeverage = 5; // 目标降到5x
const additionalCollateral =
(position.size_in_usd / targetLeverage) - position.collateral;
if (additionalCollateral > 0) {
await addCollateral(position.id, additionalCollateral);
}
}
清算与ADL的关系
执行顺序
1. 价格达到清算价格
↓
2. 尝试市场平仓
↓
3. 如果流动性不足
↓
4. 保险基金覆盖损失
↓
5. 如果保险基金不足
↓
6. 触发 ADL 机制
区别对比
| 特性 | 清算 | ADL |
|---|---|---|
| 触发条件 | 保证金率 < 1.0 | 保险基金不足 |
| 针对对象 | 保证金不足的仓位 | 盈利的反向仓位 |
| 是否收费 | 否(已损失保证金) | 否 |
| 可否避免 | 可以(加保证金) | 可以(降杠杆) |
| 执行价格 | 破产价格 | 市场价格 |
清算统计
实时监控面板
前端可以展示清算统计信息:
async function getLiquidationStats(symbol) {
const stats = await fetch(`/api/v1/liquidations/${symbol}/stats`);
return stats.json();
}
// 显示统计
const stats = await getLiquidationStats('BTCUSDT');
console.log(`
24小时清算次数: ${stats.liquidations_24h}
24小时清算总额: ${stats.volume_24h} USDT
保险基金余额: ${stats.insurance_fund_balance} USDT
平均清算杠杆: ${stats.avg_leverage}x
`);
常见问题
Q: 清算后会负债吗?
A: 不会。ZTDX的清算机制确保用户最多损失初始保证金,不会产生负债。
Q: 清算费用是多少?
A: 当前清算费率为 0%。用户已经损失了部分或全部保证金,不会额外收取清算费。
Q: 可以部分清算吗?
A: 当前版本为全仓清算。未来可能推出部分清算功能。
Q: 清算价格是固定的吗?
A: 不是。清算价格会随着:
- 增加/减少保证金
- 仓位盈亏变化
- 资金费率累积 而动态调整。
Q: 如何查看我的清算价格?
A: 查询仓位详情或清算状态接口:
const position = await getPosition(positionId);
console.log('清算价格:', position.liquidation_price);
// 或
const liquidation = await getLiquidationStatus(positionId);
console.log('清算价格:', liquidation.liquidation_price);