|
|
@ -182,10 +182,10 @@ export class PortfolioCalculator { |
|
|
|
return isBefore(parseDate(transactionPoint.date), end); |
|
|
|
}) ?? []; |
|
|
|
|
|
|
|
const firstIndex = transactionPointsBeforeEndDate.length; |
|
|
|
const currencies: { [symbol: string]: string } = {}; |
|
|
|
const dates: Date[] = []; |
|
|
|
const dataGatheringItems: IDataGatheringItem[] = []; |
|
|
|
const currencies: { [symbol: string]: string } = {}; |
|
|
|
const firstIndex = transactionPointsBeforeEndDate.length; |
|
|
|
|
|
|
|
let day = start; |
|
|
|
|
|
|
@ -235,27 +235,24 @@ export class PortfolioCalculator { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const currentValuesBySymbol: { |
|
|
|
[symbol: string]: { [date: string]: Big }; |
|
|
|
} = {}; |
|
|
|
|
|
|
|
const investmentValuesBySymbol: { |
|
|
|
[symbol: string]: { [date: string]: Big }; |
|
|
|
} = {}; |
|
|
|
|
|
|
|
const maxInvestmentValuesBySymbol: { |
|
|
|
[symbol: string]: { [date: string]: Big }; |
|
|
|
const valuesByDate: { |
|
|
|
[date: string]: { |
|
|
|
maxTotalInvestmentValue: Big; |
|
|
|
totalCurrentValue: Big; |
|
|
|
totalInvestmentValue: Big; |
|
|
|
totalNetPerformanceValue: Big; |
|
|
|
}; |
|
|
|
} = {}; |
|
|
|
|
|
|
|
const netPerformanceValuesBySymbol: { |
|
|
|
[symbol: string]: { [date: string]: Big }; |
|
|
|
const valuesBySymbol: { |
|
|
|
[symbol: string]: { |
|
|
|
currentValues: { [date: string]: Big }; |
|
|
|
investmentValues: { [date: string]: Big }; |
|
|
|
maxInvestmentValues: { [date: string]: Big }; |
|
|
|
netPerformanceValues: { [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 { |
|
|
|
currentValues, |
|
|
@ -271,68 +268,67 @@ export class PortfolioCalculator { |
|
|
|
isChartMode: true |
|
|
|
}); |
|
|
|
|
|
|
|
currentValuesBySymbol[symbol] = currentValues; |
|
|
|
netPerformanceValuesBySymbol[symbol] = netPerformanceValues; |
|
|
|
investmentValuesBySymbol[symbol] = investmentValues; |
|
|
|
maxInvestmentValuesBySymbol[symbol] = maxInvestmentValues; |
|
|
|
valuesBySymbol[symbol] = { |
|
|
|
currentValues, |
|
|
|
investmentValues, |
|
|
|
maxInvestmentValues, |
|
|
|
netPerformanceValues |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
for (const currentDate of dates) { |
|
|
|
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); |
|
|
|
|
|
|
|
if (netPerformanceValuesBySymbol[symbol]?.[dateString]) { |
|
|
|
totalNetPerformanceValues[dateString] = totalNetPerformanceValues[ |
|
|
|
dateString |
|
|
|
].add(netPerformanceValuesBySymbol[symbol][dateString]); |
|
|
|
} |
|
|
|
|
|
|
|
totalInvestmentValues[dateString] = |
|
|
|
totalInvestmentValues[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 |
|
|
|
].add(maxInvestmentValuesBySymbol[symbol][dateString]); |
|
|
|
} |
|
|
|
for (const symbol of Object.keys(valuesBySymbol)) { |
|
|
|
const symbolValues = valuesBySymbol[symbol]; |
|
|
|
|
|
|
|
const currentValue = |
|
|
|
symbolValues.currentValues?.[dateString] ?? new Big(0); |
|
|
|
const investmentValue = |
|
|
|
symbolValues.investmentValues?.[dateString] ?? new Big(0); |
|
|
|
const maxInvestmentValue = |
|
|
|
symbolValues.maxInvestmentValues?.[dateString] ?? new Big(0); |
|
|
|
const netPerformanceValue = |
|
|
|
symbolValues.netPerformanceValues?.[dateString] ?? new Big(0); |
|
|
|
|
|
|
|
valuesByDate[dateString] = { |
|
|
|
totalCurrentValue: ( |
|
|
|
valuesByDate[dateString]?.totalCurrentValue ?? new Big(0) |
|
|
|
).add(currentValue), |
|
|
|
totalInvestmentValue: ( |
|
|
|
valuesByDate[dateString]?.totalInvestmentValue ?? new Big(0) |
|
|
|
).add(investmentValue), |
|
|
|
maxTotalInvestmentValue: ( |
|
|
|
valuesByDate[dateString]?.maxTotalInvestmentValue ?? new Big(0) |
|
|
|
).add(maxInvestmentValue), |
|
|
|
totalNetPerformanceValue: ( |
|
|
|
valuesByDate[dateString]?.totalNetPerformanceValue ?? new Big(0) |
|
|
|
).add(netPerformanceValue) |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return Object.keys(totalNetPerformanceValues).map((date) => { |
|
|
|
const netPerformanceInPercentage = maxTotalInvestmentValues[date].eq(0) |
|
|
|
return Object.entries(valuesByDate).map(([date, values]) => { |
|
|
|
const { |
|
|
|
maxTotalInvestmentValue, |
|
|
|
totalCurrentValue, |
|
|
|
totalInvestmentValue, |
|
|
|
totalNetPerformanceValue |
|
|
|
} = values; |
|
|
|
|
|
|
|
const netPerformanceInPercentage = maxTotalInvestmentValue.eq(0) |
|
|
|
? 0 |
|
|
|
: totalNetPerformanceValues[date] |
|
|
|
.div(maxTotalInvestmentValues[date]) |
|
|
|
: totalNetPerformanceValue |
|
|
|
.div(maxTotalInvestmentValue) |
|
|
|
.mul(100) |
|
|
|
.toNumber(); |
|
|
|
|
|
|
|
return { |
|
|
|
date, |
|
|
|
netPerformanceInPercentage, |
|
|
|
netPerformance: totalNetPerformanceValues[date].toNumber(), |
|
|
|
totalInvestment: totalInvestmentValues[date].toNumber(), |
|
|
|
value: totalCurrentValues[date].toNumber() |
|
|
|
netPerformance: totalNetPerformanceValue.toNumber(), |
|
|
|
totalInvestment: totalInvestmentValue.toNumber(), |
|
|
|
value: totalCurrentValue.toNumber() |
|
|
|
}; |
|
|
|
}); |
|
|
|
} |
|
|
|