清算流程详解

概述

清算是永续合约风控的最后一道防线。当用户保证金率低于维持保证金要求(110%)时,系统自动触发清算流程,由Liquidation Keeper接管仓位并强制平仓。

完整清算流程

流程图

时间节点

  1. 监控检测: 每10秒检查一次所有持仓(Keeper轮询)

  2. 触发判断: <100ms (实时计算保证金率)

  3. Keeper接管: <500ms (并发控制+锁定仓位)

  4. 提交订单: <200ms (生成清算订单)

  5. 订单成交: 1-5秒 (取决于市场流动性)

  6. 资金结算: <100ms (链下计算)

  7. 链上结算: 1-2秒 (批量上链)

  8. 用户通知: <1秒 (WebSocket推送)

总耗时目标: <10秒 (从触发到完成)

清算优先级

排序规则

当多个用户同时触发清算时,按以下优先级处理:

  1. 保证金率最低: 最危险的先清算

  2. 持仓规模最大: 系统性风险优先

  3. 触发时间最早: 先到先得

  4. 用户等级: 新手用户优先保护(尽量避免清算)

批量处理

  • 每批最多处理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