From 150eea7a28ef616c9e7cc97bdf98316c416f0ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Fri, 23 Jan 2026 20:29:59 +0800 Subject: [PATCH] a --- backend/api/routes/account.py | 27 +++++++++++++++++++++++++-- trading_system/binance_client.py | 31 +++++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/backend/api/routes/account.py b/backend/api/routes/account.py index ce76e25..515a025 100644 --- a/backend/api/routes/account.py +++ b/backend/api/routes/account.py @@ -524,9 +524,32 @@ async def get_realtime_account_data(account_id: int = 1): logger.warning(f" ⚠ 断开连接时出错: {e}") # 构建返回结果 + # 注意:币安合约账户的余额字段(根据官方文档): + # - walletBalance: 钱包余额(不包括未实现盈亏,只反映已实现的盈亏、转账、手续费等) + # - marginBalance: 保证金余额(钱包余额 + 未实现盈亏),这是账户的总权益,用户看到的"总余额" + # - availableBalance: 可用余额(可用于开仓的余额) + # 这里使用 marginBalance 作为 total_balance,因为这才是用户看到的"总余额"(包括未实现盈亏) + wallet_balance = balance.get('walletBalance') if balance and 'walletBalance' in balance else balance.get('total', 0) if balance else 0 + available_balance = balance.get('availableBalance') if balance and 'availableBalance' in balance else balance.get('available', 0) if balance else 0 + margin_balance = balance.get('marginBalance') if balance and 'marginBalance' in balance else balance.get('margin', 0) if balance else 0 + unrealized_profit = balance.get('unrealizedProfit', 0) if balance else 0 + + # 如果没有 marginBalance,尝试从 total 字段获取(向后兼容) + if margin_balance == 0 and balance and 'total' in balance: + margin_balance = balance.get('total', 0) + + logger.info(f"构建返回结果:") + logger.info(f" - wallet_balance (钱包余额,不包括未实现盈亏): {wallet_balance}") + logger.info(f" - margin_balance (保证金余额,总权益,包括未实现盈亏): {margin_balance}") + logger.info(f" - available_balance (可用余额): {available_balance}") + logger.info(f" - unrealized_profit (未实现盈亏): {unrealized_profit}") + result = { - "total_balance": balance.get('total', 0) if balance else 0, - "available_balance": balance.get('available', 0) if balance else 0, + "total_balance": margin_balance, # 使用保证金余额作为总余额(包括未实现盈亏),这是用户看到的"总余额" + "available_balance": available_balance, + "margin_balance": margin_balance, # 添加保证金余额字段 + "wallet_balance": wallet_balance, # 添加钱包余额字段(不包括未实现盈亏) + "unrealized_profit": unrealized_profit, # 添加未实现盈亏字段 # 名义仓位(按标记价汇总) "total_position_value": total_position_value, # 保证金占用(名义/杠杆汇总) diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index 824ed62..4c33f03 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -543,7 +543,7 @@ class BinanceClient: 获取U本位合约账户余额 Returns: - 账户余额字典 {'available': 可用余额, 'total': 总余额} + 账户余额字典 {'available': 可用余额, 'total': 总余额, 'margin': 保证金余额} """ try: account = await self.client.futures_account() @@ -551,12 +551,35 @@ class BinanceClient: usdt_asset = next((a for a in assets if a['asset'] == 'USDT'), None) if usdt_asset: + # 币安合约账户字段说明(根据官方文档): + # - walletBalance: 钱包余额(不包括未实现盈亏,只反映已实现的盈亏、转账、手续费等) + # - marginBalance: 保证金余额(钱包余额 + 未实现盈亏),这是账户的总权益,用户看到的"总余额" + # - availableBalance: 可用余额(可用于开仓的余额 = 钱包余额 - 初始保证金 + 未实现盈亏) + wallet_balance = float(usdt_asset.get('walletBalance', 0)) + available_balance = float(usdt_asset.get('availableBalance', 0)) + margin_balance = float(usdt_asset.get('marginBalance', 0)) + unrealized_profit = float(usdt_asset.get('unrealizedProfit', 0)) + + # 记录所有字段以便调试 + logger.info(f"币安合约账户余额详情 (USDT):") + logger.info(f" - walletBalance (钱包余额,不包括未实现盈亏): {wallet_balance}") + logger.info(f" - marginBalance (保证金余额,总权益,包括未实现盈亏): {margin_balance}") + logger.info(f" - availableBalance (可用余额): {available_balance}") + logger.info(f" - unrealizedProfit (未实现盈亏): {unrealized_profit}") + logger.info(f" - 验证: marginBalance ({margin_balance}) = walletBalance ({wallet_balance}) + unrealizedProfit ({unrealized_profit}) = {wallet_balance + unrealized_profit}") + return { 'ok': True, - 'available': float(usdt_asset['availableBalance']), - 'total': float(usdt_asset['walletBalance']), - 'margin': float(usdt_asset['marginBalance']) + 'available': available_balance, + 'total': margin_balance, # 使用保证金余额作为总余额(包括未实现盈亏),这是用户看到的"总余额" + 'margin': margin_balance, + # 添加原始字段以便调试 + 'walletBalance': wallet_balance, + 'availableBalance': available_balance, + 'marginBalance': margin_balance, + 'unrealizedProfit': unrealized_profit } + logger.warning("币安账户中没有找到 USDT 资产") return {'ok': True, 'available': 0.0, 'total': 0.0, 'margin': 0.0} except BinanceAPIException as e: error_code = e.code if hasattr(e, 'code') else None