feat: Add unique keys to Streamlit form elements to prevent duplicate IDs
This commit is contained in:
parent
5acfe4bfc4
commit
74e1d43936
@ -876,63 +876,63 @@ def trading_plan_page():
|
|||||||
# Basic Info
|
# Basic Info
|
||||||
col1, col2 = st.columns(2)
|
col1, col2 = st.columns(2)
|
||||||
with col1:
|
with col1:
|
||||||
plan_name = st.text_input("Plan Name")
|
plan_name = st.text_input("Plan Name", key="add_plan_name")
|
||||||
status = st.selectbox("Status", [s.value for s in PlanStatus])
|
status = st.selectbox("Status", [s.value for s in PlanStatus], key="add_status")
|
||||||
timeframe = st.selectbox("Timeframe", [t.value for t in Timeframe])
|
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])
|
market_focus = st.selectbox("Market Focus", [m.value for m in MarketFocus], key="add_market_focus")
|
||||||
|
|
||||||
with col2:
|
with col2:
|
||||||
trade_frequency = st.selectbox("Trade Frequency", [f.value for f in TradeFrequency])
|
trade_frequency = st.selectbox("Trade Frequency", [f.value for f in TradeFrequency], key="add_trade_frequency")
|
||||||
plan_author = st.text_input("Author")
|
plan_author = st.text_input("Author", key="add_plan_author")
|
||||||
strategy_version = st.number_input("Version", min_value=1, value=1)
|
strategy_version = st.number_input("Version", min_value=1, value=1, key="add_strategy_version")
|
||||||
|
|
||||||
# Risk Parameters
|
# Risk Parameters
|
||||||
st.subheader("Risk Parameters")
|
st.subheader("Risk Parameters")
|
||||||
col1, col2 = st.columns(2)
|
col1, col2 = st.columns(2)
|
||||||
with col1:
|
with col1:
|
||||||
stop_loss = st.number_input("Stop Loss %", min_value=0.1, value=7.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)
|
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
|
risk_reward_ratio = profit_target / stop_loss if stop_loss > 0 else 0
|
||||||
st.write(f"Risk:Reward Ratio: {risk_reward_ratio:.2f}")
|
st.write(f"Risk:Reward Ratio: {risk_reward_ratio:.2f}")
|
||||||
|
|
||||||
with col2:
|
with col2:
|
||||||
position_sizing = st.number_input("Position Size %", 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)
|
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)
|
max_portfolio_risk = st.number_input("Max Portfolio Risk %", min_value=0.1, value=5.0, key="add_max_portfolio_risk")
|
||||||
|
|
||||||
# Trade Rules
|
# Trade Rules
|
||||||
st.subheader("Trade Rules")
|
st.subheader("Trade Rules")
|
||||||
col1, col2 = st.columns(2)
|
col1, col2 = st.columns(2)
|
||||||
with col1:
|
with col1:
|
||||||
max_trades_per_day = st.number_input("Max Trades per Day", min_value=1, value=3)
|
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)
|
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)
|
maximum_drawdown = st.number_input("Maximum Drawdown %", min_value=0.1, value=20.0, key="add_maximum_drawdown")
|
||||||
|
|
||||||
# Strategy Details
|
# Strategy Details
|
||||||
st.subheader("Strategy Details")
|
st.subheader("Strategy Details")
|
||||||
entry_criteria = st.text_area("Entry Criteria")
|
entry_criteria = st.text_area("Entry Criteria", key="add_entry_criteria")
|
||||||
exit_criteria = st.text_area("Exit Criteria")
|
exit_criteria = st.text_area("Exit Criteria", key="add_exit_criteria")
|
||||||
entry_confirmation = st.text_area("Entry Confirmation")
|
entry_confirmation = st.text_area("Entry Confirmation", key="add_entry_confirmation")
|
||||||
market_conditions = st.text_area("Market Conditions")
|
market_conditions = st.text_area("Market Conditions", key="add_market_conditions")
|
||||||
indicators_used = st.text_area("Technical Indicators")
|
indicators_used = st.text_area("Technical Indicators", key="add_indicators_used")
|
||||||
|
|
||||||
# Risk Management
|
# Risk Management
|
||||||
st.subheader("Risk Management")
|
st.subheader("Risk Management")
|
||||||
adjustments_for_drawdown = st.text_area("Drawdown Adjustments")
|
adjustments_for_drawdown = st.text_area("Drawdown Adjustments", key="add_adjustments_for_drawdown")
|
||||||
risk_controls = st.text_area("Risk Controls")
|
risk_controls = st.text_area("Risk Controls", key="add_risk_controls")
|
||||||
|
|
||||||
# Optional Fields
|
# Optional Fields
|
||||||
st.subheader("Additional Information")
|
st.subheader("Additional Information")
|
||||||
col1, col2 = st.columns(2)
|
col1, col2 = st.columns(2)
|
||||||
with col1:
|
with col1:
|
||||||
sector_focus = st.text_input("Sector Focus (optional)")
|
sector_focus = st.text_input("Sector Focus (optional)", key="add_sector_focus")
|
||||||
fundamental_criteria = st.text_area("Fundamental Criteria (optional)")
|
fundamental_criteria = st.text_area("Fundamental Criteria (optional)", key="add_fundamental_criteria")
|
||||||
|
|
||||||
with col2:
|
with col2:
|
||||||
options_strategy_details = st.text_area("Options Strategy Details (optional)")
|
options_strategy_details = st.text_area("Options Strategy Details (optional)", key="add_options_strategy_details")
|
||||||
improvements_needed = st.text_area("Improvements Needed (optional)")
|
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:
|
try:
|
||||||
plan = TradingPlan(
|
plan = TradingPlan(
|
||||||
plan_name=plan_name,
|
plan_name=plan_name,
|
||||||
@ -978,7 +978,8 @@ def trading_plan_page():
|
|||||||
selected_plan_id = st.selectbox(
|
selected_plan_id = st.selectbox(
|
||||||
"Select Plan to Edit",
|
"Select Plan to Edit",
|
||||||
options=[plan.id for plan in plans],
|
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:
|
if selected_plan_id:
|
||||||
@ -986,12 +987,13 @@ def trading_plan_page():
|
|||||||
if plan:
|
if plan:
|
||||||
# Add similar form fields as in add_tab but with plan's current values
|
# 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
|
# 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",
|
status = st.selectbox("Status",
|
||||||
[s.value for s in PlanStatus],
|
[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:
|
try:
|
||||||
plan.plan_name = plan_name
|
plan.plan_name = plan_name
|
||||||
plan.status = PlanStatus(status)
|
plan.status = PlanStatus(status)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user