1
This commit is contained in:
parent
1830444ef0
commit
19371a8e60
|
|
@ -765,10 +765,10 @@ class BinanceClient:
|
||||||
Returns:
|
Returns:
|
||||||
持仓列表
|
持仓列表
|
||||||
"""
|
"""
|
||||||
retries = 5
|
retries = 7
|
||||||
last_error = None
|
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):
|
for attempt in range(retries):
|
||||||
try:
|
try:
|
||||||
# 增加 recvWindow 以避免 -1021 错误;仅此只读接口用较长超时,不影响下单类接口
|
# 增加 recvWindow 以避免 -1021 错误;仅此只读接口用较长超时,不影响下单类接口
|
||||||
|
|
@ -815,9 +815,11 @@ class BinanceClient:
|
||||||
logger.warning(f"获取持仓信息失败 (第 {attempt + 1}/{retries} 次): {_format_exception(e)},{wait}秒后重试...")
|
logger.warning(f"获取持仓信息失败 (第 {attempt + 1}/{retries} 次): {_format_exception(e)},{wait}秒后重试...")
|
||||||
await asyncio.sleep(wait)
|
await asyncio.sleep(wait)
|
||||||
continue
|
continue
|
||||||
|
# 最后一次仍失败,不在此处打 ERROR,交给循环外统一打「已重试 N 次」
|
||||||
|
else:
|
||||||
logger.error(f"获取持仓信息失败: {_format_exception(e)}")
|
logger.error(f"获取持仓信息失败: {_format_exception(e)}")
|
||||||
return []
|
return []
|
||||||
|
# 网络类错误且最后一次:跳出循环,由下方统一打日志并返回 []
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"获取持仓信息失败: {_format_exception(e)}")
|
logger.error(f"获取持仓信息失败: {_format_exception(e)}")
|
||||||
return []
|
return []
|
||||||
|
|
@ -838,15 +840,19 @@ class BinanceClient:
|
||||||
Returns:
|
Returns:
|
||||||
成交记录列表
|
成交记录列表
|
||||||
"""
|
"""
|
||||||
retries = 3
|
retries = 5
|
||||||
read_timeout = getattr(config, 'READ_ONLY_REQUEST_TIMEOUT', 45)
|
last_error = None
|
||||||
|
attempts_made = 0
|
||||||
|
read_timeout = getattr(config, 'READ_ONLY_REQUEST_TIMEOUT', 60)
|
||||||
for attempt in range(retries):
|
for attempt in range(retries):
|
||||||
|
attempts_made = attempt + 1
|
||||||
try:
|
try:
|
||||||
return await asyncio.wait_for(
|
return await asyncio.wait_for(
|
||||||
self.client.futures_account_trades(symbol=symbol, limit=limit, recvWindow=20000),
|
self.client.futures_account_trades(symbol=symbol, limit=limit, recvWindow=20000),
|
||||||
timeout=read_timeout
|
timeout=read_timeout
|
||||||
)
|
)
|
||||||
except (asyncio.TimeoutError, BinanceAPIException) as e:
|
except (asyncio.TimeoutError, BinanceAPIException) as e:
|
||||||
|
last_error = e
|
||||||
is_retryable = isinstance(e, asyncio.TimeoutError) or (
|
is_retryable = isinstance(e, asyncio.TimeoutError) or (
|
||||||
isinstance(e, BinanceAPIException) and (e.code == -1021 or str(e.code).startswith('5'))
|
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秒后重试...")
|
logger.warning(f"获取成交记录失败 {symbol} (第 {attempt + 1}/{retries} 次): {_format_exception(e)},1秒后重试...")
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
continue
|
continue
|
||||||
logger.error(f"获取成交记录失败 {symbol}: {_format_exception(e)}")
|
break
|
||||||
return []
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"获取成交记录失败 {symbol}: {_format_exception(e)}")
|
logger.error(f"获取成交记录失败 {symbol}: {_format_exception(e)}")
|
||||||
return []
|
return []
|
||||||
|
if last_error:
|
||||||
|
logger.error(f"获取成交记录失败 {symbol} (已重试 {attempts_made} 次): {_format_exception(last_error)}")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
async def get_symbol_info(self, symbol: str) -> Optional[Dict]:
|
async def get_symbol_info(self, symbol: str) -> Optional[Dict]:
|
||||||
|
|
|
||||||
|
|
@ -390,7 +390,7 @@ def reload_config():
|
||||||
CONNECTION_TIMEOUT = int(os.getenv('CONNECTION_TIMEOUT', '30')) # 连接超时时间(秒)
|
CONNECTION_TIMEOUT = int(os.getenv('CONNECTION_TIMEOUT', '30')) # 连接超时时间(秒)
|
||||||
CONNECTION_RETRIES = int(os.getenv('CONNECTION_RETRIES', '3')) # 连接重试次数
|
CONNECTION_RETRIES = int(os.getenv('CONNECTION_RETRIES', '3')) # 连接重试次数
|
||||||
# 仅用于 get_open_positions / get_recent_trades 等只读接口的单次等待时间,不影响下单/止损止盈的快速失败
|
# 仅用于 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 缓存配置(优先从数据库,回退到环境变量和默认值)
|
||||||
REDIS_URL = _get_config_value('REDIS_URL', os.getenv('REDIS_URL', 'redis://localhost:6379'))
|
REDIS_URL = _get_config_value('REDIS_URL', os.getenv('REDIS_URL', 'redis://localhost:6379'))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user