From 74e1d43936b0fcfe6b6a491898b5a9b258b46a9f Mon Sep 17 00:00:00 2001 From: "Bobby (aider)" Date: Tue, 11 Feb 2025 18:28:15 -0800 Subject: [PATCH] feat: Add unique keys to Streamlit form elements to prevent duplicate IDs --- src/streamlit_app.py | 64 +++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/src/streamlit_app.py b/src/streamlit_app.py index 2567210..059a9e5 100644 --- a/src/streamlit_app.py +++ b/src/streamlit_app.py @@ -876,63 +876,63 @@ def trading_plan_page(): # Basic Info col1, col2 = st.columns(2) with col1: - plan_name = st.text_input("Plan Name") - status = st.selectbox("Status", [s.value for s in PlanStatus]) - timeframe = st.selectbox("Timeframe", [t.value for t in Timeframe]) - market_focus = st.selectbox("Market Focus", [m.value for m in MarketFocus]) + plan_name = st.text_input("Plan Name", key="add_plan_name") + status = st.selectbox("Status", [s.value for s in PlanStatus], key="add_status") + timeframe = st.selectbox("Timeframe", [t.value for t in Timeframe], key="add_timeframe") + market_focus = st.selectbox("Market Focus", [m.value for m in MarketFocus], key="add_market_focus") with col2: - trade_frequency = st.selectbox("Trade Frequency", [f.value for f in TradeFrequency]) - plan_author = st.text_input("Author") - strategy_version = st.number_input("Version", min_value=1, value=1) + trade_frequency = st.selectbox("Trade Frequency", [f.value for f in TradeFrequency], key="add_trade_frequency") + plan_author = st.text_input("Author", key="add_plan_author") + strategy_version = st.number_input("Version", min_value=1, value=1, key="add_strategy_version") # Risk Parameters st.subheader("Risk Parameters") col1, col2 = st.columns(2) with col1: - stop_loss = st.number_input("Stop Loss %", min_value=0.1, value=7.0) - profit_target = st.number_input("Profit Target %", min_value=0.1, value=21.0) + stop_loss = st.number_input("Stop Loss %", min_value=0.1, value=7.0, key="add_stop_loss") + profit_target = st.number_input("Profit Target %", min_value=0.1, value=21.0, key="add_profit_target") risk_reward_ratio = profit_target / stop_loss if stop_loss > 0 else 0 st.write(f"Risk:Reward Ratio: {risk_reward_ratio:.2f}") with col2: - position_sizing = st.number_input("Position Size %", min_value=0.1, value=5.0) - total_risk_per_trade = st.number_input("Risk per Trade %", min_value=0.1, value=1.0) - max_portfolio_risk = st.number_input("Max Portfolio Risk %", min_value=0.1, value=5.0) + position_sizing = st.number_input("Position Size %", min_value=0.1, value=5.0, key="add_position_sizing") + total_risk_per_trade = st.number_input("Risk per Trade %", min_value=0.1, value=1.0, key="add_total_risk_per_trade") + max_portfolio_risk = st.number_input("Max Portfolio Risk %", min_value=0.1, value=5.0, key="add_max_portfolio_risk") # Trade Rules st.subheader("Trade Rules") col1, col2 = st.columns(2) with col1: - max_trades_per_day = st.number_input("Max Trades per Day", min_value=1, value=3) - max_trades_per_week = st.number_input("Max Trades per Week", min_value=1, value=15) - maximum_drawdown = st.number_input("Maximum Drawdown %", min_value=0.1, value=20.0) + max_trades_per_day = st.number_input("Max Trades per Day", min_value=1, value=3, key="add_max_trades_per_day") + max_trades_per_week = st.number_input("Max Trades per Week", min_value=1, value=15, key="add_max_trades_per_week") + maximum_drawdown = st.number_input("Maximum Drawdown %", min_value=0.1, value=20.0, key="add_maximum_drawdown") # Strategy Details st.subheader("Strategy Details") - entry_criteria = st.text_area("Entry Criteria") - exit_criteria = st.text_area("Exit Criteria") - entry_confirmation = st.text_area("Entry Confirmation") - market_conditions = st.text_area("Market Conditions") - indicators_used = st.text_area("Technical Indicators") + entry_criteria = st.text_area("Entry Criteria", key="add_entry_criteria") + exit_criteria = st.text_area("Exit Criteria", key="add_exit_criteria") + entry_confirmation = st.text_area("Entry Confirmation", key="add_entry_confirmation") + market_conditions = st.text_area("Market Conditions", key="add_market_conditions") + indicators_used = st.text_area("Technical Indicators", key="add_indicators_used") # Risk Management st.subheader("Risk Management") - adjustments_for_drawdown = st.text_area("Drawdown Adjustments") - risk_controls = st.text_area("Risk Controls") + adjustments_for_drawdown = st.text_area("Drawdown Adjustments", key="add_adjustments_for_drawdown") + risk_controls = st.text_area("Risk Controls", key="add_risk_controls") # Optional Fields st.subheader("Additional Information") col1, col2 = st.columns(2) with col1: - sector_focus = st.text_input("Sector Focus (optional)") - fundamental_criteria = st.text_area("Fundamental Criteria (optional)") + sector_focus = st.text_input("Sector Focus (optional)", key="add_sector_focus") + fundamental_criteria = st.text_area("Fundamental Criteria (optional)", key="add_fundamental_criteria") with col2: - options_strategy_details = st.text_area("Options Strategy Details (optional)") - improvements_needed = st.text_area("Improvements Needed (optional)") + options_strategy_details = st.text_area("Options Strategy Details (optional)", key="add_options_strategy_details") + improvements_needed = st.text_area("Improvements Needed (optional)", key="add_improvements_needed") - if st.button("Create Trading Plan"): + if st.button("Create Trading Plan", key="create_plan_button"): try: plan = TradingPlan( plan_name=plan_name, @@ -978,7 +978,8 @@ def trading_plan_page(): selected_plan_id = st.selectbox( "Select Plan to Edit", options=[plan.id for plan in plans], - format_func=lambda x: next(p.plan_name for p in plans if p.id == x) + format_func=lambda x: next(p.plan_name for p in plans if p.id == x), + key="edit_plan_select" ) if selected_plan_id: @@ -986,12 +987,13 @@ def trading_plan_page(): if plan: # Add similar form fields as in add_tab but with plan's current values # This is a simplified version - you might want to add all fields - plan_name = st.text_input("Plan Name", value=plan.plan_name) + plan_name = st.text_input("Plan Name", value=plan.plan_name, key="edit_plan_name") status = st.selectbox("Status", [s.value for s in PlanStatus], - index=[s.value for s in PlanStatus].index(plan.status.value)) + index=[s.value for s in PlanStatus].index(plan.status.value), + key="edit_status") - if st.button("Update Plan"): + if st.button("Update Plan", key="update_plan_button"): try: plan.plan_name = plan_name plan.status = PlanStatus(status)