feat: Add unique keys to Streamlit form elements to prevent duplicate IDs

This commit is contained in:
Bobby (aider) 2025-02-11 18:28:15 -08:00
parent 5acfe4bfc4
commit 74e1d43936

View File

@ -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)