From a19c71616628739d8fd6d78763a4a419893c150e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Fri, 13 Feb 2026 22:14:04 +0800 Subject: [PATCH] 1 --- trading_system/binance_client.py | 57 ++++++++++++++++-------------- trading_system/position_manager.py | 18 ++++++++-- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index b62813c..1fc8c97 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -1849,7 +1849,7 @@ class BinanceClient: logger.debug(f" 堆栈跟踪: {traceback.format_exc()}") return None - async def set_leverage(self, symbol: str, leverage: int = 10) -> bool: + async def set_leverage(self, symbol: str, leverage: int = 10) -> int: """ 设置杠杆倍数 如果设置失败(比如超过交易对支持的最大杠杆),会自动降低杠杆重试 @@ -1859,41 +1859,44 @@ class BinanceClient: leverage: 杠杆倍数(可为 int 或 float,内部会转为 int) Returns: - 是否成功 + 成功设置的杠杆倍数,如果失败返回 0 """ - leverage = int(leverage) # 币安 API 要求整数;动态杠杆可能传入 float + target_leverage = int(leverage) # 币安 API 要求整数 symbol = self._resolve_api_symbol(symbol) if not symbol: logger.error(f"❌ 设置杠杆请求 symbol 为空") - import traceback - logger.error(f" 调用堆栈:\n{traceback.format_exc()}") - return False + return 0 + # 定义降级尝试序列(如果目标杠杆失败,依次尝试这些标准倍数) + # 必须确保序列中的值小于 target_leverage + fallback_levels = [50, 20, 10, 5, 3, 2, 1] + + # 第一次尝试:目标杠杆 try: - await self.client.futures_change_leverage(symbol=symbol, leverage=leverage) - logger.info(f"设置杠杆成功: {symbol} {leverage}x") - return True + await self.client.futures_change_leverage(symbol=symbol, leverage=target_leverage) + logger.info(f"设置杠杆成功: {symbol} {target_leverage}x") + return target_leverage except BinanceAPIException as e: error_msg = str(e).lower() - # 如果错误信息包含杠杆相关的内容,尝试降低杠杆 - if 'leverage' in error_msg or 'invalid' in error_msg: - # 尝试降低杠杆(每次降低5倍,最低到1倍) - for reduced_leverage in range(leverage - 5, 0, -5): - if reduced_leverage < 1: - reduced_leverage = 1 - try: - await self.client.futures_change_leverage(symbol=symbol, leverage=reduced_leverage) - logger.warning( - f"{symbol} 杠杆 {leverage}x 设置失败,已自动降低为 {reduced_leverage}x " - f"(原因: {e})" - ) - return True - except BinanceAPIException: - if reduced_leverage <= 1: - break + logger.warning(f"设置杠杆 {target_leverage}x 失败: {e},尝试降低杠杆...") + + # 如果是 leverage 相关错误,尝试降级 + if 'leverage' in error_msg or 'invalid' in error_msg or 'max' in error_msg: + for fallback in fallback_levels: + if fallback >= target_leverage: continue - logger.error(f"设置杠杆失败: {symbol} {leverage}x, 错误: {e}") - return False + + try: + await self.client.futures_change_leverage(symbol=symbol, leverage=fallback) + logger.warning( + f"{symbol} 杠杆降级成功: {target_leverage}x -> {fallback}x" + ) + return fallback + except BinanceAPIException: + continue + + logger.error(f"设置杠杆最终失败: {symbol} (目标: {target_leverage}x)") + return 0 def get_realtime_price(self, symbol: str) -> Optional[float]: """ diff --git a/trading_system/position_manager.py b/trading_system/position_manager.py index c1ec679..74d3d67 100644 --- a/trading_system/position_manager.py +++ b/trading_system/position_manager.py @@ -215,7 +215,16 @@ class PositionManager: return None # 设置杠杆(确保为 int,避免动态杠杆传入 float 导致 API/range 报错) - await self.client.set_leverage(symbol, int(leverage)) + actual_leverage = await self.client.set_leverage(symbol, int(leverage)) + + if actual_leverage <= 0: + logger.error(f"{symbol} 无法设置有效杠杆,跳过开仓") + return None + + # 使用实际生效的杠杆(可能被降级) + if actual_leverage != int(leverage): + logger.warning(f"{symbol} 杠杆被调整: {int(leverage)}x -> {actual_leverage}x") + leverage = actual_leverage # 计算仓位大小(传入实际使用的杠杆) # ⚠️ 优化:先估算止损价格,用于固定风险百分比计算 @@ -299,8 +308,11 @@ class PositionManager: if quantity is not None and adjusted_leverage is not None and adjusted_leverage != leverage: logger.info(f"{symbol} 风险控制调整杠杆: {leverage}x -> {adjusted_leverage}x (适应宽止损)") try: - await self.client.set_leverage(symbol, int(adjusted_leverage)) - leverage = adjusted_leverage + new_lev = await self.client.set_leverage(symbol, int(adjusted_leverage)) + if new_lev > 0: + leverage = new_lev + else: + logger.warning(f"{symbol} 调整杠杆失败,保持 {leverage}x") except Exception as e: logger.error(f"{symbol} 调整杠杆失败: {e},将使用原杠杆 {leverage}x 继续")