diff --git a/trader/hyperliquid_trader.go b/trader/hyperliquid_trader.go index c189dbdc4..8b81bc820 100644 --- a/trader/hyperliquid_trader.go +++ b/trader/hyperliquid_trader.go @@ -109,15 +109,38 @@ func (t *HyperliquidTrader) GetBalance() (map[string]interface{}, error) { // 需要返回"不包含未实现盈亏的钱包余额" walletBalanceWithoutUnrealized := accountValue - totalUnrealizedPnl + // ⚠️ 优先使用Withdrawable字段(Hyperliquid API返回的真实可用余额) + availableBalance := 0.0 + if accountState.Withdrawable != "" { + withdrawable, err := strconv.ParseFloat(accountState.Withdrawable, 64) + if err == nil { + availableBalance = withdrawable + log.Printf("✓ 使用Hyperliquid API的Withdrawable字段: %.2f USDT", availableBalance) + } else { + log.Printf("⚠️ 解析Withdrawable字段失败: %v,将使用计算值", err) + } + } + + // 后备方案:如果Withdrawable不可用,使用计算值(确保不为负数) + if availableBalance == 0 && accountState.Withdrawable == "" { + availableBalance = accountValue - totalMarginUsed + if availableBalance < 0 { + log.Printf("⚠️ [Hyperliquid] 计算的可用余额为负 (%.2f - %.2f = %.2f),已调整为0。", + accountValue, totalMarginUsed, availableBalance) + log.Printf(" 提示:这可能是因为Hyperliquid的TotalMarginUsed计算方式不同,或持仓处于高风险状态") + availableBalance = 0 + } + } + result["totalWalletBalance"] = walletBalanceWithoutUnrealized // 钱包余额(不含未实现盈亏) - result["availableBalance"] = accountValue - totalMarginUsed // 可用余额(总净值 - 占用保证金) + result["availableBalance"] = availableBalance // 可用余额(优先使用Withdrawable,最小为0) result["totalUnrealizedProfit"] = totalUnrealizedPnl // 未实现盈亏 log.Printf("✓ Hyperliquid 账户: 总净值=%.2f (钱包%.2f+未实现%.2f), 可用=%.2f, 保证金占用=%.2f", accountValue, walletBalanceWithoutUnrealized, totalUnrealizedPnl, - result["availableBalance"], + availableBalance, totalMarginUsed) return result, nil