Clarify active strategy cadence in portfolio
This commit is contained in:
parent
d10bb3dd78
commit
8c160d6443
@ -195,6 +195,16 @@ function getNetQuantity(item: any) {
|
||||
return getEffectiveQuantity(item);
|
||||
}
|
||||
|
||||
function formatFrequencyLabel(value?: number | null, unit?: string | null) {
|
||||
const safeValue = Number(value);
|
||||
if (!Number.isFinite(safeValue) || safeValue <= 0 || !unit) {
|
||||
return null;
|
||||
}
|
||||
const normalizedUnit = unit === "minutes" ? "minute" : unit === "days" ? "day" : unit;
|
||||
const pluralizedUnit = safeValue === 1 ? normalizedUnit : `${normalizedUnit}s`;
|
||||
return `${safeValue} ${pluralizedUnit}`;
|
||||
}
|
||||
|
||||
function getAveragePrice(item: any) {
|
||||
return firstNumber(item?.average_price, item?.avg_price);
|
||||
}
|
||||
@ -762,6 +772,38 @@ export default function PortfolioSection() {
|
||||
: strategyStatus === "WAITING"
|
||||
? "WAITING"
|
||||
: "STOPPED";
|
||||
const savedStrategyAmount = Number(strategyDetails?.config?.sip_amount);
|
||||
const savedStrategyFrequencyValue = Number(strategyDetails?.config?.sip_frequency?.value);
|
||||
const savedStrategyFrequencyUnit =
|
||||
strategyDetails?.config?.sip_frequency?.unit === "minutes"
|
||||
? "minutes"
|
||||
: strategyDetails?.config?.sip_frequency?.unit === "days"
|
||||
? "days"
|
||||
: null;
|
||||
const savedStrategyCadence = formatFrequencyLabel(
|
||||
savedStrategyFrequencyValue,
|
||||
savedStrategyFrequencyUnit,
|
||||
);
|
||||
const savedStrategyAmountLabel =
|
||||
Number.isFinite(savedStrategyAmount) && savedStrategyAmount > 0
|
||||
? formatCurrency(savedStrategyAmount)
|
||||
: null;
|
||||
const savedStrategyMode =
|
||||
strategyDetails?.config?.mode === "LIVE"
|
||||
? "Live"
|
||||
: strategyDetails?.config?.mode === "PAPER"
|
||||
? "Paper"
|
||||
: null;
|
||||
const savedStrategyBroker =
|
||||
strategyDetails?.config?.broker ? formatBrokerName(strategyDetails.config.broker) : null;
|
||||
const savedStrategySummary = [
|
||||
savedStrategyAmountLabel ? `${savedStrategyAmountLabel} SIP` : null,
|
||||
savedStrategyCadence ? `every ${savedStrategyCadence}` : null,
|
||||
savedStrategyMode,
|
||||
savedStrategyBroker,
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join(" · ");
|
||||
const isStrategyActive =
|
||||
normalizedStrategyStatus === "RUNNING" ||
|
||||
normalizedStrategyStatus === "WAITING";
|
||||
@ -1483,6 +1525,12 @@ export default function PortfolioSection() {
|
||||
Minutes mode is for live testing only. The engine checks every few seconds in this mode.
|
||||
</div>
|
||||
) : null}
|
||||
{savedStrategySummary ? (
|
||||
<div className="rounded-lg border border-border/60 bg-background/40 px-3 py-2 text-xs text-muted-foreground">
|
||||
{isStrategyActive ? "Current run" : showResumeStrategy ? "Resume will continue" : "Saved strategy config"}
|
||||
: <span className="font-medium text-foreground"> {savedStrategySummary}</span>
|
||||
</div>
|
||||
) : null}
|
||||
{showResumeStrategy ? (
|
||||
<div className="text-xs text-muted-foreground">
|
||||
Resume uses the previously saved SIP configuration. Choose restart to begin a fresh cycle.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user