stock-ai-agent/scripts/test_real_trading.py

286 lines
8.1 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.

#!/usr/bin/env python3
"""
实盘交易功能测试脚本
测试 Bitget 实盘交易 API 的各项功能
⚠️ 注意: 此脚本会进行真实交易,请确保在测试网环境运行!
"""
import sys
import os
from pathlib import Path
# 添加项目路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root / "backend"))
from app.config import get_settings
from app.services.bitget_trading_api import BitgetTradingAPI, get_bitget_trading_api
from app.services.real_trading_service import get_real_trading_service
def print_section(title: str):
"""打印分节标题"""
print("\n" + "=" * 80)
print(f" {title}")
print("=" * 80)
def test_api_connection():
"""测试 API 连接"""
print_section("1. 测试 API 连接")
settings = get_settings()
print(f"\n配置信息:")
print(f" API Key: {settings.bitget_api_key[:10]}..." if settings.bitget_api_key else " API Key: 未配置")
print(f" 测试网: {'是 ✅' if settings.bitget_use_testnet else '否 ⚠️'}")
if not settings.bitget_api_key or not settings.bitget_api_secret:
print("\n❌ API Key 未配置,请在 .env 文件中设置:")
print(" BITGET_API_KEY=your_api_key")
print(" BITGET_API_SECRET=your_api_secret")
print(" BITGET_PASSPHRASE=your_passphrase")
print(" BITGET_USE_TESTNET=true")
return False
# 创建 API 实例
api = BitgetTradingAPI(
api_key=settings.bitget_api_key,
api_secret=settings.bitget_api_secret,
passphrase=settings.bitget_passphrase,
use_testnet=settings.bitget_use_testnet
)
# 测试连接
if api.test_connection():
print("\n✅ API 连接成功!")
return True
else:
print("\n❌ API 连接失败!")
print(" 请检查:")
print(" 1. API Key 和 Secret 是否正确")
print(" 2. 是否在测试网环境")
print(" 3. API 权限是否正确")
return False
def test_query_account():
"""测试查询账户"""
print_section("2. 测试查询账户")
api = get_bitget_trading_api()
if not api:
print("\n❌ 交易 API 未初始化")
return False
# 查询余额
print("\n查询账户余额...")
balance = api.get_balance()
if balance:
usdt_info = balance.get('USDT', {})
print(f"\n✅ USDT 余额:")
print(f" 可用: ${float(usdt_info.get('available', 0)):,.2f}")
print(f" 冻结: ${float(usdt_info.get('frozen', 0)):,.2f}")
print(f" 锁定: ${float(usdt_info.get('locked', 0)):,.2f}")
return True
else:
print("\n❌ 查询余额失败")
return False
def test_query_position():
"""测试查询持仓"""
print_section("3. 测试查询持仓")
api = get_bitget_trading_api()
if not api:
print("\n❌ 交易 API 未初始化")
return False
# 查询持仓
print("\n查询当前持仓...")
positions = api.get_position()
print(f"\n✅ 当前持仓数量: {len(positions)}")
if positions:
for pos in positions:
symbol = pos.get('symbol', 'N/A')
total = pos.get('total', 0)
available = pos.get('available', 0)
hold_side = pos.get('holdSide', 'N/A')
avg_price = pos.get('averageOpenPrice', 0)
print(f"\n {symbol} ({hold_side})")
print(f" 持仓: {total}")
print(f" 可用: {available}")
print(f" 均价: ${avg_price}")
else:
print(" 无持仓")
return True
def test_place_small_order():
"""
测试下单(小仓位测试)
⚠️ 警告: 此函数会进行真实交易!
建议在测试网运行,并使用最小仓位
"""
print_section("4. 测试下单 (⚠️ 实盘交易)")
# 确认是否要测试
print("\n⚠️ 警告: 此测试会进行真实下单!")
print(" 建议: 1. 确保在测试网环境")
print(" 2. 使用最小仓位测试")
print(" 3. 先手动撤销测试订单")
api = get_bitget_trading_api()
if not api:
print("\n❌ 交易 API 未初始化")
return False
# 使用 BTCUSDT 进行测试
symbol = "BTCUSDT"
# 查询当前价格
from app.services.bitget_service import bitget_service
current_price = bitget_service.get_current_price(symbol)
if not current_price:
print(f"\n❌ 无法获取 {symbol} 当前价格")
return False
print(f"\n{symbol} 当前价格: ${current_price:,.2f}")
# 使用最小数量1张通常约等于1 USDT
test_size = 1
# 使用市价单测试(快速成交)
print(f"\n准备下测试单:")
print(f" 交易对: {symbol}")
print(f" 方向: 开多 (open_long)")
print(f" 类型: 市价单")
print(f" 数量: {test_size} 张 (约 ${test_size})")
# 取消注释以实际下单
print("\n❗ 下单功能已禁用,避免意外交易")
print(" 如需测试,请手动取消下面的注释并确认:")
print("")
"""
# 实际下单代码(已注释,需手动取消注释)
result = api.place_order(
symbol=symbol,
side='open_long',
order_type='market',
size=test_size
)
if result:
order_id = result.get('orderId')
print(f"\n✅ 下单成功!")
print(f" 订单ID: {order_id}")
print(f" 请在交易所检查订单状态")
# 询问是否立即撤单
print("\n是否立即撤单?(测试用)")
# input("按回车键撤单...")
# 撤单
if api.cancel_order(symbol, order_id=order_id):
print(f"\n✅ 撤单成功")
else:
print(f"\n❌ 撤单失败,请手动在交易所撤单")
return True
else:
print(f"\n❌ 下单失败")
return False
"""
return False
def test_real_trading_service():
"""测试实盘交易服务"""
print_section("5. 测试实盘交易服务")
service = get_real_trading_service()
if not service:
print("\n❌ 实盘交易服务未启用")
print(" 请在 .env 中设置:")
print(" REAL_TRADING_ENABLED=true")
return False
# 查询账户状态
print("\n查询账户状态...")
account = service.get_account_status()
print(f"\n✅ 账户状态:")
print(f" 总余额: ${account['current_balance']:,.2f}")
print(f" 可用: ${account['available']:,.2f}")
print(f" 已用: ${account['used_margin']:,.2f}")
print(f" 持仓: ${account['total_position_value']:,.2f}")
# 同步持仓
print("\n同步交易所持仓...")
positions = service.sync_positions_from_exchange()
print(f"\n✅ 交易所持仓: {len(positions)}")
return True
def main():
"""主函数"""
print("\n" + "🚀" * 40)
print("\nBitget 实盘交易功能测试")
print(f"测试时间: {datetime.now()}")
settings = get_settings()
print("\n⚠️ 重要提醒:")
print(f" 当前环境: {'测试网 ✅' if settings.bitget_use_testnet else '生产网 ⚠️'}")
try:
# 1. 测试 API 连接
if not test_api_connection():
print("\n❌ API 连接测试失败,请检查配置")
return
# 2. 测试查询账户
if not test_query_account():
print("\n❌ 查询账户测试失败")
return
# 3. 测试查询持仓
if not test_query_position():
print("\n❌ 查询持仓测试失败")
return
# 4. 测试下单(需要手动取消注释)
# test_place_small_order()
# 5. 测试实盘交易服务
if not test_real_trading_service():
print("\n⚠️ 实盘交易服务未启用(可忽略)")
print("\n" + "=" * 80)
print(" ✅ 所有测试通过!")
print("=" * 80)
print("\n实盘交易功能已就绪!")
except Exception as e:
print(f"\n❌ 测试出错: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
from datetime import datetime
main()