|
|
|
@ -235,7 +235,7 @@ export class PortfolioCalculator {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const netPerformanceValuesBySymbol: {
|
|
|
|
|
const currentValuesBySymbol: {
|
|
|
|
|
[symbol: string]: { [date: string]: Big };
|
|
|
|
|
} = {};
|
|
|
|
|
|
|
|
|
@ -247,21 +247,31 @@ export class PortfolioCalculator {
|
|
|
|
|
[symbol: string]: { [date: string]: Big };
|
|
|
|
|
} = {};
|
|
|
|
|
|
|
|
|
|
const netPerformanceValuesBySymbol: {
|
|
|
|
|
[symbol: string]: { [date: string]: Big };
|
|
|
|
|
} = {};
|
|
|
|
|
|
|
|
|
|
const totalCurrentValues: { [date: string]: Big } = {};
|
|
|
|
|
const totalNetPerformanceValues: { [date: string]: Big } = {};
|
|
|
|
|
const totalInvestmentValues: { [date: string]: Big } = {};
|
|
|
|
|
const maxTotalInvestmentValues: { [date: string]: Big } = {};
|
|
|
|
|
|
|
|
|
|
for (const symbol of Object.keys(symbols)) {
|
|
|
|
|
const { investmentValues, maxInvestmentValues, netPerformanceValues } =
|
|
|
|
|
this.getSymbolMetrics({
|
|
|
|
|
end,
|
|
|
|
|
marketSymbolMap,
|
|
|
|
|
start,
|
|
|
|
|
step,
|
|
|
|
|
symbol,
|
|
|
|
|
isChartMode: true
|
|
|
|
|
});
|
|
|
|
|
const {
|
|
|
|
|
currentValues,
|
|
|
|
|
investmentValues,
|
|
|
|
|
maxInvestmentValues,
|
|
|
|
|
netPerformanceValues
|
|
|
|
|
} = this.getSymbolMetrics({
|
|
|
|
|
end,
|
|
|
|
|
marketSymbolMap,
|
|
|
|
|
start,
|
|
|
|
|
step,
|
|
|
|
|
symbol,
|
|
|
|
|
isChartMode: true
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
currentValuesBySymbol[symbol] = currentValues;
|
|
|
|
|
netPerformanceValuesBySymbol[symbol] = netPerformanceValues;
|
|
|
|
|
investmentValuesBySymbol[symbol] = investmentValues;
|
|
|
|
|
maxInvestmentValuesBySymbol[symbol] = maxInvestmentValues;
|
|
|
|
@ -271,6 +281,15 @@ export class PortfolioCalculator {
|
|
|
|
|
const dateString = format(currentDate, DATE_FORMAT);
|
|
|
|
|
|
|
|
|
|
for (const symbol of Object.keys(netPerformanceValuesBySymbol)) {
|
|
|
|
|
totalCurrentValues[dateString] =
|
|
|
|
|
totalCurrentValues[dateString] ?? new Big(0);
|
|
|
|
|
|
|
|
|
|
if (currentValuesBySymbol[symbol]?.[dateString]) {
|
|
|
|
|
totalCurrentValues[dateString] = totalCurrentValues[dateString].add(
|
|
|
|
|
currentValuesBySymbol[symbol][dateString]
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
totalNetPerformanceValues[dateString] =
|
|
|
|
|
totalNetPerformanceValues[dateString] ?? new Big(0);
|
|
|
|
|
|
|
|
|
@ -283,15 +302,15 @@ export class PortfolioCalculator {
|
|
|
|
|
totalInvestmentValues[dateString] =
|
|
|
|
|
totalInvestmentValues[dateString] ?? new Big(0);
|
|
|
|
|
|
|
|
|
|
maxTotalInvestmentValues[dateString] =
|
|
|
|
|
maxTotalInvestmentValues[dateString] ?? new Big(0);
|
|
|
|
|
|
|
|
|
|
if (investmentValuesBySymbol[symbol]?.[dateString]) {
|
|
|
|
|
totalInvestmentValues[dateString] = totalInvestmentValues[
|
|
|
|
|
dateString
|
|
|
|
|
].add(investmentValuesBySymbol[symbol][dateString]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
maxTotalInvestmentValues[dateString] =
|
|
|
|
|
maxTotalInvestmentValues[dateString] ?? new Big(0);
|
|
|
|
|
|
|
|
|
|
if (maxInvestmentValuesBySymbol[symbol]?.[dateString]) {
|
|
|
|
|
maxTotalInvestmentValues[dateString] = maxTotalInvestmentValues[
|
|
|
|
|
dateString
|
|
|
|
@ -313,9 +332,7 @@ export class PortfolioCalculator {
|
|
|
|
|
netPerformanceInPercentage,
|
|
|
|
|
netPerformance: totalNetPerformanceValues[date].toNumber(),
|
|
|
|
|
totalInvestment: totalInvestmentValues[date].toNumber(),
|
|
|
|
|
value: totalInvestmentValues[date]
|
|
|
|
|
.plus(totalNetPerformanceValues[date])
|
|
|
|
|
.toNumber()
|
|
|
|
|
value: totalCurrentValues[date].toNumber()
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
@ -906,12 +923,16 @@ export class PortfolioCalculator {
|
|
|
|
|
|
|
|
|
|
if (orders.length <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
currentValues: {},
|
|
|
|
|
grossPerformance: new Big(0),
|
|
|
|
|
grossPerformancePercentage: new Big(0),
|
|
|
|
|
hasErrors: false,
|
|
|
|
|
initialValue: new Big(0),
|
|
|
|
|
investmentValues: {},
|
|
|
|
|
maxInvestmentValues: {},
|
|
|
|
|
netPerformance: new Big(0),
|
|
|
|
|
netPerformancePercentage: new Big(0),
|
|
|
|
|
grossPerformance: new Big(0),
|
|
|
|
|
grossPerformancePercentage: new Big(0)
|
|
|
|
|
netPerformanceValues: {}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -946,6 +967,7 @@ export class PortfolioCalculator {
|
|
|
|
|
let grossPerformanceFromSells = new Big(0);
|
|
|
|
|
let initialValue: Big;
|
|
|
|
|
let investmentAtStartDate: Big;
|
|
|
|
|
const currentValues: { [date: string]: Big } = {};
|
|
|
|
|
const investmentValues: { [date: string]: Big } = {};
|
|
|
|
|
const maxInvestmentValues: { [date: string]: Big } = {};
|
|
|
|
|
let lastAveragePrice = new Big(0);
|
|
|
|
@ -1164,6 +1186,7 @@ export class PortfolioCalculator {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isChartMode && i > indexOfStartOrder) {
|
|
|
|
|
currentValues[order.date] = valueOfInvestment;
|
|
|
|
|
netPerformanceValues[order.date] = grossPerformance
|
|
|
|
|
.minus(grossPerformanceAtStartDate)
|
|
|
|
|
.minus(fees.minus(feesAtStartDate));
|
|
|
|
@ -1261,15 +1284,16 @@ export class PortfolioCalculator {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
initialValue,
|
|
|
|
|
currentValues,
|
|
|
|
|
grossPerformancePercentage,
|
|
|
|
|
initialValue,
|
|
|
|
|
investmentValues,
|
|
|
|
|
maxInvestmentValues,
|
|
|
|
|
netPerformancePercentage,
|
|
|
|
|
netPerformanceValues,
|
|
|
|
|
grossPerformance: totalGrossPerformance,
|
|
|
|
|
hasErrors: totalUnits.gt(0) && (!initialValue || !unitPriceAtEndDate),
|
|
|
|
|
netPerformance: totalNetPerformance,
|
|
|
|
|
grossPerformance: totalGrossPerformance
|
|
|
|
|
netPerformance: totalNetPerformance
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|