diff --git a/README.md b/README.md index 6b713d5..f4da485 100644 --- a/README.md +++ b/README.md @@ -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` 字典,根据你的需求调整参数: diff --git a/binance_client.py b/binance_client.py index 16ebf4e..7244fbb 100644 --- a/binance_client.py +++ b/binance_client.py @@ -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]: diff --git a/config.py b/config.py index e364051..f827847 100644 --- a/config.py +++ b/config.py @@ -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 = { diff --git a/main.py b/main.py index ffc4690..3a7a3ad 100644 --- a/main.py +++ b/main.py @@ -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. 初始化各个模块