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)