orders.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import logging
  2. from typing import Dict, Any, List, Optional
  3. from telegram import Update
  4. from telegram.ext import ContextTypes
  5. from .base import InfoCommandsBase
  6. logger = logging.getLogger(__name__)
  7. class OrdersCommands(InfoCommandsBase):
  8. """Handles all order-related commands."""
  9. async def orders_command(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
  10. """Handle the /orders command."""
  11. try:
  12. if not self._is_authorized(update):
  13. await self._reply(update, "❌ Unauthorized access.")
  14. return
  15. # Get open orders
  16. open_orders = self.trading_engine.get_orders()
  17. if not open_orders:
  18. await self._reply(update, "📭 No open orders")
  19. return
  20. # Format orders text
  21. orders_text = "📋 <b>Open Orders</b>\n\n"
  22. for order in open_orders:
  23. try:
  24. symbol = order.get('symbol', 'unknown')
  25. base_asset = symbol.split('/')[0] if '/' in symbol else symbol.split(':')[0]
  26. order_type = order.get('type', 'unknown').upper()
  27. side = order.get('side', 'unknown').upper()
  28. price = float(order.get('price', 0))
  29. amount = float(order.get('amount', 0))
  30. filled = float(order.get('filled', 0))
  31. remaining = amount - filled
  32. status = order.get('status', 'unknown').upper()
  33. # Skip fully filled orders
  34. if remaining <= 0:
  35. continue
  36. # Format order details
  37. formatter = self._get_formatter()
  38. price_str = await formatter.format_price_with_symbol(price, base_asset)
  39. amount_str = await formatter.format_amount(remaining, base_asset)
  40. # Order header
  41. side_emoji = "🟢" if side == "BUY" else "🔴"
  42. orders_text += f"{side_emoji} <b>{base_asset} {side} {order_type}</b>\n"
  43. orders_text += f" 📏 Amount: {amount_str} {base_asset}\n"
  44. orders_text += f" 💰 Price: {price_str}\n"
  45. # Add order type specific info
  46. if order_type == "STOP_LOSS" or order_type == "TAKE_PROFIT":
  47. trigger_price = order.get('info', {}).get('triggerPrice')
  48. if trigger_price:
  49. trigger_price_str = await formatter.format_price_with_symbol(float(trigger_price), base_asset)
  50. orders_text += f" 🎯 Trigger: {trigger_price_str}\n"
  51. # Add order ID
  52. order_id = order.get('id', 'unknown')
  53. orders_text += f" 🆔 Order ID: {order_id[:8]}\n\n"
  54. except Exception as e:
  55. logger.error(f"Error processing order {order.get('symbol', 'unknown')}: {e}")
  56. continue
  57. await self._reply(update, orders_text.strip())
  58. except Exception as e:
  59. logger.error(f"Error in orders command: {e}")
  60. await self._reply(update, "❌ Error retrieving order information.")