From 502a0c49f27517fa94d24821dc1cd72e81cb669b Mon Sep 17 00:00:00 2001 From: lz_db Date: Sun, 30 Nov 2025 19:29:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E6=97=B6=E9=97=B4=E5=B7=AE?= =?UTF-8?q?=EF=BC=8C=E7=BB=9F=E4=B8=80UTC=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ccxt/async_support/mt5.py | 23 ++++++++++++++++------- ccxt/mt5.py | 15 ++++++++++----- ccxt/pro/mt5.py | 12 +++++++----- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/ccxt/async_support/mt5.py b/ccxt/async_support/mt5.py index f2ed909..a6f5432 100644 --- a/ccxt/async_support/mt5.py +++ b/ccxt/async_support/mt5.py @@ -156,6 +156,10 @@ class mt5(Exchange, ImplicitAPI): response = await self.private_get_connect(request) self.token = response + self.diff_milliseconds = 0 # 重置时间差 + + # 获取服务器时区 + await self.server_timezone() return self.token async def check_connect(self): @@ -367,6 +371,7 @@ class mt5(Exchange, ImplicitAPI): } response = await self.private_get_servertimezone(request) self.timezone = int(float(response)) + self.diff_milliseconds = self.timezone * 3600 * 1000 return self.timezone async def fetch_balance(self, params={}): @@ -567,7 +572,7 @@ class mt5(Exchange, ImplicitAPI): """异步获取持仓信息""" if not hasattr(self, 'token') or not self.token: await self.get_token() - + await self.server_timezone() request = { 'id': self.token, } @@ -602,8 +607,8 @@ class mt5(Exchange, ImplicitAPI): close_lots = self.safe_number(position, 'closeLots', 0) # 解析时间戳 - timestamp = self.parse8601(self.safe_string(position, 'openTime')) - open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC') + timestamp = self.parse8601(self.safe_string(position, 'openTime')) - self.diff_milliseconds + open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC') - self.diff_milliseconds if open_timestamp_utc: timestamp = open_timestamp_utc @@ -692,10 +697,12 @@ class mt5(Exchange, ImplicitAPI): """异步获取未平仓订单 - 修复版本""" if not hasattr(self, 'token') or not self.token: await self.get_token() - + request = { 'id': self.token, } + + await self.server_timezone() response = await self.private_get_openedorders(self.extend(request, params)) @@ -714,7 +721,9 @@ class mt5(Exchange, ImplicitAPI): """异步获取已平仓订单 - 修复版本""" if not hasattr(self, 'token') or not self.token: await self.get_token() - + + await self.server_timezone() + if params.get('from') is None or params.get('to') is None: yesterday = datetime.now() - timedelta(days=3) params['from'] = yesterday.strftime('%Y-%m-%d') + 'T00:00:00' @@ -764,8 +773,8 @@ class mt5(Exchange, ImplicitAPI): # 如果无法解析,使用原始 market_id symbol = market_id - timestamp = self.parse8601(self.safe_string(order, 'openTime')) - last_trade_timestamp = self.parse8601(self.safe_string(order, 'closeTime')) + timestamp = self.parse8601(self.safe_string(order, 'openTime')) - self.diff_milliseconds + last_trade_timestamp = self.parse8601(self.safe_string(order, 'closeTime')) - self.diff_milliseconds if last_trade_timestamp is None: last_trade_timestamp = timestamp diff --git a/ccxt/mt5.py b/ccxt/mt5.py index 5c53f2f..9df2124 100644 --- a/ccxt/mt5.py +++ b/ccxt/mt5.py @@ -170,6 +170,8 @@ class mt5(Exchange, ImplicitAPI): response = self.private_get_connect(params) self.token = response + self.diff_milliseconds = 0 # 服务器时区差异,默认设置为 0 + self.server_timezone() return self.token def check_connect(self): @@ -208,6 +210,7 @@ class mt5(Exchange, ImplicitAPI): } response = self.private_get_servertimezone(request) self.timezone = int(float(response)) + self.diff_milliseconds = self.timezone * 3600 * 1000 return self.timezone def fetch_markets(self, params={}): @@ -588,7 +591,7 @@ class mt5(Exchange, ImplicitAPI): """异步获取持仓信息""" if not hasattr(self, 'token') or not self.token: self.get_token() - + self.server_timezone() request = { 'id': self.token, } @@ -623,8 +626,8 @@ class mt5(Exchange, ImplicitAPI): close_lots = self.safe_number(position, 'closeLots', 0) # 解析时间戳 - timestamp = self.parse8601(self.safe_string(position, 'openTime')) - open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC') + timestamp = self.parse8601(self.safe_string(position, 'openTime')) - self.diff_milliseconds + open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC') - self.diff_milliseconds if open_timestamp_utc: timestamp = open_timestamp_utc @@ -715,6 +718,7 @@ class mt5(Exchange, ImplicitAPI): def fetch_open_orders(self, symbol=None, since=None, limit=None, params={}): """获取未平仓订单""" self.load_token() + self.server_timezone() request = { 'id': self.token, } @@ -734,6 +738,7 @@ class mt5(Exchange, ImplicitAPI): def fetch_closed_orders(self, symbol=None, since=None, limit=None, params={}): """获取已平仓订单""" self.load_token() + self.server_timezone() if params.get('from') is None or params.get('to') is None: yesterday = datetime.now() - timedelta(days=3) params['from'] = yesterday.strftime('%Y-%m-%d') + 'T00:00:00' @@ -777,8 +782,8 @@ class mt5(Exchange, ImplicitAPI): else: symbol = market_id - timestamp = self.parse8601(self.safe_string(order, 'openTime')) - last_trade_timestamp = self.parse8601(self.safe_string(order, 'closeTime')) + timestamp = self.parse8601(self.safe_string(order, 'openTime')) - self.diff_milliseconds + last_trade_timestamp = self.parse8601(self.safe_string(order, 'closeTime')) - self.diff_milliseconds status = self.parse_order_status(self.safe_string(order, 'state')) side = self.parse_order_side(self.safe_string(order, 'orderType')) diff --git a/ccxt/pro/mt5.py b/ccxt/pro/mt5.py index 2f4d8cc..385cf7c 100644 --- a/ccxt/pro/mt5.py +++ b/ccxt/pro/mt5.py @@ -67,6 +67,7 @@ class mt5(mt5Parent): """监听订单变化""" if not hasattr(self, 'token') or not self.token: await self.get_token() + await self.server_timezone() ws_url = self.implode_hostname(self.urls['api']['ws']) url = ws_url + '/OnOrderUpdate?id=' + self.token message_hash = 'orders' @@ -92,6 +93,7 @@ class mt5(mt5Parent): """监听持仓变化""" if not hasattr(self, 'token') or not self.token: await self.get_token() + await self.server_timezone() ws_url = self.implode_hostname(self.urls['api']['ws']) url = ws_url + '/OnOrderUpdate?id=' + self.token message_hash = 'positions' @@ -365,7 +367,7 @@ class mt5(mt5Parent): """处理 OrderUpdate 类型消息(包含订单、持仓、余额)""" try: data = self.safe_value(message, 'data', {}) - timestamp = self.safe_integer(message, 'timestampUTC') + timestamp = self.safe_integer(message, 'timestampUTC') - self.diff_milliseconds # 1. 解析余额信息 balance_data = self.parse_ws_balance_from_data(data) @@ -427,7 +429,7 @@ class mt5(mt5Parent): """处理 OpenedOrders 类型消息(只包含持仓)""" try: data = self.safe_value(message, 'data', []) - timestamp = self.safe_integer(message, 'timestampUTC') + timestamp = self.safe_integer(message, 'timestampUTC') - self.diff_milliseconds # 解析持仓信息 positions = self.parse_ws_positions_from_orders(data) @@ -618,13 +620,13 @@ class mt5(mt5Parent): close_time = self.safe_string(order_data, 'closeTime') is_closed = close_time and close_time != "0001-01-01T00:00:00" - timestamp = self.parse8601(self.safe_string(order_data, 'openTime')) + timestamp = self.parse8601(self.safe_string(order_data, 'openTime')) - self.diff_milliseconds if timestamp is None: timestamp = self.milliseconds() last_trade_timestamp = timestamp if is_closed: - last_trade_timestamp = self.parse8601(close_time) + last_trade_timestamp = self.parse8601(close_time) - - self.diff_milliseconds mt5_order_type = self.safe_string(order_data, 'update_type', None) @@ -715,7 +717,7 @@ class mt5(mt5Parent): quote = symbol[3:] symbol = base + '/' + quote - timestamp = self.parse8601(self.safe_string(order_data, 'openTime')) + timestamp = self.parse8601(self.safe_string(order_data, 'openTime')) - self.diff_milliseconds contracts = self.safe_number(order_data, 'lots') entry_price = self.safe_number(order_data, 'openPrice')