From 19371a8e602a1527879e9260904eaf3804b1e4db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sat, 14 Feb 2026 17:53:22 +0800 Subject: [PATCH] 1 --- trading_system/binance_client.py | 25 ++++++++++++++++--------- trading_system/config.py | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index 327236e..e1a2b60 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -765,10 +765,10 @@ class BinanceClient: Returns: 持仓列表 """ - retries = 5 + retries = 7 last_error = None - read_timeout = getattr(config, 'READ_ONLY_REQUEST_TIMEOUT', 45) + read_timeout = getattr(config, 'READ_ONLY_REQUEST_TIMEOUT', 60) for attempt in range(retries): try: # 增加 recvWindow 以避免 -1021 错误;仅此只读接口用较长超时,不影响下单类接口 @@ -815,9 +815,11 @@ class BinanceClient: logger.warning(f"获取持仓信息失败 (第 {attempt + 1}/{retries} 次): {_format_exception(e)},{wait}秒后重试...") await asyncio.sleep(wait) continue - - logger.error(f"获取持仓信息失败: {_format_exception(e)}") - return [] + # 最后一次仍失败,不在此处打 ERROR,交给循环外统一打「已重试 N 次」 + else: + logger.error(f"获取持仓信息失败: {_format_exception(e)}") + return [] + # 网络类错误且最后一次:跳出循环,由下方统一打日志并返回 [] except Exception as e: logger.error(f"获取持仓信息失败: {_format_exception(e)}") return [] @@ -838,15 +840,19 @@ class BinanceClient: Returns: 成交记录列表 """ - retries = 3 - read_timeout = getattr(config, 'READ_ONLY_REQUEST_TIMEOUT', 45) + retries = 5 + last_error = None + attempts_made = 0 + read_timeout = getattr(config, 'READ_ONLY_REQUEST_TIMEOUT', 60) for attempt in range(retries): + attempts_made = attempt + 1 try: return await asyncio.wait_for( self.client.futures_account_trades(symbol=symbol, limit=limit, recvWindow=20000), timeout=read_timeout ) except (asyncio.TimeoutError, BinanceAPIException) as e: + last_error = e is_retryable = isinstance(e, asyncio.TimeoutError) or ( isinstance(e, BinanceAPIException) and (e.code == -1021 or str(e.code).startswith('5')) ) @@ -854,11 +860,12 @@ class BinanceClient: logger.warning(f"获取成交记录失败 {symbol} (第 {attempt + 1}/{retries} 次): {_format_exception(e)},1秒后重试...") await asyncio.sleep(1) continue - logger.error(f"获取成交记录失败 {symbol}: {_format_exception(e)}") - return [] + break except Exception as e: logger.error(f"获取成交记录失败 {symbol}: {_format_exception(e)}") return [] + if last_error: + logger.error(f"获取成交记录失败 {symbol} (已重试 {attempts_made} 次): {_format_exception(last_error)}") return [] async def get_symbol_info(self, symbol: str) -> Optional[Dict]: diff --git a/trading_system/config.py b/trading_system/config.py index 9fa7833..7aa6d11 100644 --- a/trading_system/config.py +++ b/trading_system/config.py @@ -390,7 +390,7 @@ def reload_config(): CONNECTION_TIMEOUT = int(os.getenv('CONNECTION_TIMEOUT', '30')) # 连接超时时间(秒) CONNECTION_RETRIES = int(os.getenv('CONNECTION_RETRIES', '3')) # 连接重试次数 # 仅用于 get_open_positions / get_recent_trades 等只读接口的单次等待时间,不影响下单/止损止盈的快速失败 -READ_ONLY_REQUEST_TIMEOUT = int(os.getenv('READ_ONLY_REQUEST_TIMEOUT', '45')) +READ_ONLY_REQUEST_TIMEOUT = int(os.getenv('READ_ONLY_REQUEST_TIMEOUT', '60')) # Redis 缓存配置(优先从数据库,回退到环境变量和默认值) REDIS_URL = _get_config_value('REDIS_URL', os.getenv('REDIS_URL', 'redis://localhost:6379'))