1
This commit is contained in:
parent
c9f676c68a
commit
a19c716166
|
|
@ -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]:
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -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 继续")
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user