Browse Source

Update getSymbolMetrics to use dates instead of range

pull/3139/head
helgehatt 1 year ago
parent
commit
2d0a869746
  1. 59
      apps/api/src/app/portfolio/portfolio-calculator.ts

59
apps/api/src/app/portfolio/portfolio-calculator.ts

@ -291,10 +291,8 @@ export class PortfolioCalculator {
timeWeightedInvestmentValues, timeWeightedInvestmentValues,
timeWeightedInvestmentValuesWithCurrencyEffect timeWeightedInvestmentValuesWithCurrencyEffect
} = this.getSymbolMetrics({ } = this.getSymbolMetrics({
end: dates?.[dates.length - 1] ?? end, dates,
marketSymbolMap, marketSymbolMap,
start: dates?.[0] ?? start,
step: dates.length > 1 ? differenceInDays(dates[1], dates[0]) : 1,
symbol, symbol,
exchangeRates: exchangeRates:
exchangeRatesByCurrency[`${currencies[symbol]}${this.currency}`], exchangeRatesByCurrency[`${currencies[symbol]}${this.currency}`],
@ -444,18 +442,16 @@ export class PortfolioCalculator {
): Promise<CurrentPositions> { ): Promise<CurrentPositions> {
const lastTransactionPoint = last(this.transactionPoints); const lastTransactionPoint = last(this.transactionPoints);
let endDate = end; if (!end) {
const now = new Date(Date.now());
if (!endDate) { end = lastTransactionPoint
endDate = new Date(Date.now()); ? max([now, parseDate(lastTransactionPoint.date)])
: now;
if (lastTransactionPoint) {
endDate = max([endDate, parseDate(lastTransactionPoint.date)]);
}
} }
const transactionPoints = this.transactionPoints?.filter(({ date }) => { const transactionPoints = this.transactionPoints?.filter(({ date }) => {
return isBefore(parseDate(date), endDate); return isBefore(parseDate(date), end);
}); });
if (!transactionPoints.length) { if (!transactionPoints.length) {
@ -508,7 +504,7 @@ export class PortfolioCalculator {
} }
} }
dates.push(resetHours(endDate)); dates.push(resetHours(end));
// Add dates of last week for fallback // Add dates of last week for fallback
dates.push(subDays(resetHours(new Date()), 7)); dates.push(subDays(resetHours(new Date()), 7));
@ -535,7 +531,7 @@ export class PortfolioCalculator {
let exchangeRatesByCurrency = let exchangeRatesByCurrency =
await this.exchangeRateDataService.getExchangeRatesByCurrency({ await this.exchangeRateDataService.getExchangeRatesByCurrency({
currencies: uniq(Object.values(currencies)), currencies: uniq(Object.values(currencies)),
endDate: endOfDay(endDate), endDate: endOfDay(end),
startDate: parseDate(this.transactionPoints?.[0]?.date), startDate: parseDate(this.transactionPoints?.[0]?.date),
targetCurrency: this.currency targetCurrency: this.currency
}); });
@ -571,7 +567,7 @@ export class PortfolioCalculator {
} }
} }
const endDateString = format(endDate, DATE_FORMAT); const endDateString = format(end, DATE_FORMAT);
if (firstIndex > 0) { if (firstIndex > 0) {
firstIndex--; firstIndex--;
@ -608,9 +604,10 @@ export class PortfolioCalculator {
totalInvestment, totalInvestment,
totalInvestmentWithCurrencyEffect totalInvestmentWithCurrencyEffect
} = this.getSymbolMetrics({ } = this.getSymbolMetrics({
dates: Array.from({ length: differenceInDays(end, start) + 1 }).map(
(_, i) => addDays(start, i)
),
marketSymbolMap, marketSymbolMap,
start,
end: endDate,
exchangeRates: exchangeRates:
exchangeRatesByCurrency[`${item.currency}${this.currency}`], exchangeRatesByCurrency[`${item.currency}${this.currency}`],
symbol: item.symbol symbol: item.symbol
@ -830,24 +827,21 @@ export class PortfolioCalculator {
} }
private getSymbolMetrics({ private getSymbolMetrics({
end, dates,
exchangeRates, exchangeRates,
isChartMode = false, isChartMode = false,
marketSymbolMap, marketSymbolMap,
start,
step = 1,
symbol symbol
}: { }: {
end: Date; dates: Date[];
exchangeRates: { [dateString: string]: number }; exchangeRates: { [dateString: string]: number };
isChartMode?: boolean; isChartMode?: boolean;
marketSymbolMap: { marketSymbolMap: {
[date: string]: { [symbol: string]: Big }; [date: string]: { [symbol: string]: Big };
}; };
start: Date;
step?: number;
symbol: string; symbol: string;
}): SymbolMetrics { }): SymbolMetrics {
const [start, end] = [first(dates), last(dates)];
const currentExchangeRate = exchangeRates[format(new Date(), DATE_FORMAT)]; const currentExchangeRate = exchangeRates[format(new Date(), DATE_FORMAT)];
const currentValues: { [date: string]: Big } = {}; const currentValues: { [date: string]: Big } = {};
const currentValuesWithCurrencyEffect: { [date: string]: Big } = {}; const currentValuesWithCurrencyEffect: { [date: string]: Big } = {};
@ -1000,39 +994,30 @@ export class PortfolioCalculator {
unitPrice: unitPriceAtEndDate unitPrice: unitPriceAtEndDate
}); });
let day = start;
let lastUnitPrice: Big; let lastUnitPrice: Big;
if (isChartMode) { if (isChartMode) {
const datesWithOrders = {}; const datesWithOrders = new Set(orders.map((x) => x.date));
for (const order of orders) { for (const day of dates.slice(0, -1)) {
datesWithOrders[order.date] = true; const dateString = format(day, DATE_FORMAT);
}
while (isBefore(day, end)) {
const hasDate = datesWithOrders[format(day, DATE_FORMAT)];
if (!hasDate) { if (!datesWithOrders.has(dateString)) {
orders.push({ orders.push({
symbol, symbol,
currency: null, currency: null,
date: format(day, DATE_FORMAT), date: dateString,
dataSource: null, dataSource: null,
fee: new Big(0), fee: new Big(0),
feeInBaseCurrency: new Big(0), feeInBaseCurrency: new Big(0),
name: '', name: '',
quantity: new Big(0), quantity: new Big(0),
type: 'BUY', type: 'BUY',
unitPrice: unitPrice: marketSymbolMap[dateString]?.[symbol] ?? lastUnitPrice
marketSymbolMap[format(day, DATE_FORMAT)]?.[symbol] ??
lastUnitPrice
}); });
} }
lastUnitPrice = last(orders).unitPrice; lastUnitPrice = last(orders).unitPrice;
day = addDays(day, step);
} }
} }

Loading…
Cancel
Save