feat: Enhance trading system page with total portfolio value calculation and usage metrics
This commit is contained in:
parent
336afa8170
commit
3e1775534c
@ -1,23 +1,46 @@
|
|||||||
import streamlit as st
|
import streamlit as st
|
||||||
from trading.journal import get_latest_portfolio_value, get_open_trades_summary
|
from trading.journal import get_latest_portfolio_value, get_open_trades_summary
|
||||||
from trading.position_calculator import PositionCalculator
|
from trading.position_calculator import PositionCalculator
|
||||||
|
from utils.data_utils import get_current_prices
|
||||||
|
|
||||||
def trading_system_page():
|
def trading_system_page():
|
||||||
st.header("Trading System")
|
st.header("Trading System")
|
||||||
st.subheader("Position Calculator")
|
st.subheader("Position Calculator")
|
||||||
|
|
||||||
# Get latest portfolio value and open trades for cash calculation
|
# Get latest portfolio value and open trades for total portfolio calculation
|
||||||
portfolio_data = get_latest_portfolio_value()
|
portfolio_data = get_latest_portfolio_value()
|
||||||
cash_balance = portfolio_data['cash_balance'] if portfolio_data else 0
|
cash_balance = portfolio_data['cash_balance'] if portfolio_data else 0
|
||||||
|
|
||||||
# Display available cash
|
# Calculate total portfolio value including open positions
|
||||||
|
open_positions = get_open_trades_summary()
|
||||||
|
total_position_value = 0
|
||||||
|
|
||||||
|
if open_positions:
|
||||||
|
# Get current prices for all open positions
|
||||||
|
tickers = [pos['ticker'] for pos in open_positions]
|
||||||
|
current_prices = get_current_prices(tickers)
|
||||||
|
|
||||||
|
# Calculate total value of open positions
|
||||||
|
for position in open_positions:
|
||||||
|
ticker = position['ticker']
|
||||||
|
current_price = current_prices.get(ticker, 0)
|
||||||
|
shares = position['total_shares']
|
||||||
|
total_position_value += current_price * shares
|
||||||
|
|
||||||
|
total_portfolio_value = cash_balance + total_position_value
|
||||||
|
|
||||||
|
# Display portfolio information
|
||||||
|
col1, col2 = st.columns(2)
|
||||||
|
with col1:
|
||||||
st.info(f"Available Cash: ${cash_balance:,.2f}")
|
st.info(f"Available Cash: ${cash_balance:,.2f}")
|
||||||
|
with col2:
|
||||||
|
st.info(f"Total Portfolio Value: ${total_portfolio_value:,.2f}")
|
||||||
|
|
||||||
col1, col2 = st.columns(2)
|
col1, col2 = st.columns(2)
|
||||||
with col1:
|
with col1:
|
||||||
account_size = st.number_input("Account Size ($)",
|
account_size = st.number_input("Account Size ($)",
|
||||||
min_value=0.0,
|
min_value=0.0,
|
||||||
value=cash_balance,
|
value=total_portfolio_value,
|
||||||
step=1000.0)
|
step=1000.0)
|
||||||
risk_percentage = st.number_input("Risk Percentage (%)",
|
risk_percentage = st.number_input("Risk Percentage (%)",
|
||||||
min_value=0.1,
|
min_value=0.1,
|
||||||
@ -53,7 +76,11 @@ def trading_system_page():
|
|||||||
col1, col2 = st.columns(2)
|
col1, col2 = st.columns(2)
|
||||||
with col1:
|
with col1:
|
||||||
if recommended_shares < position['shares']:
|
if recommended_shares < position['shares']:
|
||||||
st.warning(f"Position size limited by available cash. Maximum affordable shares: {recommended_shares:,}")
|
st.warning(
|
||||||
|
f"Position size limited by available cash.\n"
|
||||||
|
f"Ideal shares: {position['shares']:,}\n"
|
||||||
|
f"Maximum affordable shares: {recommended_shares:,}"
|
||||||
|
)
|
||||||
position_value = recommended_shares * entry_price
|
position_value = recommended_shares * entry_price
|
||||||
risk_amount = position['risk_amount'] * (recommended_shares / position['shares'])
|
risk_amount = position['risk_amount'] * (recommended_shares / position['shares'])
|
||||||
|
|
||||||
@ -77,7 +104,12 @@ def trading_system_page():
|
|||||||
# Show percentage of cash being used
|
# Show percentage of cash being used
|
||||||
if recommended_shares > 0:
|
if recommended_shares > 0:
|
||||||
cash_usage = (recommended_shares * entry_price / cash_balance) * 100
|
cash_usage = (recommended_shares * entry_price / cash_balance) * 100
|
||||||
st.info(f"This position would use {cash_usage:.1f}% of available cash")
|
portfolio_usage = (recommended_shares * entry_price / total_portfolio_value) * 100
|
||||||
|
st.info(
|
||||||
|
f"This position would use:\n"
|
||||||
|
f"- {cash_usage:.1f}% of available cash\n"
|
||||||
|
f"- {portfolio_usage:.1f}% of total portfolio"
|
||||||
|
)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
st.error(f"Error calculating position: {str(e)}")
|
st.error(f"Error calculating position: {str(e)}")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user