Просмотр исходного кода

Refactor order status update logic in TradingEngine and TradingStats - Updated the method for updating order statuses to include a new parameter for setting the exchange order ID directly. Improved logging to provide clearer feedback on order updates, enhancing overall traceability and debugging capabilities.

Carles Sentis 3 дней назад
Родитель
Сommit
c31e47261d
3 измененных файлов с 32 добавлено и 38 удалено
  1. 7 23
      src/commands/info_commands.py
  2. 6 12
      src/trading/trading_engine.py
  3. 19 3
      src/trading/trading_stats.py

+ 7 - 23
src/commands/info_commands.py

@@ -227,33 +227,17 @@ class InfoCommands:
                                 bot_ref_id = order_in_db.get('bot_order_ref_id')
                                 if bot_ref_id:
                                     # Look for pending stop losses with this order as parent
-                                    # First, get all pending stop losses to debug
-                                    all_pending_sls = stats.get_orders_by_status('pending_trigger')
-                                    logger.info(f"DEBUG: Found {len(all_pending_sls)} total pending trigger orders")
+                                    pending_sls = stats.get_orders_by_status(
+                                        status='pending_trigger', 
+                                        order_type_filter='stop_limit_trigger',
+                                        parent_bot_order_ref_id=bot_ref_id
+                                    )
                                     
-                                    # Filter for stop_limit_trigger type and matching parent
-                                    matching_sls = []
-                                    for sl in all_pending_sls:
-                                        sl_type = sl.get('type', '').upper()
-                                        sl_parent = sl.get('parent_bot_order_ref_id', '')
-                                        
-                                        logger.info(f"DEBUG: Checking SL - Type: '{sl_type}', Parent: '{sl_parent}', Looking for: '{bot_ref_id}'")
-                                        
-                                        if (sl_type == 'STOP_LIMIT_TRIGGER' and 
-                                            sl_parent == bot_ref_id):
-                                            matching_sls.append(sl)
-                                            logger.info(f"DEBUG: Found matching SL - Price: {sl.get('price')}, Side: {sl.get('side')}")
-                                    
-                                    if matching_sls:
-                                        sl_order = matching_sls[0]  # Should only be one
+                                    if pending_sls:
+                                        sl_order = pending_sls[0]  # Should only be one
                                         sl_price = sl_order.get('price', 0)
                                         sl_side = sl_order.get('side', '').upper()
                                         orders_text += f"   🛑 Pending SL: {sl_side} @ {formatter.format_price_with_symbol(sl_price, symbol)} (activates when filled)\n"
-                                        logger.info(f"DEBUG: Added SL display text for order {order_id}")
-                                    else:
-                                        logger.info(f"DEBUG: No matching SL found for order {order_id} with bot_ref {bot_ref_id}")
-                            else:
-                                logger.info(f"DEBUG: Order {order_id} not found in database")
                         
                         orders_text += "\n"
                 

+ 6 - 12
src/trading/trading_engine.py

@@ -182,9 +182,8 @@ class TradingEngine:
                 
                 self.stats.update_order_status(
                     order_db_id=order_db_id, 
-                    exchange_order_id=exchange_oid, 
                     new_status=new_status_after_placement,
-                    bot_order_ref_id=bot_order_ref_id
+                    set_exchange_order_id=exchange_oid
                 )
             else:
                 logger.warning(f"No exchange_order_id received for order {order_db_id} ({bot_order_ref_id}). Status remains pending_submission or requires manual check.")
@@ -307,9 +306,8 @@ class TradingEngine:
                 
                 self.stats.update_order_status(
                     order_db_id=order_db_id, 
-                    exchange_order_id=exchange_oid, 
                     new_status=new_status_after_placement,
-                    bot_order_ref_id=bot_order_ref_id
+                    set_exchange_order_id=exchange_oid
                 )
             else:
                 logger.warning(f"No exchange_order_id received for order {order_db_id} ({bot_order_ref_id}).")
@@ -401,9 +399,8 @@ class TradingEngine:
                 # Market orders are submitted; MarketMonitor will confirm fills.
                 self.stats.update_order_status(
                     order_db_id=order_db_id, 
-                    exchange_order_id=exchange_oid, 
                     new_status='submitted',
-                    bot_order_ref_id=bot_order_ref_id
+                    set_exchange_order_id=exchange_oid
                 )
             else:
                 logger.warning(f"No exchange_order_id received for exit order {order_db_id} ({bot_order_ref_id}).")
@@ -495,9 +492,8 @@ class TradingEngine:
             if exchange_oid:
                 self.stats.update_order_status(
                     order_db_id=order_db_id, 
-                    exchange_order_id=exchange_oid, 
                     new_status='open', # SL/TP limit orders are 'open' until triggered/filled
-                    bot_order_ref_id=bot_order_ref_id
+                    set_exchange_order_id=exchange_oid
                 )
             else:
                 logger.warning(f"No exchange_order_id received for SL order {order_db_id} ({bot_order_ref_id}).")
@@ -572,9 +568,8 @@ class TradingEngine:
             if exchange_oid:
                 self.stats.update_order_status(
                     order_db_id=order_db_id, 
-                    exchange_order_id=exchange_oid, 
                     new_status='open', # SL/TP limit orders are 'open' until triggered/filled
-                    bot_order_ref_id=bot_order_ref_id
+                    set_exchange_order_id=exchange_oid
                 )
             else:
                 logger.warning(f"No exchange_order_id received for TP order {order_db_id} ({bot_order_ref_id}).")
@@ -844,9 +839,8 @@ class TradingEngine:
             new_status = 'submitted' if use_market_order else 'open'
             self.stats.update_order_status(
                 order_db_id=actual_sl_order_db_id, 
-                exchange_order_id=exchange_oid, 
                 new_status=new_status,
-                bot_order_ref_id=actual_sl_bot_order_ref_id
+                set_exchange_order_id=exchange_oid
             )
         else:
             order_type_desc = "market" if use_market_order else "limit"

+ 19 - 3
src/trading/trading_stats.py

@@ -1112,8 +1112,17 @@ class TradingStats:
             return None
 
     def update_order_status(self, order_db_id: Optional[int] = None, bot_order_ref_id: Optional[str] = None, exchange_order_id: Optional[str] = None,
-                            new_status: Optional[str] = None, amount_filled_increment: Optional[float] = None) -> bool:
-        """Update an existing order's status and/or amount_filled. Identify order by order_db_id, bot_order_ref_id, or exchange_order_id."""
+                            new_status: Optional[str] = None, amount_filled_increment: Optional[float] = None, set_exchange_order_id: Optional[str] = None) -> bool:
+        """Update an existing order's status and/or amount_filled. Identify order by order_db_id, bot_order_ref_id, or exchange_order_id.
+        
+        Args:
+            order_db_id: Database ID to identify the order
+            bot_order_ref_id: Bot's internal reference ID to identify the order
+            exchange_order_id: Exchange's order ID to identify the order
+            new_status: New status to set
+            amount_filled_increment: Amount to add to current filled amount
+            set_exchange_order_id: If provided, sets/updates the exchange_order_id field in the database
+        """
         if not any([order_db_id, bot_order_ref_id, exchange_order_id]):
             logger.error("Must provide one of order_db_id, bot_order_ref_id, or exchange_order_id to update order.")
             return False
@@ -1126,6 +1135,10 @@ class TradingStats:
             set_clauses.append("status = ?")
             params.append(new_status.lower())
         
+        if set_exchange_order_id is not None:
+            set_clauses.append("exchange_order_id = ?")
+            params.append(set_exchange_order_id)
+        
         current_amount_filled = 0.0
         identifier_clause = ""
         identifier_param = None
@@ -1168,7 +1181,10 @@ class TradingStats:
         
         try:
             self._execute_query(query, params)
-            logger.info(f"Updated order ({identifier_clause}={identifier_param}): Status to '{new_status or 'N/A'}', Filled increment {amount_filled_increment or 0.0}")
+            log_msg = f"Updated order ({identifier_clause}={identifier_param}): Status to '{new_status or 'N/A'}', Filled increment {amount_filled_increment or 0.0}"
+            if set_exchange_order_id is not None:
+                log_msg += f", Exchange ID set to '{set_exchange_order_id}'"
+            logger.info(log_msg)
             return True
         except Exception as e:
             logger.error(f"Failed to update order ({identifier_clause}={identifier_param}): {e}")