a
This commit is contained in:
parent
2dd5276070
commit
1bb80ee0b0
|
|
@ -62,6 +62,15 @@ BINANCE_API_SECRET = 'your_api_secret'
|
||||||
USE_TESTNET = True # 测试网模式
|
USE_TESTNET = True # 测试网模式
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**⚠️ 重要:API密钥权限配置**
|
||||||
|
|
||||||
|
确保你的API密钥已启用以下权限:
|
||||||
|
- ✅ **启用读取** - 必须启用
|
||||||
|
- ✅ **启用合约交易** - 必须启用(关键!)
|
||||||
|
- ❌ **启用提币** - 不要启用(安全考虑)
|
||||||
|
|
||||||
|
如果遇到 `APIError(code=-2015)` 错误,请查看 [API_KEY_SETUP.md](API_KEY_SETUP.md) 获取详细解决方案。
|
||||||
|
|
||||||
### 3. 调整交易参数(可选)
|
### 3. 调整交易参数(可选)
|
||||||
|
|
||||||
编辑 `config.py` 中的 `TRADING_CONFIG` 字典,根据你的需求调整参数:
|
编辑 `config.py` 中的 `TRADING_CONFIG` 字典,根据你的需求调整参数:
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,10 @@ class BinanceClient:
|
||||||
|
|
||||||
self.socket_manager = BinanceSocketManager(self.client)
|
self.socket_manager = BinanceSocketManager(self.client)
|
||||||
logger.info(f"✓ 币安客户端连接成功 (测试网: {self.testnet})")
|
logger.info(f"✓ 币安客户端连接成功 (测试网: {self.testnet})")
|
||||||
|
|
||||||
|
# 验证API密钥权限
|
||||||
|
await self._verify_api_permissions()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
except asyncio.TimeoutError as e:
|
except asyncio.TimeoutError as e:
|
||||||
|
|
@ -96,6 +100,22 @@ class BinanceClient:
|
||||||
logger.error("=" * 60)
|
logger.error("=" * 60)
|
||||||
raise ConnectionError(error_msg)
|
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):
|
async def disconnect(self):
|
||||||
"""断开连接"""
|
"""断开连接"""
|
||||||
if self.client:
|
if self.client:
|
||||||
|
|
@ -187,7 +207,35 @@ class BinanceClient:
|
||||||
}
|
}
|
||||||
return {'available': 0.0, 'total': 0.0, 'margin': 0.0}
|
return {'available': 0.0, 'total': 0.0, 'margin': 0.0}
|
||||||
except BinanceAPIException as e:
|
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}
|
return {'available': 0.0, 'total': 0.0, 'margin': 0.0}
|
||||||
|
|
||||||
async def get_open_positions(self) -> List[Dict]:
|
async def get_open_positions(self) -> List[Dict]:
|
||||||
|
|
|
||||||
|
|
@ -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')
|
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 = {
|
TRADING_CONFIG = {
|
||||||
|
|
|
||||||
15
main.py
15
main.py
|
|
@ -53,7 +53,20 @@ async def main():
|
||||||
await client.connect()
|
await client.connect()
|
||||||
|
|
||||||
# 2. 检查账户余额
|
# 2. 检查账户余额
|
||||||
|
logger.info("检查账户余额...")
|
||||||
balance = await client.get_account_balance()
|
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(
|
logger.info(
|
||||||
f"账户余额: 总余额 {balance['total']:.2f} USDT, "
|
f"账户余额: 总余额 {balance['total']:.2f} USDT, "
|
||||||
f"可用余额 {balance['available']:.2f} USDT"
|
f"可用余额 {balance['available']:.2f} USDT"
|
||||||
|
|
@ -61,6 +74,8 @@ async def main():
|
||||||
|
|
||||||
if balance['available'] <= 0:
|
if balance['available'] <= 0:
|
||||||
logger.error("账户可用余额不足,无法交易")
|
logger.error("账户可用余额不足,无法交易")
|
||||||
|
logger.error(f"总余额: {balance['total']:.2f} USDT")
|
||||||
|
logger.error("请先充值到合约账户")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 3. 初始化各个模块
|
# 3. 初始化各个模块
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user