feat: Add trade management section to trading plan edit page
This commit is contained in:
parent
c1bd9e7701
commit
85d7638ef4
@ -1152,6 +1152,85 @@ def trading_plan_page():
|
|||||||
# Get current trades for this plan
|
# Get current trades for this plan
|
||||||
plan_trades = get_plan_trades(plan.id)
|
plan_trades = get_plan_trades(plan.id)
|
||||||
|
|
||||||
|
# Display current trades
|
||||||
|
if plan_trades:
|
||||||
|
st.write("Current Trades:")
|
||||||
|
for trade in plan_trades:
|
||||||
|
with st.expander(f"{trade['ticker']} - {trade['entry_date']}"):
|
||||||
|
col1, col2 = st.columns(2)
|
||||||
|
with col1:
|
||||||
|
st.write(f"Entry: ${trade['entry_price']:.2f}")
|
||||||
|
st.write(f"Shares: {trade['shares']}")
|
||||||
|
with col2:
|
||||||
|
if trade['exit_price']:
|
||||||
|
pl = (trade['exit_price'] - trade['entry_price']) * trade['shares']
|
||||||
|
st.write(f"Exit: ${trade['exit_price']:.2f}")
|
||||||
|
st.write(f"P/L: ${pl:.2f}")
|
||||||
|
|
||||||
|
# Get available trades
|
||||||
|
with create_client() as client:
|
||||||
|
query = """
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
ticker,
|
||||||
|
entry_date,
|
||||||
|
entry_price,
|
||||||
|
shares,
|
||||||
|
exit_price,
|
||||||
|
exit_date,
|
||||||
|
direction,
|
||||||
|
strategy,
|
||||||
|
CASE
|
||||||
|
WHEN exit_price IS NOT NULL
|
||||||
|
THEN (exit_price - entry_price) * shares
|
||||||
|
ELSE NULL
|
||||||
|
END as profit_loss
|
||||||
|
FROM stock_db.trades
|
||||||
|
WHERE plan_id IS NULL
|
||||||
|
ORDER BY entry_date DESC
|
||||||
|
"""
|
||||||
|
result = client.query(query)
|
||||||
|
available_trades = [dict(zip(
|
||||||
|
['id', 'ticker', 'entry_date', 'entry_price', 'shares',
|
||||||
|
'exit_price', 'exit_date', 'direction', 'strategy', 'profit_loss'],
|
||||||
|
row
|
||||||
|
)) for row in result.result_rows]
|
||||||
|
|
||||||
|
if available_trades:
|
||||||
|
st.write("Link Existing Trades:")
|
||||||
|
selected_trades = st.multiselect(
|
||||||
|
"Select trades to link to this plan",
|
||||||
|
options=[t['id'] for t in available_trades],
|
||||||
|
format_func=lambda x: next(
|
||||||
|
f"{t['ticker']} - {t['entry_date']} - ${t['entry_price']:.2f} "
|
||||||
|
f"({t['direction']}) - {t['strategy']} "
|
||||||
|
f"{'[Closed]' if t['exit_price'] else '[Open]'} "
|
||||||
|
f"{'P/L: $' + format(t['profit_loss'], '.2f') if t['profit_loss'] is not None else ''}"
|
||||||
|
for t in available_trades if t['id'] == x
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if selected_trades and st.button("Link Selected Trades"):
|
||||||
|
if link_trades_to_plan(plan.id, selected_trades):
|
||||||
|
st.success("Trades linked successfully!")
|
||||||
|
|
||||||
|
# Calculate and update metrics
|
||||||
|
metrics = calculate_plan_metrics(plan.id)
|
||||||
|
plan.win_rate = metrics['win_rate']
|
||||||
|
plan.average_return_per_trade = metrics['average_return']
|
||||||
|
plan.profit_factor = metrics['profit_factor']
|
||||||
|
update_trading_plan(plan)
|
||||||
|
|
||||||
|
st.query_params.update(rerun=True)
|
||||||
|
else:
|
||||||
|
st.error("Error linking trades")
|
||||||
|
|
||||||
|
# Add Trade Management section
|
||||||
|
st.subheader("Trade Management")
|
||||||
|
|
||||||
|
# Get current trades for this plan
|
||||||
|
plan_trades = get_plan_trades(plan.id)
|
||||||
|
|
||||||
# Display current trades
|
# Display current trades
|
||||||
if plan_trades:
|
if plan_trades:
|
||||||
st.write("Current Trades:")
|
st.write("Current Trades:")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user