171 lines
4.9 KiB
Python
171 lines
4.9 KiB
Python
"""
|
||
测试 Bitget CCXT SDK 实现
|
||
|
||
在运行之前,请确保:
|
||
1. 已安装 ccxt: pip install ccxt
|
||
2. 已在 .env 文件中配置 Bitget API 密钥
|
||
3. 使用测试网进行测试(BITGET_USE_TESTNET=true)
|
||
"""
|
||
import sys
|
||
import os
|
||
from pathlib import Path
|
||
|
||
# 添加项目路径
|
||
script_dir = Path(__file__).parent
|
||
project_root = script_dir.parent
|
||
backend_dir = project_root / "backend"
|
||
|
||
sys.path.insert(0, str(backend_dir))
|
||
sys.path.insert(0, str(project_root))
|
||
|
||
# 设置工作目录
|
||
os.chdir(project_root)
|
||
|
||
from app.services.bitget_trading_api_sdk import BitgetTradingAPI
|
||
from app.config import get_settings
|
||
from app.utils.logger import logger
|
||
|
||
|
||
def test_connection():
|
||
"""测试 API 连接"""
|
||
logger.info("=" * 60)
|
||
logger.info("测试 1: API 连接测试")
|
||
logger.info("=" * 60)
|
||
|
||
settings = get_settings()
|
||
|
||
api = BitgetTradingAPI(
|
||
api_key=settings.bitget_api_key,
|
||
api_secret=settings.bitget_api_secret,
|
||
passphrase=settings.bitget_passphrase,
|
||
use_testnet=settings.bitget_use_testnet
|
||
)
|
||
|
||
result = api.test_connection()
|
||
logger.info(f"连接测试结果: {'✅ 成功' if result else '❌ 失败'}")
|
||
|
||
return api if result else None
|
||
|
||
|
||
def test_get_balance(api):
|
||
"""测试查询余额"""
|
||
logger.info("\n" + "=" * 60)
|
||
logger.info("测试 2: 查询账户余额")
|
||
logger.info("=" * 60)
|
||
|
||
balance = api.get_balance()
|
||
|
||
if balance:
|
||
logger.info(f"✅ 余额查询成功")
|
||
for currency, info in balance.items():
|
||
available = info.get('available', '0')
|
||
frozen = info.get('frozen', '0')
|
||
logger.info(f" {currency}: 可用={available}, 冻结={frozen}")
|
||
else:
|
||
logger.error("❌ 余额查询失败")
|
||
|
||
|
||
def test_get_position(api):
|
||
"""测试查询持仓"""
|
||
logger.info("\n" + "=" * 60)
|
||
logger.info("测试 3: 查询持仓")
|
||
logger.info("=" * 60)
|
||
|
||
positions = api.get_position()
|
||
|
||
if positions:
|
||
logger.info(f"✅ 持仓查询成功,共 {len(positions)} 个持仓")
|
||
for pos in positions:
|
||
symbol = pos.get('symbol', 'N/A')
|
||
size = pos.get('contracts', 0)
|
||
side = pos.get('side', 'N/A')
|
||
unrealized_pnl = pos.get('unrealizedPnl', 0)
|
||
logger.info(f" {symbol} {side} {size}张 (未实现盈亏: {unrealized_pnl})")
|
||
else:
|
||
logger.info(" 当前无持仓")
|
||
|
||
|
||
def test_get_open_orders(api):
|
||
"""测试查询挂单"""
|
||
logger.info("\n" + "=" * 60)
|
||
logger.info("测试 4: 查询当前挂单")
|
||
logger.info("=" * 60)
|
||
|
||
orders = api.get_open_orders()
|
||
|
||
if orders:
|
||
logger.info(f"✅ 挂单查询成功,共 {len(orders)} 个挂单")
|
||
for order in orders[:5]: # 只显示前 5 个
|
||
symbol = order.get('symbol', 'N/A')
|
||
side = order.get('side', 'N/A')
|
||
price = order.get('price', 'N/A')
|
||
amount = order.get('amount', 'N/A')
|
||
logger.info(f" {symbol} {side} @ {price} x {amount}")
|
||
else:
|
||
logger.info(" 当前无挂单")
|
||
|
||
|
||
def test_market_ticker(api, symbol='BTC/USDT:USDT'):
|
||
"""测试获取市场行情"""
|
||
logger.info("\n" + "=" * 60)
|
||
logger.info(f"测试 5: 获取 {symbol} 市场行情")
|
||
logger.info("=" * 60)
|
||
|
||
try:
|
||
ticker = api.exchange.fetch_ticker(symbol)
|
||
if ticker:
|
||
logger.info(f"✅ 行情获取成功")
|
||
logger.info(f" 交易对: {symbol}")
|
||
logger.info(f" 最新价: {ticker.get('last', 'N/A')}")
|
||
logger.info(f" 24h涨跌: {ticker.get('percentage', 'N/A')}%")
|
||
logger.info(f" 24h成交量: {ticker.get('baseVolume', 'N/A')}")
|
||
except Exception as e:
|
||
logger.error(f"❌ 行情获取失败: {e}")
|
||
|
||
|
||
def main():
|
||
"""主测试函数"""
|
||
logger.info("🚀 开始测试 Bitget CCXT SDK 实现")
|
||
|
||
# 检查配置
|
||
settings = get_settings()
|
||
if not settings.bitget_api_key or not settings.bitget_api_secret:
|
||
logger.error("❌ 未配置 Bitget API 密钥,请在 .env 文件中设置:")
|
||
logger.error(" BITGET_API_KEY=your_api_key")
|
||
logger.error(" BITGET_API_SECRET=your_api_secret")
|
||
return
|
||
|
||
# 测试连接
|
||
api = test_connection()
|
||
if not api:
|
||
logger.error("❌ API 连接失败,请检查:")
|
||
logger.error(" 1. API 密钥是否正确")
|
||
logger.error(" 2. 网络连接是否正常")
|
||
logger.error(" 3. 测试网是否可用")
|
||
return
|
||
|
||
# 运行测试
|
||
try:
|
||
test_get_balance(api)
|
||
test_get_position(api)
|
||
test_get_open_orders(api)
|
||
test_market_ticker(api)
|
||
|
||
logger.info("\n" + "=" * 60)
|
||
logger.info("✅ 所有测试完成")
|
||
logger.info("=" * 60)
|
||
|
||
except Exception as e:
|
||
logger.error(f"❌ 测试过程中出错: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
finally:
|
||
# 关闭连接
|
||
api.close()
|
||
logger.info("\n🔌 API 连接已关闭")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|