diff --git a/ccxt/async_support/mt5.py b/ccxt/async_support/mt5.py index 578c708..c1c5116 100644 --- a/ccxt/async_support/mt5.py +++ b/ccxt/async_support/mt5.py @@ -562,7 +562,7 @@ class mt5(Exchange, ImplicitAPI): return tickers - async def fetch_positions(self, symbol=None, since=None, limit=None, params={}): + async def fetch_positions(self, symbol: Strings = None, params={}): """异步获取持仓信息""" if not hasattr(self, 'token') or not self.token: await self.get_token() @@ -570,37 +570,36 @@ class mt5(Exchange, ImplicitAPI): request = { 'id': self.token, } + await self.load_markets() + symbol = self.market_symbols(symbol) + # print(symbol) response = await self.private_get_openedorders(self.extend(request, params)) - + data = [] + for item in response: + state = self.safe_string(item, 'state', "") + lots = self.safe_number(item, 'lots', 0) + close_lots = self.safe_number(item, 'closeLots', 0) + if state == "Filled" or lots <= close_lots: + data.append(item) # 使用基类的 parse_positions 方法,让 parse_position 自己判断是否为有效持仓 - result = self.parse_positions(response, [symbol] if symbol else None, params) + result = self.parse_positions(data, symbol) # 过滤掉 None 值(无效持仓) result = [position for position in result if position is not None] - # 应用限制 - if limit is not None: - result = result[:limit] - return result def parse_position(self, position, market: Market = None): """解析持仓信息 - 根据真实数据调整""" - # 获取市场信息 + id = self.safe_string(position, 'ticket') market_id = self.safe_string(position, 'symbol') + # 获取市场信息 symbol = self.safe_symbol(market_id, market, '/') - # 检查是否为有效持仓 - state = self.safe_string(position, 'state') lots = self.safe_number(position, 'lots', 0) close_lots = self.safe_number(position, 'closeLots', 0) - # 只有状态为已成交且有未平仓数量的才是有效持仓 - # 根据你的业务逻辑调整这个判断条件 - if state != 'Filled' or lots <= close_lots: - return None - # 解析时间戳 timestamp = self.parse8601(self.safe_string(position, 'openTime')) open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC') diff --git a/ccxt/mt5.py b/ccxt/mt5.py index dcef454..661c273 100644 --- a/ccxt/mt5.py +++ b/ccxt/mt5.py @@ -583,7 +583,7 @@ class mt5(Exchange, ImplicitAPI): 'isInvestor': self.safe_value(response, 'isInvestor', False), } - def fetch_positions(self, symbol=None, since=None, limit=None, params={}): + def fetch_positions(self, symbol: Strings = None, params={}): """异步获取持仓信息""" if not hasattr(self, 'token') or not self.token: self.get_token() @@ -591,37 +591,36 @@ class mt5(Exchange, ImplicitAPI): request = { 'id': self.token, } + self.load_markets() + symbol = self.market_symbols(symbol) + # print(symbol) response = self.private_get_openedorders(self.extend(request, params)) - + data = [] + for item in response: + state = self.safe_string(item, 'state', "") + lots = self.safe_number(item, 'lots', 0) + close_lots = self.safe_number(item, 'closeLots', 0) + if state == "Filled" or lots <= close_lots: + data.append(item) # 使用基类的 parse_positions 方法,让 parse_position 自己判断是否为有效持仓 - result = self.parse_positions(response, [symbol] if symbol else None, params) + result = self.parse_positions(data, symbol) # 过滤掉 None 值(无效持仓) result = [position for position in result if position is not None] - # 应用限制 - if limit is not None: - result = result[:limit] - return result def parse_position(self, position, market: Market = None): """解析持仓信息 - 根据真实数据调整""" - # 获取市场信息 + id = self.safe_string(position, 'ticket') market_id = self.safe_string(position, 'symbol') + # 获取市场信息 symbol = self.safe_symbol(market_id, market, '/') - # 检查是否为有效持仓 - state = self.safe_string(position, 'state') lots = self.safe_number(position, 'lots', 0) close_lots = self.safe_number(position, 'closeLots', 0) - # 只有状态为已成交且有未平仓数量的才是有效持仓 - # 根据你的业务逻辑调整这个判断条件 - if state != 'Filled' or lots <= close_lots: - return None - # 解析时间戳 timestamp = self.parse8601(self.safe_string(position, 'openTime')) open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC') diff --git a/test/test_mt5_tools.py b/test/test_mt5_tools.py index 3085c09..b531a9b 100644 --- a/test/test_mt5_tools.py +++ b/test/test_mt5_tools.py @@ -62,39 +62,49 @@ async def quick_order_test(): logger.info("🚀 快速订单测试开始") exchange = mt5({ - 'user': 62333850, - 'password': 'tecimil4', - 'host': '78.140.180.198', - 'port': 443, - 'sandbox': True, + 'apiKey': '76888962', + 'secret': 'LZ-trade666888', + 'verbose': False, # 启用详细日志 + 'hostname': '43.133.206.185:5000', + 'options': { + # 'server': '147.160.254.81:443', # 使用服务器名称 + # 或者 + 'host': '18.163.85.196', + 'port': 443, + }, }) try: # 测试连接 - balance = await exchange.fetch_balance() - logger.info(f"✅ 连接成功,余额: {balance['total'].get('USD', 'N/A')}") + # balance = await exchange.fetch_balance() + # logger.info(f"✅ 连接成功,余额: {balance}") + + positions = await exchange.fetch_positions() + logger.info(f"✅ 连接成功,信息: {positions}") # 获取市场信息 - markets = await exchange.fetch_markets() - logger.info(f"✅ 获取到 {len(markets)} 个交易对") + # 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']}") + # 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'])} 卖单") + # 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)}") + # 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']}") + # 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}") + # 抛出异常,终止程序 + raise e finally: await exchange.close() @@ -107,10 +117,13 @@ async def websocket_quick_test(): 'apiKey': '76888962', 'secret': 'LZ-trade666888', 'verbose': False, # 启用详细日志 - # 'debug': True, # 启用详细调试信息 - 'hostname': '43.167.188.220:5000', - 'host': '18.163.85.196', - 'port': 443, + 'hostname': '43.133.206.185:5000', + 'options': { + # 'server': '147.160.254.81:443', # 使用服务器名称 + # 或者 + 'host': '18.163.85.196', + 'port': 443, + }, }) try: @@ -149,4 +162,5 @@ async def websocket_quick_test(): if __name__ == "__main__": # 运行快速测试 - asyncio.run(websocket_quick_test()) \ No newline at end of file + asyncio.run(quick_order_test()) + # asyncio.run(websocket_quick_test()) \ No newline at end of file