1
This commit is contained in:
@@ -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}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user