This commit is contained in:
薇薇安 2026-01-13 14:50:31 +08:00
parent 2dd5276070
commit 1bb80ee0b0
4 changed files with 74 additions and 2 deletions

View File

@ -62,6 +62,15 @@ BINANCE_API_SECRET = 'your_api_secret'
USE_TESTNET = True # 测试网模式
```
**⚠️ 重要API密钥权限配置**
确保你的API密钥已启用以下权限
- ✅ **启用读取** - 必须启用
- ✅ **启用合约交易** - 必须启用(关键!)
- ❌ **启用提币** - 不要启用(安全考虑)
如果遇到 `APIError(code=-2015)` 错误,请查看 [API_KEY_SETUP.md](API_KEY_SETUP.md) 获取详细解决方案。
### 3. 调整交易参数(可选)
编辑 `config.py` 中的 `TRADING_CONFIG` 字典,根据你的需求调整参数:

View File

@ -64,6 +64,10 @@ class BinanceClient:
self.socket_manager = BinanceSocketManager(self.client)
logger.info(f"✓ 币安客户端连接成功 (测试网: {self.testnet})")
# 验证API密钥权限
await self._verify_api_permissions()
return
except asyncio.TimeoutError as e:
@ -96,6 +100,22 @@ class BinanceClient:
logger.error("=" * 60)
raise ConnectionError(error_msg)
async def _verify_api_permissions(self):
"""
验证API密钥权限
"""
try:
# 尝试获取账户信息来验证权限
await self.client.futures_account()
logger.info("✓ API密钥权限验证通过")
except BinanceAPIException as e:
error_code = e.code if hasattr(e, 'code') else None
if error_code == -2015:
logger.warning("⚠ API密钥权限验证失败可能无法进行合约交易")
logger.warning("请检查API密钥是否启用了合约交易权限")
else:
logger.warning(f"⚠ API密钥验证时出现错误: {e}")
async def disconnect(self):
"""断开连接"""
if self.client:
@ -187,7 +207,35 @@ class BinanceClient:
}
return {'available': 0.0, 'total': 0.0, 'margin': 0.0}
except BinanceAPIException as e:
logger.error(f"获取账户余额失败: {e}")
error_code = e.code if hasattr(e, 'code') else None
error_msg = str(e)
logger.error("=" * 60)
logger.error(f"获取账户余额失败: {error_msg}")
if error_code == -2015:
logger.error("=" * 60)
logger.error("API密钥权限错误 (错误代码: -2015)")
logger.error("可能的原因:")
logger.error("1. API密钥无效或已过期")
logger.error("2. API密钥没有合约交易权限")
logger.error("3. IP地址未添加到API密钥白名单")
logger.error("4. 测试网/生产网环境不匹配")
logger.error("=" * 60)
logger.error("解决方案:")
logger.error("1. 登录币安账户检查API密钥状态")
logger.error("2. 确保API密钥已启用'合约交易'权限")
logger.error("3. 如果设置了IP白名单请添加当前服务器IP")
logger.error("4. 检查 USE_TESTNET 配置是否正确")
logger.error(f" 当前配置: USE_TESTNET = {self.testnet}")
logger.error("=" * 60)
elif error_code == -1022:
logger.error("签名错误请检查API密钥和密钥是否正确")
elif error_code == -2010:
logger.error("账户余额不足")
else:
logger.error(f"错误代码: {error_code}")
return {'available': 0.0, 'total': 0.0, 'margin': 0.0}
async def get_open_positions(self) -> List[Dict]:

View File

@ -9,7 +9,7 @@ BINANCE_API_KEY: Optional[str] = os.getenv('BINANCE_API_KEY', 'pMEXSgISMgpUIpGjy
BINANCE_API_SECRET: Optional[str] = os.getenv('BINANCE_API_SECRET', 'RklItVtBCjGV40mIquoSj78xlTGkdUxz0AFyTnsnuzSBfx776VG0S2Vw5BRLRRg2')
# 测试网配置(开发时使用)
USE_TESTNET: bool = os.getenv('USE_TESTNET', 'True').lower() == 'true'
USE_TESTNET: bool = os.getenv('USE_TESTNET', 'False').lower() == 'true'
# 交易参数配置
TRADING_CONFIG = {

15
main.py
View File

@ -53,7 +53,20 @@ async def main():
await client.connect()
# 2. 检查账户余额
logger.info("检查账户余额...")
balance = await client.get_account_balance()
if balance['total'] == 0 and balance['available'] == 0:
logger.error("=" * 60)
logger.error("无法获取账户余额可能是API权限问题")
logger.error("请检查:")
logger.error("1. API密钥是否正确")
logger.error("2. API密钥是否启用了'合约交易'权限")
logger.error("3. IP地址是否在白名单中如果设置了IP限制")
logger.error("4. 测试网/生产网环境是否匹配")
logger.error("=" * 60)
return
logger.info(
f"账户余额: 总余额 {balance['total']:.2f} USDT, "
f"可用余额 {balance['available']:.2f} USDT"
@ -61,6 +74,8 @@ async def main():
if balance['available'] <= 0:
logger.error("账户可用余额不足,无法交易")
logger.error(f"总余额: {balance['total']:.2f} USDT")
logger.error("请先充值到合约账户")
return
# 3. 初始化各个模块