|
@@ -56,9 +56,21 @@ class RiskCommands(InfoCommandsBase):
|
|
|
|
|
|
lines = ["<b>Open Positions:</b>"]
|
|
|
for p in positions:
|
|
|
- position_info = p.get('position', p) # Handle both old and new structures for safety
|
|
|
- pnl_emoji = "🟢" if float(p.get('unrealizedPnl', 0.0)) >= 0 else "🔴"
|
|
|
- lines.append(f"• {position_info['coin']}: {position_info['szi']} {position_info['side']} @ ${position_info['entryPx']} {pnl_emoji}")
|
|
|
+ try:
|
|
|
+ position_info = p.get('position', p)
|
|
|
+ pnl = float(p.get('unrealizedPnl', 0.0))
|
|
|
+ pnl_emoji = "🟢" if pnl >= 0 else "🔴"
|
|
|
+
|
|
|
+ # Use .get() with defaults to avoid KeyErrors
|
|
|
+ asset = position_info.get('asset', 'N/A')
|
|
|
+ size = position_info.get('szi', 'N/A')
|
|
|
+ side = position_info.get('side', 'N/A')
|
|
|
+ entry_price = position_info.get('entryPx', 'N/A')
|
|
|
+
|
|
|
+ lines.append(f"• {asset}: {size} {side} @ ${entry_price} {pnl_emoji}")
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f"Error formatting a position: {p}, error: {e}")
|
|
|
+ lines.append("• Error displaying one position.")
|
|
|
return "\n".join(lines) + "\n"
|
|
|
|
|
|
async def _format_portfolio_summary(self, balance_data, positions):
|