|
@@ -28,8 +28,16 @@ class PositionsCommands(InfoCommandsBase):
|
|
|
await self._reply(update, "📭 No open positions\n\n💡 Use /long or /short to open a position")
|
|
|
return
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+ exchange_positions = self.trading_engine.get_positions() or []
|
|
|
exchange_orders = self.trading_engine.get_orders() or []
|
|
|
+
|
|
|
+
|
|
|
+ exchange_data_by_symbol = {}
|
|
|
+ for ex_pos in exchange_positions:
|
|
|
+ symbol_key = ex_pos.get('coin', '')
|
|
|
+ if symbol_key:
|
|
|
+ exchange_data_by_symbol[symbol_key] = ex_pos
|
|
|
|
|
|
|
|
|
total_position_value = 0.0
|
|
@@ -91,13 +99,21 @@ class PositionsCommands(InfoCommandsBase):
|
|
|
logger.warning(f"Could not parse position_opened_at: {position_opened_at_str} for {symbol}")
|
|
|
duration_str = "Error"
|
|
|
|
|
|
-
|
|
|
+
|
|
|
mark_price = entry_price
|
|
|
- if position_trade.get('mark_price') is not None:
|
|
|
+
|
|
|
+
|
|
|
+ if exchange_data and exchange_data.get('markPrice') is not None:
|
|
|
+ try:
|
|
|
+ mark_price = float(exchange_data['markPrice'])
|
|
|
+ except (ValueError, TypeError):
|
|
|
+ logger.warning(f"Could not convert exchange mark_price for {symbol}")
|
|
|
+
|
|
|
+ elif position_trade.get('mark_price') is not None:
|
|
|
try:
|
|
|
mark_price = float(position_trade['mark_price'])
|
|
|
except (ValueError, TypeError):
|
|
|
- logger.warning(f"Could not convert mark_price for {symbol}")
|
|
|
+ logger.warning(f"Could not convert database mark_price for {symbol}")
|
|
|
|
|
|
|
|
|
unrealized_pnl = 0.0
|
|
@@ -107,13 +123,22 @@ class PositionsCommands(InfoCommandsBase):
|
|
|
except (ValueError, TypeError):
|
|
|
logger.warning(f"Could not convert unrealized_pnl for {symbol}")
|
|
|
|
|
|
-
|
|
|
+
|
|
|
roe_percentage = 0.0
|
|
|
- if position_trade.get('roe_percentage') is not None:
|
|
|
+ exchange_data = exchange_data_by_symbol.get(base_asset)
|
|
|
+ if exchange_data and exchange_data.get('returnOnEquity') is not None:
|
|
|
+ try:
|
|
|
+
|
|
|
+ roe_percentage = float(exchange_data['returnOnEquity']) * 100
|
|
|
+ except (ValueError, TypeError):
|
|
|
+ logger.warning(f"Could not convert exchange ROE for {symbol}")
|
|
|
+
|
|
|
+
|
|
|
+ if roe_percentage == 0.0 and position_trade.get('roe_percentage') is not None:
|
|
|
try:
|
|
|
roe_percentage = float(position_trade['roe_percentage'])
|
|
|
except (ValueError, TypeError):
|
|
|
- logger.warning(f"Could not convert roe_percentage for {symbol}")
|
|
|
+ logger.warning(f"Could not convert database roe_percentage for {symbol}")
|
|
|
|
|
|
|
|
|
individual_position_value = 0.0
|