add
This commit is contained in:
147
test/test_mt5_tools.py
Normal file
147
test/test_mt5_tools.py
Normal file
@@ -0,0 +1,147 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
from ccxt.pro import mt5
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger('MT5-Tools')
|
||||
|
||||
|
||||
class MT5OrderAnalyzer:
|
||||
"""MT5 订单分析工具"""
|
||||
|
||||
def __init__(self, exchange):
|
||||
self.exchange = exchange
|
||||
self.order_history = []
|
||||
|
||||
async def analyze_orders(self, symbol=None, days=7):
|
||||
"""分析订单数据"""
|
||||
try:
|
||||
# 获取订单历史
|
||||
orders = await self.exchange.fetch_orders(symbol)
|
||||
|
||||
# 分析订单统计
|
||||
total_orders = len(orders)
|
||||
open_orders = len([o for o in orders if o['status'] == 'open'])
|
||||
closed_orders = len([o for o in orders if o['status'] == 'closed'])
|
||||
canceled_orders = len([o for o in orders if o['status'] == 'canceled'])
|
||||
|
||||
# 分析盈亏
|
||||
profitable_trades = []
|
||||
losing_trades = []
|
||||
|
||||
for order in orders:
|
||||
if order['status'] == 'closed' and order.get('cost'):
|
||||
if order.get('filled', 0) > 0:
|
||||
# 这里需要根据具体订单数据计算盈亏
|
||||
pass
|
||||
|
||||
logger.info(f"📈 订单分析结果:")
|
||||
logger.info(f" 总订单数: {total_orders}")
|
||||
logger.info(f" 开单数: {open_orders}")
|
||||
logger.info(f" 平单数: {closed_orders}")
|
||||
logger.info(f" 取消单数: {canceled_orders}")
|
||||
|
||||
return {
|
||||
'total_orders': total_orders,
|
||||
'open_orders': open_orders,
|
||||
'closed_orders': closed_orders,
|
||||
'canceled_orders': canceled_orders
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"分析订单失败: {e}")
|
||||
return {}
|
||||
|
||||
|
||||
async def quick_order_test():
|
||||
"""快速订单测试"""
|
||||
logger.info("🚀 快速订单测试开始")
|
||||
|
||||
exchange = mt5({
|
||||
'user': 62333850,
|
||||
'password': 'tecimil4',
|
||||
'host': '78.140.180.198',
|
||||
'port': 443,
|
||||
'sandbox': True,
|
||||
})
|
||||
|
||||
try:
|
||||
# 测试连接
|
||||
balance = await exchange.fetch_balance()
|
||||
logger.info(f"✅ 连接成功,余额: {balance['total'].get('USD', 'N/A')}")
|
||||
|
||||
# 获取市场信息
|
||||
markets = await exchange.fetch_markets()
|
||||
logger.info(f"✅ 获取到 {len(markets)} 个交易对")
|
||||
|
||||
# 获取当前价格
|
||||
ticker = await exchange.fetch_ticker('EUR/USD')
|
||||
logger.info(f"✅ EUR/USD 当前价格: 买={ticker['bid']}, 卖={ticker['ask']}")
|
||||
|
||||
# 获取订单簿
|
||||
orderbook = await exchange.fetch_order_book('EUR/USD')
|
||||
logger.info(f"✅ EUR/USD 订单簿深度: {len(orderbook['bids'])} 买单, {len(orderbook['asks'])} 卖单")
|
||||
|
||||
# 获取开单
|
||||
open_orders = await exchange.fetch_open_orders()
|
||||
logger.info(f"✅ 当前开单数量: {len(open_orders)}")
|
||||
|
||||
for order in open_orders:
|
||||
logger.info(f" 订单 {order['id']}: {order['symbol']} {order['side']} {order['type']} {order['status']}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 测试失败: {e}")
|
||||
finally:
|
||||
await exchange.close()
|
||||
|
||||
|
||||
async def websocket_quick_test():
|
||||
"""WebSocket 快速测试"""
|
||||
logger.info("🔌 WebSocket 快速测试开始")
|
||||
|
||||
exchange = mt5({
|
||||
'apiKey': '76888962',
|
||||
'secret': 'LZ-trade666888',
|
||||
'verbose': False, # 启用详细日志
|
||||
'hostname': '43.167.188.220:5000',
|
||||
'options': {
|
||||
# 'server': '147.160.254.81:443', # 使用服务器名称
|
||||
# 或者
|
||||
'host': '18.163.85.196',
|
||||
'port': 443,
|
||||
},
|
||||
})
|
||||
|
||||
try:
|
||||
# 监听订单更新
|
||||
async def order_listener():
|
||||
orders = await exchange.watch_orders()
|
||||
for order in orders:
|
||||
logger.info(f"📦 订单更新: {order['id']} {order['symbol']} {order['side']} {order['status']}")
|
||||
|
||||
# 监听余额更新
|
||||
async def balance_listener():
|
||||
balance = await exchange.watch_balance()
|
||||
total = sum([v for v in balance['total'].values() if v is not None])
|
||||
logger.info(f"💰 余额更新: 总余额 {total:.2f}")
|
||||
|
||||
# 运行监听器
|
||||
await asyncio.gather(
|
||||
order_listener(),
|
||||
balance_listener(),
|
||||
return_exceptions=True
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"WebSocket 测试错误: {e}")
|
||||
finally:
|
||||
await exchange.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 运行快速测试
|
||||
asyncio.run(quick_order_test())
|
||||
Reference in New Issue
Block a user