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

View File

@ -251,31 +251,51 @@ async def main():
) )
await client.connect() await client.connect()
# 2. 检查账户余额 # 2. 检查账户余额/权限
logger.info("检查账户余额...") logger.info("检查账户余额...")
balance = await client.get_account_balance() 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("=" * 60)
logger.error("无法获取账户余额可能是API权限问题") logger.error(f"获取账户余额失败(可能是权限/白名单/环境不匹配。error_code={code}, error={msg}")
logger.error("请检查:") logger.error("请检查:")
logger.error("1. API密钥是否正确") logger.error("1) API Key/Secret 是否正确(不要有空格/换行)")
logger.error("2. API密钥是否启用了'合约交易'权限") logger.error("2) API Key 是否启用了【合约交易USDT-M Futures权限")
logger.error("3. IP地址是否在白名单中如果设置了IP限制") logger.error("3) 若设置了 IP 白名单,请把服务器出口 IP 加进去")
logger.error("4. 测试网/生产网环境是否匹配") logger.error("4) 测试网/生产网是否匹配(账号的 USE_TESTNET 设置要与 Key 所属环境一致)")
logger.error("=" * 60) logger.error("=" * 60)
return raise SystemExit(2)
logger.info( total = float((balance or {}).get("total") or 0.0)
f"账户余额: 总余额 {balance['total']:.2f} USDT, " available = float((balance or {}).get("available") or 0.0)
f"可用余额 {balance['available']:.2f} USDT" logger.info(f"账户余额: 总余额 {total:.2f} USDT, 可用余额 {available:.2f} USDT")
)
if balance['available'] <= 0: # 若余额为 0不直接退出保持进程运行并周期性重试便于充值后自动恢复
logger.error("账户可用余额不足,无法交易") if available <= 0:
logger.error(f"总余额: {balance['total']:.2f} USDT") logger.error("=" * 60)
logger.error("请先充值到合约账户") logger.error("账户可用余额不足(<=0交易策略不会启动将每 60 秒重试一次余额读取。")
return 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. 初始化各个模块 # 4. 初始化各个模块