This commit is contained in:
薇薇安 2026-01-21 22:48:01 +08:00
parent 414607d566
commit 87e7865cbb
2 changed files with 50 additions and 22 deletions

View File

@ -552,11 +552,12 @@ class BinanceClient:
if usdt_asset:
return {
'ok': True,
'available': float(usdt_asset['availableBalance']),
'total': float(usdt_asset['walletBalance']),
'margin': float(usdt_asset['marginBalance'])
}
return {'available': 0.0, 'total': 0.0, 'margin': 0.0}
return {'ok': True, 'available': 0.0, 'total': 0.0, 'margin': 0.0}
except BinanceAPIException as e:
error_code = e.code if hasattr(e, 'code') else None
error_msg = str(e)
@ -599,7 +600,14 @@ class BinanceClient:
logger.error("\n".join(lines))
return {'available': 0.0, 'total': 0.0, 'margin': 0.0}
return {
'ok': False,
'available': 0.0,
'total': 0.0,
'margin': 0.0,
'error_code': error_code,
'error_msg': error_msg,
}
async def get_open_positions(self) -> List[Dict]:
"""

View File

@ -251,31 +251,51 @@ async def main():
)
await client.connect()
# 2. 检查账户余额
# 2. 检查账户余额/权限
logger.info("检查账户余额...")
balance = await client.get_account_balance()
if balance['total'] == 0 and balance['available'] == 0:
# 若底层调用失败(例如 -2015 / -1022 / IP白名单这里给出明确错误并以 code=2 退出supervisor 不会反复拉起)
if isinstance(balance, dict) and balance.get("ok") is False:
code = balance.get("error_code")
msg = balance.get("error_msg") or ""
logger.error("=" * 60)
logger.error("无法获取账户余额可能是API权限问题")
logger.error(f"获取账户余额失败(可能是权限/白名单/环境不匹配。error_code={code}, error={msg}")
logger.error("请检查:")
logger.error("1. API密钥是否正确")
logger.error("2. API密钥是否启用了'合约交易'权限")
logger.error("3. IP地址是否在白名单中如果设置了IP限制")
logger.error("4. 测试网/生产网环境是否匹配")
logger.error("1) API Key/Secret 是否正确(不要有空格/换行)")
logger.error("2) API Key 是否启用了【合约交易USDT-M Futures权限")
logger.error("3) 若设置了 IP 白名单,请把服务器出口 IP 加进去")
logger.error("4) 测试网/生产网是否匹配(账号的 USE_TESTNET 设置要与 Key 所属环境一致)")
logger.error("=" * 60)
return
logger.info(
f"账户余额: 总余额 {balance['total']:.2f} USDT, "
f"可用余额 {balance['available']:.2f} USDT"
)
if balance['available'] <= 0:
logger.error("账户可用余额不足,无法交易")
logger.error(f"总余额: {balance['total']:.2f} USDT")
logger.error("请先充值到合约账户")
return
raise SystemExit(2)
total = float((balance or {}).get("total") or 0.0)
available = float((balance or {}).get("available") or 0.0)
logger.info(f"账户余额: 总余额 {total:.2f} USDT, 可用余额 {available:.2f} USDT")
# 若余额为 0不直接退出保持进程运行并周期性重试便于充值后自动恢复
if available <= 0:
logger.error("=" * 60)
logger.error("账户可用余额不足(<=0交易策略不会启动将每 60 秒重试一次余额读取。")
logger.error(f"当前余额: total={total:.2f} USDT, available={available:.2f} USDT")
logger.error("提示:若你确信余额不为 0但仍显示为 0请优先检查 API 权限/IP 白名单/测试网配置。")
logger.error("=" * 60)
while True:
await asyncio.sleep(60)
try:
b2 = await client.get_account_balance()
if isinstance(b2, dict) and b2.get("ok") is False:
logger.error(f"余额重试失败error_code={b2.get('error_code')}, error={b2.get('error_msg')}")
continue
total = float((b2 or {}).get("total") or 0.0)
available = float((b2 or {}).get("available") or 0.0)
logger.info(f"余额重试: total={total:.2f}, available={available:.2f}")
if available > 0:
logger.info("检测到可用余额 > 0开始启动交易策略。")
break
except Exception as e:
logger.error(f"余额重试异常: {e}", exc_info=True)
continue
# 4. 初始化各个模块