This commit is contained in:
lz_db
2025-11-17 19:36:28 +08:00
parent 42a0391eeb
commit da459da0f3
4 changed files with 324 additions and 188 deletions

View File

@@ -1,8 +1,5 @@
# -*- coding: utf-8 -*-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
from ccxt.async_support.base.exchange import Exchange
from ccxt.abstract.mt5 import ImplicitAPI
import asyncio
@@ -57,8 +54,7 @@ class mt5(Exchange, ImplicitAPI):
'fetchOrder': True,
'fetchOrderBook': True,
'fetchTicker': True,
'fetchTickers': True, # 添加这个字段
'fetchTickers': True,
'fetchTickers': True,
},
'timeframes': {
'1m': 1,
@@ -166,6 +162,19 @@ class mt5(Exchange, ImplicitAPI):
}
return await self.private_get_checkconnect(request)
async def disconnect(self):
"""断开连接"""
if hasattr(self, 'token') and self.token:
request = {
'id': self.token,
}
try:
await self.private_get_disconnect(request)
except Exception:
pass
finally:
self.token = None
async def fetch_markets(self, params={}):
"""获取交易对列表 - 异步修复版本"""
if not hasattr(self, 'token') or not self.token:
@@ -225,7 +234,12 @@ class mt5(Exchange, ImplicitAPI):
# 确保符号格式正确 (如 EURUSD)
if len(symbol) < 6:
return None
# 处理较短的符号
base = symbol
quote = 'USD' # 默认报价货币
else:
base = symbol[:3]
quote = symbol[3:]
base = symbol[:3]
quote = symbol[3:]
@@ -278,6 +292,21 @@ class mt5(Exchange, ImplicitAPI):
print(f"解析市场信息失败: {e}, info: {info}")
return None
async def server_timezone(self):
"""获得mt5服务器时区"""
if hasattr(self, 'timezone'):
return self.timezone
else:
if not hasattr(self, 'token') or not self.token:
await self.get_token()
request = {
'id': self.token,
}
response = await self.private_get_servertimezone(request)
self.timezone = int(float(response))
return self.timezone
async def fetch_balance(self, params={}):
"""获取账户余额"""
if not hasattr(self, 'token') or not self.token:
@@ -302,16 +331,49 @@ class mt5(Exchange, ImplicitAPI):
margin = self.safe_number(response, 'margin', 0.0)
free_margin = self.safe_number(response, 'freeMargin', 0.0)
equity = self.safe_number(response, 'equity', 0.0)
profit = self.safe_number(response, 'profit', 0.0)
result[currency] = {
'free': free_margin,
'used': margin,
'total': balance,
'equity': equity,
'profit': profit,
}
return self.safe_balance(result)
async def fetch_account_details(self, params={}):
"""获取账户信息"""
if not hasattr(self, 'token') or not self.token:
await self.get_token()
request = {
'id': self.token,
}
response = await self.private_get_accountdetails(self.extend(request, params))
return self.parse_account(response)
def parse_account(self, response):
"""解析账户信息"""
return {
'serverName': self.safe_string(response, 'serverName'),
'user': self.safe_string(response, 'user'),
'host': self.safe_string(response, 'host'),
'port': self.safe_integer(response, 'port'),
'serverTime': self.safe_string(response, 'serverTime'),
'serverTimeZone': self.safe_integer(response, 'serverTimeZone'),
'company': self.safe_string(response, 'company'),
'currency': self.safe_string(response, 'currency', 'UST'),
'accountName': self.safe_string(response, 'accountName'),
'group': self.safe_string(response, 'group'),
'accountType': self.safe_string(response, 'accountType'),
'accountLeverage': self.safe_integer(response, 'accountLeverage'),
'accountMethod': self.safe_string(response, 'accountMethod'),
'isInvestor': self.safe_value(response, 'isInvestor', False),
}
async def fetch_ticker(self, symbol, params={}):
"""获取行情数据"""
await self.load_markets()
@@ -531,6 +593,9 @@ class mt5(Exchange, ImplicitAPI):
'cost': fee_cost,
'currency': None,
}
# 确保所有必需字段都有值
if timestamp is None:
timestamp = self.milliseconds()
return self.safe_order({
'id': id,
@@ -556,13 +621,21 @@ class mt5(Exchange, ImplicitAPI):
'cost': cost,
'trades': None,
'fee': fee,
# 'info': order,
'info': order,
'average': None,
})
except Exception as e:
if self.verbose:
print(f"解析订单失败: {e}, order: {order}")
raise e
return self.safe_order({
'id': self.safe_string(order, 'ticket'),
'symbol': symbol,
'status': 'unknown',
'side': 'unknown',
'type': 'unknown',
'timestamp': self.milliseconds(),
'info': order,
})
def parse_order_status(self, status):
statuses = {
@@ -739,14 +812,15 @@ class mt5(Exchange, ImplicitAPI):
import aiohttp
try:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
async with session.get(url, timeout=aiohttp.ClientTimeout(total=30)) as response:
if response.status == 200:
content = await response.text()
# 直接返回内容,让 parse_json 处理
return self.parse_json(content)
else:
error_text = await response.text()
raise ExchangeError(f"HTTP {response.status}: {error_text}")
except asyncio.TimeoutError:
raise ExchangeError("请求超时")
except Exception as e:
raise ExchangeError(f"请求失败: {e}")