FIXES_APPLIED.md 5.4 KB

审计问题修复总结

修复日期: 2025-10-02 文件: /Users/he/projects/pecifica/scripts/run-refactored-strategy.ts


✅ 已完成修复(4个)

P0-1: ✅ 保证金计算修复(使用真实API数据)

问题: 硬编码假设 10% 保证金率,导致保证金占用率计算严重不准确

修复位置:

  1. Line 1006-1014: 初始化时从 API 获取真实 total_margin_used
  2. Line 805-808: 余额更新时优先使用 balance.usedMargin
  3. Line 790, 937: 订单保证金使用订单价值作为排序依据

修复内容:

// 1. 初始化时获取真实保证金
const usedMargin = parseFloat(accountData.total_margin_used); // ✅ API真实数据

const balance = {
  total: totalEquity,
  available: availableBalance,
  locked: totalEquity - availableBalance,
  usedMargin: usedMargin, // ✅ 保存真实保证金
  timestamp: Date.now()
};

// 2. 计算保证金占用率时使用真实值
const usedMargin = balance.usedMargin !== undefined
  ? balance.usedMargin  // ✅ 优先使用API返回的真实保证金
  : totalEquity - availableBalance; // 降级到差值计算

// 3. 订单保证金用于排序(不影响总保证金计算)
orders.push({
  // ...
  marginUsed: orderValue // 使用订单价值作为排序依据
});

影响:

  • ✅ 保证金占用率计算准确
  • ✅ MarginMonitor 触发减仓时机正确
  • ✅ 降低爆仓风险

P0-2: ✅ OrderLifecycleManager price 验证

问题: 市价单 signal.priceundefined,导致追踪失败

修复位置: Line 1137-1154

修复内容:

// ✅ 仅追踪限价单(有价格的订单)
if (result.success && result.orderId && result.signal.price) {
  this.orderLifecycleManager.trackOrder({
    orderId: result.orderId,
    symbol: result.signal.symbol,
    side: result.signal.side,
    amount: result.signal.amount,
    price: result.signal.price,
    accountId: result.signal.accountId
  });
} else if (result.success && result.orderId && !result.signal.price) {
  // 市价单跳过追踪(通常立即成交,无需生命周期管理)
  this.logger.debug('Skipping lifecycle tracking for market order', {
    orderId: result.orderId,
    symbol: result.signal.symbol,
    reason: 'Market orders execute immediately'
  });
}

影响:

  • ✅ 限价单正常追踪和自动取消
  • ✅ 市价单不会因 undefined price 报错
  • ✅ 订单生命周期管理正常工作

P1-1: ✅ Delta 平衡 accountId 逻辑修正

问题: Math.abs(totalPositionBTC) > 0 永远为 true,账户选择错误

修复位置: Line 244-245

修复内容:

// ❌ 之前的错误逻辑
const balanceAccountId = Math.abs(totalPositionBTC) > 0
  ? account1.accountId
  : account2.accountId;

// ✅ 修正后的逻辑
const balanceAccountId = totalPositionBTC > 0
  ? account1.accountId
  : account2.accountId;

影响:

  • ✅ Delta 平衡信号在正确的账户执行
  • ✅ 仓位平衡逻辑符合预期

P1-2: ✅ 移除冗余 NaN 检查

问题: 双重 isNaN 检查,代码冗余

修复位置: Line 176-191

修复内容:

// ❌ 之前的冗余检查
if (sizeOpt && sizeOpt.totalAmount && !isNaN(sizeOpt.totalAmount)) {
  if (!isNaN(sizeOpt.totalAmount) && sizeOpt.totalAmount > 0) {
    // ...
  }
}

// ✅ 简化后的逻辑
if (sizeOpt?.totalAmount && !isNaN(sizeOpt.totalAmount) && sizeOpt.totalAmount > 0) {
  const LOT_SIZE = 0.00001;
  optimizedAmount = Math.floor(sizeOpt.totalAmount / LOT_SIZE) * LOT_SIZE;
  // ...
}

影响:

  • ✅ 代码更简洁
  • ✅ 可读性提升

📊 修复统计

优先级 问题数 已修复 待处理
P0 2 ✅ 2 0
P1 2 ✅ 2 0
P2 5 0 5
总计 9 4 5

🎯 剩余 P2 问题(可选优化)

6. 信号原因描述不清晰 (Line 279)

  • 当前: reason: 'Sprint2: ${pricingMethod}'
  • 建议: reason: 'Normal open signal (pricing: ${pricingMethod})'

7. 硬编码减仓价格偏差 (Line 722-724)

  • 当前: 硬编码 0.995 / 1.005
  • 建议: 从配置读取

8. 等待订单簿数据硬编码3秒 (Line 516)

  • 当前: 固定等待 3 秒
  • 建议: 轮询检查数据就绪状态

9. WebSocket 连接超时硬编码10秒 (Line 417-419)

  • 当前: 硬编码 10000ms
  • 建议: 从配置读取

10. 其他代码质量改进

  • 配置灵活性提升
  • 日志优化

✅ 核心修复验证

验证点 1: 保证金计算

// 检查日志中的保证金占用率
grep "marginUtilization" /tmp/long_run_test.log

// 应该看到真实的保证金占用率,而不是估算值

验证点 2: OrderLifecycleManager

// 检查订单追踪日志
grep "Order tracked for lifecycle management" /tmp/long_run_test.log

// 应该看到限价单被追踪,市价单被跳过

验证点 3: Delta 平衡

// 检查 Delta 平衡信号
grep "Delta超过容忍度" /tmp/long_run_test.log

// 验证 balanceAccountId 选择正确

🚀 下一步建议

  1. 立即测试: 重启策略,验证所有修复正常工作
  2. 监控日志: 关注保证金计算、订单追踪、Delta 平衡的日志
  3. 长期运行: 运行 1 小时以上,验证稳定性
  4. 可选优化: 根据需要处理 P2 问题

修复完成 - 所有 P0/P1 严重问题已解决 ✅