From 9e42aa153c3ec88c3ad2ca311c608d1fbafe7a2a Mon Sep 17 00:00:00 2001 From: ZhouYongyou <128128010+zhouyongyou@users.noreply.github.com> Date: Tue, 4 Nov 2025 22:10:19 +0800 Subject: [PATCH] fix(hyperliquid): prevent negative availableBalance calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add check to ensure availableBalance >= 0 - Log warning when calculated value is negative - Prevent false "insufficient balance" errors for users with USDC Root cause: Hyperliquid's TotalMarginUsed may exceed AccountValue in certain position states, causing negative available balance. Related issue: Users with USDC seeing "no money" errors despite having sufficient balance on Hyperliquid. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- trader/hyperliquid_trader.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/trader/hyperliquid_trader.go b/trader/hyperliquid_trader.go index d580ded5..c59c5722 100644 --- a/trader/hyperliquid_trader.go +++ b/trader/hyperliquid_trader.go @@ -109,15 +109,24 @@ func (t *HyperliquidTrader) GetBalance() (map[string]interface{}, error) { // 需要返回"不包含未实现盈亏的钱包余额" walletBalanceWithoutUnrealized := accountValue - totalUnrealizedPnl + // ⚠️ 计算可用余额,确保不为负数(防止"没钱"误报) + 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 // 可用余额(总净值 - 占用保证金,最小为0) result["totalUnrealizedProfit"] = totalUnrealizedPnl // 未实现盈亏 log.Printf("✓ Hyperliquid 账户: 总净值=%.2f (钱包%.2f+未实现%.2f), 可用=%.2f, 保证金占用=%.2f", accountValue, walletBalanceWithoutUnrealized, totalUnrealizedPnl, - result["availableBalance"], + availableBalance, totalMarginUsed) return result, nil