From 3bfbafbab267cb612dca303c3b57b5f7dc48332b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sat, 21 Feb 2026 10:44:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(binance=5Fclient,=20position=5Fmanager):?= =?UTF-8?q?=20=E5=A2=9E=E5=BC=BA=E6=9D=A0=E6=9D=86=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=8E=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 `binance_client.py` 中为杠杆设置添加了网络超时重试机制,确保在请求超时的情况下能够自动重试,提升了系统的稳定性。同时,在 `position_manager.py` 中优化了临时持仓记录的错误日志,增加了异常信息的详细记录,便于后续调试与问题追踪。这些改进增强了系统的可靠性与可维护性。 --- trading_system/binance_client.py | 58 ++++++++++++++++-------------- trading_system/position_manager.py | 6 +++- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index f446a23..907d9f3 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -2641,32 +2641,38 @@ class BinanceClient: # 必须确保序列中的值小于 target_leverage fallback_levels = [50, 20, 10, 5, 3, 2, 1] - # 第一次尝试:目标杠杆 - try: - 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() - 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 - - 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 + # 第一次尝试:目标杠杆(网络超时重试 2 次) + for attempt in range(3): + try: + await self.client.futures_change_leverage(symbol=symbol, leverage=target_leverage) + logger.info(f"设置杠杆成功: {symbol} {target_leverage}x") + return target_leverage + except (TimeoutError, asyncio.TimeoutError): + if attempt < 2: + wait_sec = (attempt + 1) * 3 + logger.warning(f"设置杠杆请求超时 ({symbol} {target_leverage}x),{wait_sec} 秒后重试 ({attempt + 1}/2)") + await asyncio.sleep(wait_sec) + else: + logger.error(f"设置杠杆请求超时 ({symbol} {target_leverage}x),已重试 2 次仍失败") + return 0 + except BinanceAPIException as e: + error_msg = str(e).lower() + 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 + try: + await self.client.futures_change_leverage(symbol=symbol, leverage=fallback) + logger.warning( + f"{symbol} 杠杆降级成功: {target_leverage}x -> {fallback}x" + ) + return fallback + except (TimeoutError, asyncio.TimeoutError, 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 e9e77a9..9e38854 100644 --- a/trading_system/position_manager.py +++ b/trading_system/position_manager.py @@ -3609,7 +3609,11 @@ class PositionManager: except Exception as e: logger.warning(f"{symbol} 补挂币安止盈止损失败(不影响监控): {e}") except Exception as e: - logger.error(f"[账号{self.account_id}] {symbol} 创建临时持仓记录失败: {e}") + err_msg = str(e) or repr(e) or type(e).__name__ + logger.error( + f"[账号{self.account_id}] {symbol} 创建临时持仓记录失败: {err_msg}", + exc_info=True, + ) else: # 已在 active_positions 的持仓:启动前统一补挂/修正交易所 SL/TP(识别缺止盈、止损过远等异常并替换) position_info = self.active_positions.get(symbol)