feat(binance_client, position_manager): 增强杠杆设置与异常处理逻辑

在 `binance_client.py` 中为杠杆设置添加了网络超时重试机制,确保在请求超时的情况下能够自动重试,提升了系统的稳定性。同时,在 `position_manager.py` 中优化了临时持仓记录的错误日志,增加了异常信息的详细记录,便于后续调试与问题追踪。这些改进增强了系统的可靠性与可维护性。
This commit is contained in:
薇薇安 2026-02-21 10:44:55 +08:00
parent b588d5b82b
commit 3bfbafbab2
2 changed files with 37 additions and 27 deletions

View File

@ -2641,30 +2641,36 @@ class BinanceClient:
# 必须确保序列中的值小于 target_leverage # 必须确保序列中的值小于 target_leverage
fallback_levels = [50, 20, 10, 5, 3, 2, 1] fallback_levels = [50, 20, 10, 5, 3, 2, 1]
# 第一次尝试:目标杠杆 # 第一次尝试:目标杠杆(网络超时重试 2 次)
for attempt in range(3):
try: try:
await self.client.futures_change_leverage(symbol=symbol, leverage=target_leverage) await self.client.futures_change_leverage(symbol=symbol, leverage=target_leverage)
logger.info(f"设置杠杆成功: {symbol} {target_leverage}x") logger.info(f"设置杠杆成功: {symbol} {target_leverage}x")
return target_leverage 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: except BinanceAPIException as e:
error_msg = str(e).lower() error_msg = str(e).lower()
logger.warning(f"设置杠杆 {target_leverage}x 失败: {e},尝试降低杠杆...") logger.warning(f"设置杠杆 {target_leverage}x 失败: {e},尝试降低杠杆...")
# 如果是 leverage 相关错误,尝试降级 # 如果是 leverage 相关错误,尝试降级
if 'leverage' in error_msg or 'invalid' in error_msg or 'max' in error_msg: if 'leverage' in error_msg or 'invalid' in error_msg or 'max' in error_msg:
for fallback in fallback_levels: for fallback in fallback_levels:
if fallback >= target_leverage: if fallback >= target_leverage:
continue continue
try: try:
await self.client.futures_change_leverage(symbol=symbol, leverage=fallback) await self.client.futures_change_leverage(symbol=symbol, leverage=fallback)
logger.warning( logger.warning(
f"{symbol} 杠杆降级成功: {target_leverage}x -> {fallback}x" f"{symbol} 杠杆降级成功: {target_leverage}x -> {fallback}x"
) )
return fallback return fallback
except BinanceAPIException: except (TimeoutError, asyncio.TimeoutError, BinanceAPIException):
continue continue
logger.error(f"设置杠杆最终失败: {symbol} (目标: {target_leverage}x)") logger.error(f"设置杠杆最终失败: {symbol} (目标: {target_leverage}x)")
return 0 return 0

View File

@ -3609,7 +3609,11 @@ class PositionManager:
except Exception as e: except Exception as e:
logger.warning(f"{symbol} 补挂币安止盈止损失败(不影响监控): {e}") logger.warning(f"{symbol} 补挂币安止盈止损失败(不影响监控): {e}")
except Exception as 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: else:
# 已在 active_positions 的持仓:启动前统一补挂/修正交易所 SL/TP识别缺止盈、止损过远等异常并替换 # 已在 active_positions 的持仓:启动前统一补挂/修正交易所 SL/TP识别缺止盈、止损过远等异常并替换
position_info = self.active_positions.get(symbol) position_info = self.active_positions.get(symbol)