diff --git a/src/pages/trading/trading_system_page.py b/src/pages/trading/trading_system_page.py index 4cc87e4..6c2ae47 100644 --- a/src/pages/trading/trading_system_page.py +++ b/src/pages/trading/trading_system_page.py @@ -227,47 +227,38 @@ def trading_system_page(): # Move Add to Watch List button outside of columns if st.button("Add to Watch List", key="add_to_watchlist"): try: - # Debug information - debug_info = { - "Ticker": ticker, - "Entry Price": entry_price, - "Target Price": target_price, - "Stop Loss": position['stop_loss'], - "Notes": notes, - "Selected Watchlist ID": selected_list[0] - } - - st.write("=== PRE-WATCHLIST ITEM CREATION ===") - st.write(debug_info) - st.write("=====================================") - - item = WatchlistItem( - ticker=ticker, - entry_price=float(entry_price), - target_price=float(target_price), - stop_loss=float(position['stop_loss']), - notes=str(notes) if notes else '' - ) - - st.write("=== WATCHLIST ITEM DETAILS ===") - st.write(vars(item)) - st.write("==============================") - - # Add 2 second delay to ensure debug info is visible - time.sleep(2) - - success = add_to_watchlist(selected_list[0], item) - - # Show the result and wait before rerun - st.write(f"Add to watchlist result: {success}") - time.sleep(2) - - if success: - st.success(f"Added {ticker} to watch list!") - time.sleep(1) - st.rerun() - else: - st.error("Failed to add to watch list. Check the details above.") + # Create a container for debug output + debug_container = st.container() + with debug_container: + st.write("=== PRE-WATCHLIST ITEM CREATION ===") + st.json({ + "Ticker": ticker, + "Entry Price": entry_price, + "Target Price": target_price, + "Stop Loss": position['stop_loss'], + "Notes": notes, + "Selected Watchlist ID": selected_list[0] + }) + + item = WatchlistItem( + ticker=ticker, + entry_price=float(entry_price), + target_price=float(target_price), + stop_loss=float(position['stop_loss']), + notes=str(notes) if notes else '' + ) + + st.write("=== WATCHLIST ITEM DETAILS ===") + st.json(vars(item)) + + success = add_to_watchlist(selected_list[0], item) + + if success: + st.success(f"Added {ticker} to watch list!") + time.sleep(3) # Give time to see success message + st.experimental_rerun() + else: + st.error("Failed to add to watch list. Check the details above.") except Exception as e: st.error(f"Error adding to watchlist: {str(e)}") diff --git a/src/trading/watchlist.py b/src/trading/watchlist.py index 4fce531..25ab9f4 100644 --- a/src/trading/watchlist.py +++ b/src/trading/watchlist.py @@ -38,90 +38,112 @@ def get_watchlists() -> List[dict]: def add_to_watchlist(watchlist_id: int, item: WatchlistItem) -> bool: with create_client() as client: try: - # Debug output using st.write - st.write("\n=== WATCHLIST INSERT ATTEMPT ===") - st.write("Input parameters:") - st.write(f"Watchlist ID: {watchlist_id}") - st.write("Item details:", { - "Ticker": item.ticker, - "Entry Price": item.entry_price, - "Target Price": item.target_price, - "Stop Loss": item.stop_loss, - "Notes": item.notes - }) - - # Check if watchlist exists - check_watchlist_query = f"SELECT * FROM stock_db.watchlists WHERE id = {watchlist_id}" - watchlist_result = client.query(check_watchlist_query) - st.write("Watchlist check result:", watchlist_result.result_rows) - - if not watchlist_result.result_rows: - st.error(f"Watchlist ID {watchlist_id} not found") - return False - - # Get next ID - id_query = "SELECT max(id) + 1 as next_id FROM stock_db.watchlist_items" - result = client.query(id_query) - next_id = result.first_row[0] if result.first_row[0] is not None else 1 - st.write(f"Next ID: {next_id}") - - # Prepare data - data = [( - int(next_id), - int(watchlist_id), - str(item.ticker), - float(item.entry_price), - float(item.target_price), - float(item.stop_loss), - str(item.notes or ''), - datetime.now() - )] - - column_names = [ - 'id', 'watchlist_id', 'ticker', 'entry_price', - 'target_price', 'stop_loss', 'notes', 'created_at' - ] - - column_types = [ - 'UInt32', 'UInt32', 'String', 'Float64', - 'Float64', 'Float64', 'String', 'DateTime' - ] - - # Show insert details - st.write("\n=== DATABASE INSERT ATTEMPT ===") - st.write("Data to insert:", data) - st.write("Column names:", column_names) - st.write("Column types:", column_types) - - # Perform insert - try: - client.insert( - 'stock_db.watchlist_items', - data, - column_names=column_names, - column_types=column_types - ) - st.write("Insert operation completed successfully") - except Exception as insert_error: - st.error(f"Insert error: {insert_error}") - raise - - # Verify the insert - verify_query = f""" - SELECT * - FROM stock_db.watchlist_items - WHERE id = {next_id} - AND watchlist_id = {watchlist_id} - AND ticker = '{item.ticker}' + # Debug output using both logger and st.write + debug_msg = f""" + === WATCHLIST INSERT ATTEMPT === + Watchlist ID: {watchlist_id} + Item details: + - Ticker: {item.ticker} + - Entry Price: {item.entry_price} + - Target Price: {item.target_price} + - Stop Loss: {item.stop_loss} + - Notes: {item.notes} + ============================== """ - verify_result = client.query(verify_query) - st.write("Verification result:", verify_result.result_rows) + logger.info(debug_msg) + st.code(debug_msg) # Using st.code for better formatting - if not verify_result.result_rows: - st.error("Verification failed - no rows found after insert") - return False - - return True + # Force a container to stay visible + placeholder = st.empty() + with placeholder.container(): + # Check if watchlist exists + check_watchlist_query = f"SELECT * FROM stock_db.watchlists WHERE id = {watchlist_id}" + watchlist_result = client.query(check_watchlist_query) + logger.info(f"Watchlist check result: {watchlist_result.result_rows}") + st.write("Watchlist check result:", watchlist_result.result_rows) + + if not watchlist_result.result_rows: + error_msg = f"Watchlist ID {watchlist_id} not found" + logger.error(error_msg) + st.error(error_msg) + return False + + # Get next ID + id_query = "SELECT max(id) + 1 as next_id FROM stock_db.watchlist_items" + result = client.query(id_query) + next_id = result.first_row[0] if result.first_row[0] is not None else 1 + logger.info(f"Next ID: {next_id}") + st.write(f"Next ID: {next_id}") + + # Prepare data + data = [( + int(next_id), + int(watchlist_id), + str(item.ticker), + float(item.entry_price), + float(item.target_price), + float(item.stop_loss), + str(item.notes or ''), + datetime.now() + )] + + column_names = [ + 'id', 'watchlist_id', 'ticker', 'entry_price', + 'target_price', 'stop_loss', 'notes', 'created_at' + ] + + column_types = [ + 'UInt32', 'UInt32', 'String', 'Float64', + 'Float64', 'Float64', 'String', 'DateTime' + ] + + # Show insert details + logger.info(f"Data to insert: {data}") + logger.info(f"Column names: {column_names}") + logger.info(f"Column types: {column_types}") + + st.write("=== DATABASE INSERT ATTEMPT ===") + st.json({"data": str(data), "columns": column_names, "types": column_types}) + + # Perform insert + try: + client.insert( + 'stock_db.watchlist_items', + data, + column_names=column_names, + column_types=column_types + ) + success_msg = "Insert operation completed successfully" + logger.info(success_msg) + st.success(success_msg) + except Exception as insert_error: + error_msg = f"Insert error: {insert_error}" + logger.error(error_msg) + st.error(error_msg) + raise + + # Verify the insert + verify_query = f""" + SELECT * + FROM stock_db.watchlist_items + WHERE id = {next_id} + AND watchlist_id = {watchlist_id} + AND ticker = '{item.ticker}' + """ + logger.info(f"Verification query: {verify_query}") + verify_result = client.query(verify_query) + logger.info(f"Verification result: {verify_result.result_rows}") + st.write("Verification result:", verify_result.result_rows) + + if not verify_result.result_rows: + error_msg = "Verification failed - no rows found after insert" + logger.error(error_msg) + st.error(error_msg) + return False + + st.success("Watchlist item added successfully!") + time.sleep(3) # Give time to see the messages + return True except Exception as e: logger.error(f"Error adding to watchlist: {e}", exc_info=True) return False