This commit is contained in:
薇薇安 2026-02-13 22:14:04 +08:00
parent c9f676c68a
commit a19c716166
2 changed files with 45 additions and 30 deletions

View File

@ -1849,7 +1849,7 @@ class BinanceClient:
logger.debug(f" 堆栈跟踪: {traceback.format_exc()}")
return None
async def set_leverage(self, symbol: str, leverage: int = 10) -> bool:
async def set_leverage(self, symbol: str, leverage: int = 10) -> int:
"""
设置杠杆倍数
如果设置失败比如超过交易对支持的最大杠杆会自动降低杠杆重试
@ -1859,41 +1859,44 @@ class BinanceClient:
leverage: 杠杆倍数可为 int float内部会转为 int
Returns:
是否成功
成功设置的杠杆倍数如果失败返回 0
"""
leverage = int(leverage) # 币安 API 要求整数;动态杠杆可能传入 float
target_leverage = int(leverage) # 币安 API 要求整数
symbol = self._resolve_api_symbol(symbol)
if not symbol:
logger.error(f"❌ 设置杠杆请求 symbol 为空")
import traceback
logger.error(f" 调用堆栈:\n{traceback.format_exc()}")
return False
return 0
# 定义降级尝试序列(如果目标杠杆失败,依次尝试这些标准倍数)
# 必须确保序列中的值小于 target_leverage
fallback_levels = [50, 20, 10, 5, 3, 2, 1]
# 第一次尝试:目标杠杆
try:
await self.client.futures_change_leverage(symbol=symbol, leverage=leverage)
logger.info(f"设置杠杆成功: {symbol} {leverage}x")
return True
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()
# 如果错误信息包含杠杆相关的内容,尝试降低杠杆
if 'leverage' in error_msg or 'invalid' in error_msg:
# 尝试降低杠杆每次降低5倍最低到1倍
for reduced_leverage in range(leverage - 5, 0, -5):
if reduced_leverage < 1:
reduced_leverage = 1
try:
await self.client.futures_change_leverage(symbol=symbol, leverage=reduced_leverage)
logger.warning(
f"{symbol} 杠杆 {leverage}x 设置失败,已自动降低为 {reduced_leverage}x "
f"(原因: {e})"
)
return True
except BinanceAPIException:
if reduced_leverage <= 1:
break
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
logger.error(f"设置杠杆失败: {symbol} {leverage}x, 错误: {e}")
return False
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
def get_realtime_price(self, symbol: str) -> Optional[float]:
"""

View File

@ -215,7 +215,16 @@ class PositionManager:
return None
# 设置杠杆(确保为 int避免动态杠杆传入 float 导致 API/range 报错)
await self.client.set_leverage(symbol, int(leverage))
actual_leverage = await self.client.set_leverage(symbol, int(leverage))
if actual_leverage <= 0:
logger.error(f"{symbol} 无法设置有效杠杆,跳过开仓")
return None
# 使用实际生效的杠杆(可能被降级)
if actual_leverage != int(leverage):
logger.warning(f"{symbol} 杠杆被调整: {int(leverage)}x -> {actual_leverage}x")
leverage = actual_leverage
# 计算仓位大小(传入实际使用的杠杆)
# ⚠️ 优化:先估算止损价格,用于固定风险百分比计算
@ -299,8 +308,11 @@ class PositionManager:
if quantity is not None and adjusted_leverage is not None and adjusted_leverage != leverage:
logger.info(f"{symbol} 风险控制调整杠杆: {leverage}x -> {adjusted_leverage}x (适应宽止损)")
try:
await self.client.set_leverage(symbol, int(adjusted_leverage))
leverage = adjusted_leverage
new_lev = await self.client.set_leverage(symbol, int(adjusted_leverage))
if new_lev > 0:
leverage = new_lev
else:
logger.warning(f"{symbol} 调整杠杆失败,保持 {leverage}x")
except Exception as e:
logger.error(f"{symbol} 调整杠杆失败: {e},将使用原杠杆 {leverage}x 继续")