fix(hyperliquid): add dynamic margin summary selection based on isCrossMargin

## 🎯 修復核心問題:保證金摘要選擇邏輯

### 問題根源

**4db1a3a (henrylab)** 和 **d062126 (icy)** 的矛盾:

1. **henrylab** 將 CrossMarginSummary → MarginSummary(逐倉)
   - 邏輯:V1 設定逐倉,所以改查詢逐倉摘要
   - 問題:方向錯了,Hyperliquid 應該預設全倉

2. **icy** 添加 isCrossMargin 配置,預設全倉
   - 邏輯:添加配置,SetLeverage 使用配置
   - 問題:忘記修改 GetBalance,仍硬編碼 MarginSummary
   - 結果:設定全倉,查詢逐倉摘要 → 又不一致了

### 修復方案

根據 `isCrossMargin` 動態選擇正確的摘要:

```go
if t.isCrossMargin {
    // 全倉模式:使用 CrossMarginSummary
    accountValue, _ = strconv.ParseFloat(accountState.CrossMarginSummary.AccountValue, 64)
} else {
    // 逐倉模式:使用 MarginSummary
    accountValue, _ = strconv.ParseFloat(accountState.MarginSummary.AccountValue, 64)
}
```

### 修復前後對比

| 版本 | 設定模式 | 查詢摘要 | 邏輯一致 | 方向正確 |
|------|---------|---------|---------|---------|
| V1 (nobody) | 逐倉 | CrossMargin |  |  |
| 4db1a3a (henrylab) | 逐倉 | Margin |  |  |
| d062126 (icy) | 全倉 | Margin |  | ⚠️ |
| **此次修復** | 全倉 | CrossMargin |  |  |

### 清理混亂註釋

修復前:
```go
// 🔍 调试:打印API返回的完整CrossMarginSummary结构
summaryJSON, _ := json.MarshalIndent(accountState.MarginSummary, ...)
// 註釋說 CrossMarginSummary,代碼用 MarginSummary 
```

修復後:
```go
log.Printf("🔍 [DEBUG] Hyperliquid Perpetuals %s 完整数据:", summaryType)
// 根據實際使用的摘要類型動態輸出 
```

## 相關分析

詳見:/tmp/core_problem_analysis.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
ZhouYongyou
2025-11-05 03:47:18 +08:00
parent d2ea461754
commit 2f9a7b08de

View File

@@ -102,13 +102,29 @@ func (t *HyperliquidTrader) GetBalance() (map[string]interface{}, error) {
// 解析余额信息MarginSummary字段都是string
result := make(map[string]interface{})
// 🔍 调试打印API返回的完整CrossMarginSummary结构
summaryJSON, _ := json.MarshalIndent(accountState.MarginSummary, " ", " ")
log.Printf("🔍 [DEBUG] Hyperliquid Perpetuals CrossMarginSummary完整数据:")
log.Printf("%s", string(summaryJSON))
// ✅ 核心修復:根据保证金模式动态选择正确的摘要(CrossMarginSummary 或 MarginSummary
var accountValue, totalMarginUsed float64
var summaryType string
var summary interface{}
accountValue, _ := strconv.ParseFloat(accountState.MarginSummary.AccountValue, 64)
totalMarginUsed, _ := strconv.ParseFloat(accountState.MarginSummary.TotalMarginUsed, 64)
if t.isCrossMargin {
// 全仓模式:使用 CrossMarginSummary
accountValue, _ = strconv.ParseFloat(accountState.CrossMarginSummary.AccountValue, 64)
totalMarginUsed, _ = strconv.ParseFloat(accountState.CrossMarginSummary.TotalMarginUsed, 64)
summaryType = "CrossMarginSummary (全仓)"
summary = accountState.CrossMarginSummary
} else {
// 逐仓模式:使用 MarginSummary
accountValue, _ = strconv.ParseFloat(accountState.MarginSummary.AccountValue, 64)
totalMarginUsed, _ = strconv.ParseFloat(accountState.MarginSummary.TotalMarginUsed, 64)
summaryType = "MarginSummary (逐仓)"
summary = accountState.MarginSummary
}
// 🔍 调试打印API返回的完整摘要结构
summaryJSON, _ := json.MarshalIndent(summary, " ", " ")
log.Printf("🔍 [DEBUG] Hyperliquid Perpetuals %s 完整数据:", summaryType)
log.Printf("%s", string(summaryJSON))
// ⚠️ 关键修复:将 Spot 现货余额加入总余额
accountValue += spotUSDCBalance