1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import logging
- from typing import Dict, Any, List, Optional
- from telegram import Update
- from telegram.ext import ContextTypes
- from .base import InfoCommandsBase
- logger = logging.getLogger(__name__)
- class OrdersCommands(InfoCommandsBase):
- """Handles all order-related commands."""
- async def orders_command(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
- """Handle the /orders command."""
- try:
- if not self._is_authorized(update):
- await self._reply(update, "❌ Unauthorized access.")
- return
- # Get open orders
- open_orders = self.trading_engine.get_orders()
- if not open_orders:
- await self._reply(update, "📭 No open orders")
- return
- # Format orders text
- orders_text = "📋 <b>Open Orders</b>\n\n"
- for order in open_orders:
- try:
- symbol = order.get('symbol', 'unknown')
- base_asset = symbol.split('/')[0] if '/' in symbol else symbol.split(':')[0]
- order_type = order.get('type', 'unknown').upper()
- side = order.get('side', 'unknown').upper()
- price = float(order.get('price', 0))
- amount = float(order.get('amount', 0))
- filled = float(order.get('filled', 0))
- remaining = amount - filled
- status = order.get('status', 'unknown').upper()
- # Skip fully filled orders
- if remaining <= 0:
- continue
- # Format order details
- formatter = self._get_formatter()
- price_str = await formatter.format_price_with_symbol(price, base_asset)
- amount_str = await formatter.format_amount(remaining, base_asset)
- # Order header
- side_emoji = "🟢" if side == "BUY" else "🔴"
- orders_text += f"{side_emoji} <b>{base_asset} {side} {order_type}</b>\n"
- orders_text += f" 📏 Amount: {amount_str} {base_asset}\n"
- orders_text += f" 💰 Price: {price_str}\n"
- # Add order type specific info
- if order_type == "STOP_LOSS" or order_type == "TAKE_PROFIT":
- trigger_price = order.get('info', {}).get('triggerPrice')
- if trigger_price:
- trigger_price_str = await formatter.format_price_with_symbol(float(trigger_price), base_asset)
- orders_text += f" 🎯 Trigger: {trigger_price_str}\n"
- # Add order ID
- order_id = order.get('id', 'unknown')
- orders_text += f" 🆔 Order ID: {order_id[:8]}\n\n"
- except Exception as e:
- logger.error(f"Error processing order {order.get('symbol', 'unknown')}: {e}")
- continue
- await self._reply(update, orders_text.strip())
- except Exception as e:
- logger.error(f"Error in orders command: {e}")
- await self._reply(update, "❌ Error retrieving order information.")
|