1
This commit is contained in:
@@ -562,7 +562,7 @@ class mt5(Exchange, ImplicitAPI):
|
|||||||
|
|
||||||
return tickers
|
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:
|
if not hasattr(self, 'token') or not self.token:
|
||||||
await self.get_token()
|
await self.get_token()
|
||||||
@@ -570,37 +570,36 @@ class mt5(Exchange, ImplicitAPI):
|
|||||||
request = {
|
request = {
|
||||||
'id': self.token,
|
'id': self.token,
|
||||||
}
|
}
|
||||||
|
await self.load_markets()
|
||||||
|
|
||||||
|
symbol = self.market_symbols(symbol)
|
||||||
|
# print(symbol)
|
||||||
response = await self.private_get_openedorders(self.extend(request, params))
|
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 自己判断是否为有效持仓
|
# 使用基类的 parse_positions 方法,让 parse_position 自己判断是否为有效持仓
|
||||||
result = self.parse_positions(response, [symbol] if symbol else None, params)
|
result = self.parse_positions(data, symbol)
|
||||||
|
|
||||||
# 过滤掉 None 值(无效持仓)
|
# 过滤掉 None 值(无效持仓)
|
||||||
result = [position for position in result if position is not None]
|
result = [position for position in result if position is not None]
|
||||||
|
|
||||||
# 应用限制
|
|
||||||
if limit is not None:
|
|
||||||
result = result[:limit]
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def parse_position(self, position, market: Market = None):
|
def parse_position(self, position, market: Market = None):
|
||||||
"""解析持仓信息 - 根据真实数据调整"""
|
"""解析持仓信息 - 根据真实数据调整"""
|
||||||
# 获取市场信息
|
id = self.safe_string(position, 'ticket')
|
||||||
market_id = self.safe_string(position, 'symbol')
|
market_id = self.safe_string(position, 'symbol')
|
||||||
|
# 获取市场信息
|
||||||
symbol = self.safe_symbol(market_id, market, '/')
|
symbol = self.safe_symbol(market_id, market, '/')
|
||||||
|
|
||||||
# 检查是否为有效持仓
|
|
||||||
state = self.safe_string(position, 'state')
|
|
||||||
lots = self.safe_number(position, 'lots', 0)
|
lots = self.safe_number(position, 'lots', 0)
|
||||||
close_lots = self.safe_number(position, 'closeLots', 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'))
|
timestamp = self.parse8601(self.safe_string(position, 'openTime'))
|
||||||
open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC')
|
open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC')
|
||||||
|
|||||||
29
ccxt/mt5.py
29
ccxt/mt5.py
@@ -583,7 +583,7 @@ class mt5(Exchange, ImplicitAPI):
|
|||||||
'isInvestor': self.safe_value(response, 'isInvestor', False),
|
'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:
|
if not hasattr(self, 'token') or not self.token:
|
||||||
self.get_token()
|
self.get_token()
|
||||||
@@ -591,37 +591,36 @@ class mt5(Exchange, ImplicitAPI):
|
|||||||
request = {
|
request = {
|
||||||
'id': self.token,
|
'id': self.token,
|
||||||
}
|
}
|
||||||
|
self.load_markets()
|
||||||
|
|
||||||
|
symbol = self.market_symbols(symbol)
|
||||||
|
# print(symbol)
|
||||||
response = self.private_get_openedorders(self.extend(request, params))
|
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 自己判断是否为有效持仓
|
# 使用基类的 parse_positions 方法,让 parse_position 自己判断是否为有效持仓
|
||||||
result = self.parse_positions(response, [symbol] if symbol else None, params)
|
result = self.parse_positions(data, symbol)
|
||||||
|
|
||||||
# 过滤掉 None 值(无效持仓)
|
# 过滤掉 None 值(无效持仓)
|
||||||
result = [position for position in result if position is not None]
|
result = [position for position in result if position is not None]
|
||||||
|
|
||||||
# 应用限制
|
|
||||||
if limit is not None:
|
|
||||||
result = result[:limit]
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def parse_position(self, position, market: Market = None):
|
def parse_position(self, position, market: Market = None):
|
||||||
"""解析持仓信息 - 根据真实数据调整"""
|
"""解析持仓信息 - 根据真实数据调整"""
|
||||||
# 获取市场信息
|
id = self.safe_string(position, 'ticket')
|
||||||
market_id = self.safe_string(position, 'symbol')
|
market_id = self.safe_string(position, 'symbol')
|
||||||
|
# 获取市场信息
|
||||||
symbol = self.safe_symbol(market_id, market, '/')
|
symbol = self.safe_symbol(market_id, market, '/')
|
||||||
|
|
||||||
# 检查是否为有效持仓
|
|
||||||
state = self.safe_string(position, 'state')
|
|
||||||
lots = self.safe_number(position, 'lots', 0)
|
lots = self.safe_number(position, 'lots', 0)
|
||||||
close_lots = self.safe_number(position, 'closeLots', 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'))
|
timestamp = self.parse8601(self.safe_string(position, 'openTime'))
|
||||||
open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC')
|
open_timestamp_utc = self.safe_integer(position, 'openTimestampUTC')
|
||||||
|
|||||||
@@ -62,39 +62,49 @@ async def quick_order_test():
|
|||||||
logger.info("🚀 快速订单测试开始")
|
logger.info("🚀 快速订单测试开始")
|
||||||
|
|
||||||
exchange = mt5({
|
exchange = mt5({
|
||||||
'user': 62333850,
|
'apiKey': '76888962',
|
||||||
'password': 'tecimil4',
|
'secret': 'LZ-trade666888',
|
||||||
'host': '78.140.180.198',
|
'verbose': False, # 启用详细日志
|
||||||
'port': 443,
|
'hostname': '43.133.206.185:5000',
|
||||||
'sandbox': True,
|
'options': {
|
||||||
|
# 'server': '147.160.254.81:443', # 使用服务器名称
|
||||||
|
# 或者
|
||||||
|
'host': '18.163.85.196',
|
||||||
|
'port': 443,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 测试连接
|
# 测试连接
|
||||||
balance = await exchange.fetch_balance()
|
# balance = await exchange.fetch_balance()
|
||||||
logger.info(f"✅ 连接成功,余额: {balance['total'].get('USD', 'N/A')}")
|
# logger.info(f"✅ 连接成功,余额: {balance}")
|
||||||
|
|
||||||
|
positions = await exchange.fetch_positions()
|
||||||
|
logger.info(f"✅ 连接成功,信息: {positions}")
|
||||||
|
|
||||||
# 获取市场信息
|
# 获取市场信息
|
||||||
markets = await exchange.fetch_markets()
|
# markets = await exchange.fetch_markets()
|
||||||
logger.info(f"✅ 获取到 {len(markets)} 个交易对")
|
# logger.info(f"✅ 获取到 {len(markets)} 个交易对")
|
||||||
|
|
||||||
# 获取当前价格
|
# 获取当前价格
|
||||||
ticker = await exchange.fetch_ticker('EUR/USD')
|
# ticker = await exchange.fetch_ticker('EUR/USD')
|
||||||
logger.info(f"✅ EUR/USD 当前价格: 买={ticker['bid']}, 卖={ticker['ask']}")
|
# logger.info(f"✅ EUR/USD 当前价格: 买={ticker['bid']}, 卖={ticker['ask']}")
|
||||||
|
|
||||||
# 获取订单簿
|
# 获取订单簿
|
||||||
orderbook = await exchange.fetch_order_book('EUR/USD')
|
# orderbook = await exchange.fetch_order_book('EUR/USD')
|
||||||
logger.info(f"✅ EUR/USD 订单簿深度: {len(orderbook['bids'])} 买单, {len(orderbook['asks'])} 卖单")
|
# logger.info(f"✅ EUR/USD 订单簿深度: {len(orderbook['bids'])} 买单, {len(orderbook['asks'])} 卖单")
|
||||||
|
|
||||||
# 获取开单
|
# 获取开单
|
||||||
open_orders = await exchange.fetch_open_orders()
|
# open_orders = await exchange.fetch_open_orders()
|
||||||
logger.info(f"✅ 当前开单数量: {len(open_orders)}")
|
# logger.info(f"✅ 当前开单数量: {len(open_orders)}")
|
||||||
|
|
||||||
for order in open_orders:
|
# for order in open_orders:
|
||||||
logger.info(f" 订单 {order['id']}: {order['symbol']} {order['side']} {order['type']} {order['status']}")
|
# logger.info(f" 订单 {order['id']}: {order['symbol']} {order['side']} {order['type']} {order['status']}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"❌ 测试失败: {e}")
|
logger.error(f"❌ 测试失败: {e}")
|
||||||
|
# 抛出异常,终止程序
|
||||||
|
raise e
|
||||||
finally:
|
finally:
|
||||||
await exchange.close()
|
await exchange.close()
|
||||||
|
|
||||||
@@ -107,10 +117,13 @@ async def websocket_quick_test():
|
|||||||
'apiKey': '76888962',
|
'apiKey': '76888962',
|
||||||
'secret': 'LZ-trade666888',
|
'secret': 'LZ-trade666888',
|
||||||
'verbose': False, # 启用详细日志
|
'verbose': False, # 启用详细日志
|
||||||
# 'debug': True, # 启用详细调试信息
|
'hostname': '43.133.206.185:5000',
|
||||||
'hostname': '43.167.188.220:5000',
|
'options': {
|
||||||
'host': '18.163.85.196',
|
# 'server': '147.160.254.81:443', # 使用服务器名称
|
||||||
'port': 443,
|
# 或者
|
||||||
|
'host': '18.163.85.196',
|
||||||
|
'port': 443,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -149,4 +162,5 @@ async def websocket_quick_test():
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# 运行快速测试
|
# 运行快速测试
|
||||||
asyncio.run(websocket_quick_test())
|
asyncio.run(quick_order_test())
|
||||||
|
# asyncio.run(websocket_quick_test())
|
||||||
Reference in New Issue
Block a user