This commit is contained in:
薇薇安 2026-02-14 17:53:22 +08:00
parent 1830444ef0
commit 19371a8e60
2 changed files with 17 additions and 10 deletions

View File

@ -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]:

View File

@ -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'))