1
This commit is contained in:
72
ccxt/mt5.py
72
ccxt/mt5.py
@@ -112,6 +112,7 @@ class mt5(Exchange, ImplicitAPI):
|
||||
'OrderSend': 1,
|
||||
'OrderModify': 1,
|
||||
'OrderClose': 1,
|
||||
'SubscribeOhlc': 1, # 添加订阅端点
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -488,11 +489,13 @@ class mt5(Exchange, ImplicitAPI):
|
||||
balance = self.safe_number(response, 'balance', 0.0)
|
||||
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)
|
||||
|
||||
result[currency] = {
|
||||
'free': free_margin,
|
||||
'used': margin,
|
||||
'total': balance,
|
||||
'equity': equity,
|
||||
}
|
||||
|
||||
return self.safe_balance(result)
|
||||
@@ -614,13 +617,14 @@ class mt5(Exchange, ImplicitAPI):
|
||||
'cost': fee_cost,
|
||||
'currency': None,
|
||||
}
|
||||
|
||||
|
||||
return self.safe_order({
|
||||
'id': id,
|
||||
'clientOrderId': None,
|
||||
'datetime': self.iso8601(timestamp),
|
||||
'timestamp': timestamp,
|
||||
'lastTradeTimestamp': last_trade_timestamp,
|
||||
'lastUpdateTimestamp': last_trade_timestamp,
|
||||
'status': status,
|
||||
'symbol': symbol,
|
||||
'type': type,
|
||||
@@ -628,7 +632,9 @@ class mt5(Exchange, ImplicitAPI):
|
||||
'postOnly': None,
|
||||
'side': side,
|
||||
'price': price,
|
||||
'stopPrice': None,
|
||||
'stopLossPrice': self.safe_number(order, 'stopLoss'),
|
||||
'takeProfitPrice': self.safe_number(order, 'takeProfit'),
|
||||
'reduceOnly':None,
|
||||
'triggerPrice': None,
|
||||
'amount': amount,
|
||||
'filled': filled,
|
||||
@@ -678,6 +684,68 @@ class mt5(Exchange, ImplicitAPI):
|
||||
}
|
||||
return self.safe_string(types, type, type)
|
||||
|
||||
def parse_position(self, order_data, market: Market = None):
|
||||
"""从订单数据解析持仓"""
|
||||
# 只有状态为 Filled 的订单才是持仓
|
||||
state = self.safe_string(order_data, 'state')
|
||||
if state != 'Filled':
|
||||
return None
|
||||
|
||||
symbol = self.safe_string(order_data, 'symbol')
|
||||
if symbol and len(symbol) >= 6:
|
||||
base = symbol[:3]
|
||||
quote = symbol[3:]
|
||||
symbol = base + '/' + quote
|
||||
|
||||
timestamp = self.parse8601(self.safe_string(order_data, 'openTime'))
|
||||
open_timestamp_utc = self.safe_integer(order_data, 'openTimestampUTC')
|
||||
if open_timestamp_utc:
|
||||
timestamp = open_timestamp_utc
|
||||
|
||||
# 确定持仓方向
|
||||
order_type = self.safe_string(order_data, 'orderType')
|
||||
side = 'long' if order_type == 'Buy' else 'short'
|
||||
|
||||
# 计算持仓价值
|
||||
contracts = self.safe_number(order_data, 'lots', 0)
|
||||
entry_price = self.safe_number(order_data, 'openPrice', 0)
|
||||
current_price = self.safe_number(order_data, 'closePrice', entry_price)
|
||||
notional = contracts * entry_price if contracts and entry_price else None
|
||||
|
||||
# 计算盈亏百分比
|
||||
percentage = None
|
||||
if entry_price and current_price and entry_price != 0:
|
||||
if side == 'long':
|
||||
percentage = (current_price - entry_price) / entry_price
|
||||
else:
|
||||
percentage = (entry_price - current_price) / entry_price
|
||||
|
||||
return {
|
||||
'id': self.safe_string(order_data, 'ticket'),
|
||||
'symbol': symbol,
|
||||
'timestamp': timestamp,
|
||||
'datetime': self.iso8601(timestamp),
|
||||
'side': side,
|
||||
'contracts': contracts,
|
||||
'contractSize': self.safe_number(order_data, 'contractSize', 1.0),
|
||||
'entryPrice': entry_price,
|
||||
'markPrice': current_price, # 使用当前价格作为标记价格
|
||||
'notional': notional,
|
||||
'leverage': 1, # MT5 可能需要从账户信息获取
|
||||
'unrealizedPnl': self.safe_number(order_data, 'profit', 0),
|
||||
'realizedPnl': 0, # 对于持仓,已实现盈亏为0
|
||||
'liquidationPrice': None, # MT5 可能不提供
|
||||
'marginMode': 'cross',
|
||||
'percentage': percentage,
|
||||
'marginRatio': None,
|
||||
'collateral': None,
|
||||
'initialMargin': None, # 可能需要计算
|
||||
'initialMarginPercentage': None,
|
||||
'maintenanceMargin': None,
|
||||
'maintenanceMarginPercentage': None,
|
||||
'info': order_data,
|
||||
}
|
||||
|
||||
def create_order(self, symbol, type, side, amount, price=None, params={}):
|
||||
"""创建订单"""
|
||||
self.load_token()
|
||||
|
||||
Reference in New Issue
Block a user