清算流程详解
概述
清算是永续合约风控的最后一道防线。当用户保证金率低于维持保证金要求(110%)时,系统自动触发清算流程,由Liquidation Keeper接管仓位并强制平仓。
完整清算流程
流程图
时间节点
监控检测: 每10秒检查一次所有持仓(Keeper轮询)
触发判断: <100ms (实时计算保证金率)
Keeper接管: <500ms (并发控制+锁定仓位)
提交订单: <200ms (生成清算订单)
订单成交: 1-5秒 (取决于市场流动性)
资金结算: <100ms (链下计算)
链上结算: 1-2秒 (批量上链)
用户通知: <1秒 (WebSocket推送)
总耗时目标: <10秒 (从触发到完成)
清算优先级
排序规则
当多个用户同时触发清算时,按以下优先级处理:
保证金率最低: 最危险的先清算
持仓规模最大: 系统性风险优先
触发时间最早: 先到先得
用户等级: 新手用户优先保护(尽量避免清算)
批量处理
每批最多处理10个清算
批次间隔100ms
避免同时大量清算冲击市场
用户可见的清算状态
状态流转
正常持仓 → 风险警告 → 清算触发 → 清算中 → 清算完成状态说明
🟢 正常
>200%
无特殊提示
所有操作
🟡 警告
150-200%
橙色警告提示
所有操作
🔴 危险
110-150%
红色强警告
建议充值/平仓
⚫ 清算中
<110%
"清算进行中"
无法操作
✅ 清算完成
-
清算结果通知
查看详情
清算中界面
┌─────────────────────────────────────┐
│ ⚫ 仓位清算中 │
├─────────────────────────────────────┤
│ 您的仓位正在被清算... │
│ │
│ 清算信息: │
│ - 仓位: 100 SOL 多仓 @ $200 │
│ - 触发价格: $180.50 │
│ - 触发时间: 2025-10-07 18:30:45 │
│ - 预计完成: 5-10秒 │
│ │
│ Liquidation Keeper 已接管您的仓位, │
│ 正在以市价平仓... │
│ │
│ ⏳ 请稍候... │
└─────────────────────────────────────┘清算执行机制
Keeper工作原理
class LiquidationKeeper:
def monitor_positions(self):
"""每10秒扫描所有持仓"""
while True:
positions = get_all_positions()
for position in positions:
margin_ratio = calculate_margin_ratio(position)
if margin_ratio < 1.1: # 110%
self.liquidate(position)
sleep(10)
def liquidate(self, position):
"""执行清算"""
# 1. 获取清算锁(防止重复清算)
if not acquire_liquidation_lock(position.id):
return
# 2. 标记状态
position.status = "LIQUIDATING"
# 3. 计算清算订单
liquidation_order = {
"symbol": position.symbol,
"side": "SELL" if position.side == "LONG" else "BUY",
"quantity": position.quantity,
"type": "MARKET",
"reduce_only": True
}
# 4. 提交订单
order_id = submit_order(liquidation_order)
# 5. 等待成交(最多重试3次)
for i in range(3):
if check_order_filled(order_id):
break
sleep(1)
# 6. 结算资金
self.settle_liquidation(position, order_id)
# 7. 释放锁
release_liquidation_lock(position.id)并发控制
全局最多10个并发清算
每个用户同时只能清算1个仓位
使用Redis分布式锁防止重复清算
重试机制
清算订单提交后如果未成交:
第1次重试: 等待1秒
第2次重试: 等待2秒
第3次重试: 等待5秒
仍失败: 标记为"清算异常",人工介入
清算费用
费用构成
清算费率: 仓位价值的1%
收取方: 从清算收益中扣除
用途: 激励Keeper运行,部分注入保险基金
示例计算
仓位: 100 SOL @ $200 = $20,000
清算价格: $180
清算价值: 100 × $180 = $18,000
清算费用: $18,000 × 1% = $180
资金结算:
- 用户保证金: $2,000
- 亏损: $20,000 - $18,000 = -$2,000
- 清算费用: -$180
- 剩余: $2,000 - $2,000 - $180 = -$180
结果:
- 穿仓 $180
- 保险基金补偿 $180
- 用户损失全部 $2,000清算后处理
资金结算
def settle_liquidation(position, fill_price):
"""清算后资金结算"""
# 计算盈亏
pnl = (fill_price - position.entry_price) * position.quantity * position.direction
# 计算清算费用
liquidation_fee = abs(position.quantity * fill_price) * 0.01
# 计算剩余保证金
remaining = position.margin + pnl - liquidation_fee
if remaining > 0:
# 正常清算
user_return = remaining * 0.5
insurance_contribution = remaining * 0.5
user.balance += user_return
insurance_fund.add(insurance_contribution)
else:
# 穿仓
bankruptcy_amount = abs(remaining)
insurance_fund.subtract(bankruptcy_amount)
log_bankruptcy({
"position_id": position.id,
"user_id": user.id,
"amount": bankruptcy_amount,
"timestamp": now()
})清算通知
清算完成后立即通知用户:
WebSocket实时推送
邮件通知(如已绑定)
Telegram通知(如已绑定)
站内消息
清算记录
所有清算事件永久记录:
清算时间
触发价格
清算数量
资金结算明细
用户可查询历史
性能指标
目标指标
监控频率: 10秒/次
触发延迟: <100ms
清算延迟: <10秒
成功率: >99%
穿仓率: <0.1%
实际表现(MVP测试)
平均清算时间: 6.8秒
清算成功率: 99.7%
穿仓率: 0.08%
保险基金使用率: 0.3%/月
相关文档
Last updated