diff --git a/backend/api/routes/account.py b/backend/api/routes/account.py index 381addd..16828a1 100644 --- a/backend/api/routes/account.py +++ b/backend/api/routes/account.py @@ -363,6 +363,18 @@ async def close_position(symbol: str): position_manager = PositionManager(client, risk_manager) logger.info("✓ 管理器初始化成功") + # 先检查币安是否有持仓 + logger.info(f"检查 {symbol} 在币安的持仓状态...") + positions = await client.get_open_positions() + binance_has_position = any(p['symbol'] == symbol and float(p['positionAmt']) != 0 for p in positions) + + if binance_has_position: + position_info = next((p for p in positions if p['symbol'] == symbol and float(p['positionAmt']) != 0), None) + position_amt = float(position_info['positionAmt']) if position_info else 0 + logger.info(f"✓ 币安账户中有 {symbol} 持仓: {position_amt:.4f}") + else: + logger.info(f"✓ 币安账户中没有 {symbol} 持仓") + # 执行平仓(reason='manual' 表示手动平仓) logger.info(f"开始执行平仓操作: {symbol}...") success = await position_manager.close_position(symbol, reason='manual') @@ -375,13 +387,20 @@ async def close_position(symbol: str): "status": "closed" } else: - # 即使返回False,也可能是币安没有持仓但数据库已更新,这种情况也算成功 - logger.warning(f"⚠ {symbol} 平仓操作返回False,可能币安没有持仓或已平仓") - return { - "message": f"{symbol} 平仓操作完成(币安可能没有持仓或已平仓)", - "symbol": symbol, - "status": "closed" - } + # 根据币安是否有持仓来判断失败原因 + if binance_has_position: + # 币安有持仓但下单失败 + error_msg = f"{symbol} 平仓失败:币安账户中有持仓,但下单失败,请检查日志或稍后重试" + logger.error(error_msg) + raise HTTPException(status_code=500, detail=error_msg) + else: + # 币安没有持仓,可能是数据库已更新 + logger.warning(f"⚠ {symbol} 币安账户中没有持仓,可能已被平仓或数据库已更新") + return { + "message": f"{symbol} 平仓操作完成(币安账户中没有持仓,可能已被平仓)", + "symbol": symbol, + "status": "closed" + } finally: logger.info("断开币安API连接...") await client.disconnect()