stock-ai-agent/scripts/test_bitget_sdk.py

171 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
测试 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()