Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions client/src/App.css
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,18 @@ textarea {
border-bottom: 1px dotted var(--color-border-strong);
}

.equity-card__metric-separator {
padding: 8px 0 4px;
text-align: center;
color: var(--color-text-muted);
font-size: 12px;
letter-spacing: 4px;
}

.equity-card__metric-separator span {
display: inline-block;
}


.equity-card__metric-row[data-interactive='true'] {
cursor: pointer;
Expand Down
59 changes: 56 additions & 3 deletions client/src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ function buildClipboardSummary({
displayTotalEquity,
usdToCadRate,
pnl,
netDeposits,
positions,
asOf,
currencyOption,
Expand Down Expand Up @@ -224,6 +225,9 @@ function buildClipboardSummary({
lines.push(`Today's P&L: ${formatSignedMoney(pnl?.dayPnl)}`);
lines.push(`Open P&L: ${formatSignedMoney(pnl?.openPnl)}`);
lines.push(`Total P&L: ${formatSignedMoney(pnl?.totalPnl)}`);
if (netDeposits !== null && netDeposits !== undefined) {
lines.push(`Net deposits: ${formatSignedMoney(netDeposits)}`);
}
lines.push(`Total equity: ${formatMoney(balances?.totalEquity)}`);
lines.push(`Market value: ${formatMoney(balances?.marketValue)}`);
lines.push(`Cash: ${formatMoney(balances?.cash)}`);
Expand Down Expand Up @@ -987,6 +991,7 @@ export default function App() {
const rawPositions = useMemo(() => data?.positions ?? [], [data?.positions]);
const balances = data?.balances || null;
const accountBalances = data?.accountBalances ?? EMPTY_OBJECT;
const accountFundingSummaries = data?.accountFundingSummaries ?? EMPTY_OBJECT;
const investmentModelEvaluations = data?.investmentModelEvaluations ?? EMPTY_OBJECT;
const asOf = data?.asOf || null;

Expand Down Expand Up @@ -1256,6 +1261,51 @@ export default function App() {
};
}, [activeCurrency, balancePnlSummaries, fallbackPnl]);

const selectedAccountFunding = useMemo(() => {
if (!selectedAccountInfo) {
return null;
}
return accountFundingSummaries[selectedAccountInfo.id] || null;
}, [selectedAccountInfo, accountFundingSummaries]);

const combinedFundingEntry = useMemo(() => {
if (!selectedAccountInfo || !selectedAccountFunding || selectedAccountFunding.status !== 'ok') {
return null;
}
if (!activeCurrency || activeCurrency.scope !== 'combined') {
return null;
}
return pickBalanceEntry(selectedAccountFunding.combined, activeCurrency.currency) || null;
}, [selectedAccountInfo, selectedAccountFunding, activeCurrency]);

const totalPnlOverride = useMemo(() => {
if (!combinedFundingEntry) {
return null;
}
const value = combinedFundingEntry.totalPnl;
return typeof value === 'number' && Number.isFinite(value) ? value : null;
}, [combinedFundingEntry]);

const netDepositsValue = useMemo(() => {
if (!combinedFundingEntry) {
return null;
}
const value = combinedFundingEntry.netDeposits;
return typeof value === 'number' && Number.isFinite(value) ? value : null;
}, [combinedFundingEntry]);

const summaryPnl = useMemo(() => {
const baseTotal = typeof activePnl.totalPnl === 'number' && Number.isFinite(activePnl.totalPnl)
? activePnl.totalPnl
: null;
const effectiveTotal = totalPnlOverride !== null && totalPnlOverride !== undefined ? totalPnlOverride : baseTotal;
return {
dayPnl: activePnl.dayPnl,
openPnl: activePnl.openPnl,
totalPnl: effectiveTotal,
};
}, [activePnl, totalPnlOverride]);

const heatmapMarketValue = useMemo(() => {
if (activeBalances && typeof activeBalances === 'object') {
const balanceTotalEquity = coerceNumber(activeBalances.totalEquity);
Expand Down Expand Up @@ -1406,7 +1456,8 @@ export default function App() {
balances: activeBalances,
displayTotalEquity,
usdToCadRate,
pnl: activePnl,
pnl: summaryPnl,
netDeposits: netDepositsValue,
positions: orderedPositions,
asOf,
currencyOption: activeCurrency,
Expand Down Expand Up @@ -1440,7 +1491,8 @@ export default function App() {
activeBalances,
displayTotalEquity,
usdToCadRate,
activePnl,
summaryPnl,
netDepositsValue,
orderedPositions,
asOf,
activeCurrency,
Expand Down Expand Up @@ -1547,7 +1599,8 @@ export default function App() {
currencyOptions={currencyOptions}
onCurrencyChange={setCurrencyView}
balances={activeBalances}
pnl={activePnl}
pnl={summaryPnl}
netDeposits={netDepositsValue}
asOf={asOf}
onRefresh={handleRefresh}
displayTotalEquity={displayTotalEquity}
Expand Down
13 changes: 13 additions & 0 deletions client/src/components/SummaryMetrics.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ export default function SummaryMetrics({
onCurrencyChange,
balances,
pnl,
netDeposits,
asOf,
onRefresh,
displayTotalEquity,
Expand Down Expand Up @@ -219,6 +220,8 @@ export default function SummaryMetrics({
const formattedToday = formatSignedMoney(pnl?.dayPnl ?? null);
const formattedOpen = formatSignedMoney(pnl?.openPnl ?? null);
const formattedTotal = formatSignedMoney(pnl?.totalPnl ?? null);
const hasNetDeposits = Number.isFinite(netDeposits);
const formattedNetDeposits = formatSignedMoney(hasNetDeposits ? netDeposits : null);

const safeTotalEquity = Number.isFinite(totalEquity) ? totalEquity : null;

Expand Down Expand Up @@ -356,6 +359,14 @@ export default function SummaryMetrics({
onActivate={onShowPnlBreakdown ? () => onShowPnlBreakdown('open') : null}
/>
<MetricRow label="Total P&L" value={formattedTotal} tone={totalTone} />
{hasNetDeposits && (
<>
<div className="equity-card__metric-separator" aria-hidden="true">
<span>....................</span>
</div>
<MetricRow label="Net deposits" value={formattedNetDeposits} tone="neutral" />
</>
)}
</dl>
<dl className="equity-card__metric-column">
<MetricRow label="Total equity" value={formatMoney(totalEquity)} tone="neutral" />
Expand Down Expand Up @@ -396,6 +407,7 @@ SummaryMetrics.propTypes = {
openPnl: PropTypes.number,
totalPnl: PropTypes.number,
}).isRequired,
netDeposits: PropTypes.number,
asOf: PropTypes.string,
onRefresh: PropTypes.func,
displayTotalEquity: PropTypes.number,
Expand Down Expand Up @@ -432,4 +444,5 @@ SummaryMetrics.defaultProps = {
chatUrl: null,
showQqqTemperature: false,
qqqSummary: null,
netDeposits: null,
};
Loading