Browse Source

Refactoring

pull/3203/head
Thomas Kaul 1 year ago
parent
commit
b7020703c3
  1. 69
      apps/api/src/app/portfolio/portfolio-calculator.ts

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

@ -776,70 +776,75 @@ export class PortfolioCalculator {
let lastDate: string = null; let lastDate: string = null;
let lastTransactionPoint: TransactionPoint = null; let lastTransactionPoint: TransactionPoint = null;
for (const order of this.orders) { for (const {
const currentDate = order.date; fee,
date,
quantity,
SymbolProfile,
tags,
type,
unitPrice
} of this.orders) {
let currentTransactionPointItem: TransactionPointSymbol; let currentTransactionPointItem: TransactionPointSymbol;
const oldAccumulatedSymbol = symbols[order.SymbolProfile.symbol]; const oldAccumulatedSymbol = symbols[SymbolProfile.symbol];
const factor = getFactor(order.type); const factor = getFactor(type);
if (oldAccumulatedSymbol) { if (oldAccumulatedSymbol) {
let investment = oldAccumulatedSymbol.investment; let investment = oldAccumulatedSymbol.investment;
const newQuantity = order.quantity const newQuantity = quantity
.mul(factor) .mul(factor)
.plus(oldAccumulatedSymbol.quantity); .plus(oldAccumulatedSymbol.quantity);
if (order.type === 'BUY') { if (type === 'BUY') {
investment = oldAccumulatedSymbol.investment.plus( investment = oldAccumulatedSymbol.investment.plus(
order.quantity.mul(order.unitPrice) quantity.mul(unitPrice)
); );
} else if (order.type === 'SELL') { } else if (type === 'SELL') {
investment = oldAccumulatedSymbol.investment.minus( investment = oldAccumulatedSymbol.investment.minus(
order.quantity.mul(oldAccumulatedSymbol.averagePrice) quantity.mul(oldAccumulatedSymbol.averagePrice)
); );
} }
currentTransactionPointItem = { currentTransactionPointItem = {
investment, investment,
tags,
averagePrice: newQuantity.gt(0) averagePrice: newQuantity.gt(0)
? investment.div(newQuantity) ? investment.div(newQuantity)
: new Big(0), : new Big(0),
currency: order.SymbolProfile.currency, currency: SymbolProfile.currency,
dataSource: order.SymbolProfile.dataSource, dataSource: SymbolProfile.dataSource,
dividend: new Big(0), dividend: new Big(0),
fee: order.fee.plus(oldAccumulatedSymbol.fee), fee: fee.plus(oldAccumulatedSymbol.fee),
firstBuyDate: oldAccumulatedSymbol.firstBuyDate, firstBuyDate: oldAccumulatedSymbol.firstBuyDate,
quantity: newQuantity, quantity: newQuantity,
symbol: order.SymbolProfile.symbol, symbol: SymbolProfile.symbol,
tags: order.tags,
transactionCount: oldAccumulatedSymbol.transactionCount + 1 transactionCount: oldAccumulatedSymbol.transactionCount + 1
}; };
} else { } else {
currentTransactionPointItem = { currentTransactionPointItem = {
averagePrice: order.unitPrice, fee,
currency: order.SymbolProfile.currency, tags,
dataSource: order.SymbolProfile.dataSource, averagePrice: unitPrice,
currency: SymbolProfile.currency,
dataSource: SymbolProfile.dataSource,
dividend: new Big(0), dividend: new Big(0),
fee: order.fee, firstBuyDate: date,
firstBuyDate: order.date, investment: unitPrice.mul(quantity).mul(factor),
investment: order.unitPrice.mul(order.quantity).mul(factor), quantity: quantity.mul(factor),
quantity: order.quantity.mul(factor), symbol: SymbolProfile.symbol,
symbol: order.SymbolProfile.symbol,
tags: order.tags,
transactionCount: 1 transactionCount: 1
}; };
} }
symbols[order.SymbolProfile.symbol] = currentTransactionPointItem; symbols[SymbolProfile.symbol] = currentTransactionPointItem;
const items = lastTransactionPoint?.items ?? []; const items = lastTransactionPoint?.items ?? [];
const newItems = items.filter( const newItems = items.filter(({ symbol }) => {
(transactionPointItem) => return symbol !== SymbolProfile.symbol;
transactionPointItem.symbol !== order.SymbolProfile.symbol });
);
newItems.push(currentTransactionPointItem); newItems.push(currentTransactionPointItem);
@ -847,9 +852,9 @@ export class PortfolioCalculator {
return a.symbol?.localeCompare(b.symbol); return a.symbol?.localeCompare(b.symbol);
}); });
if (lastDate !== currentDate || lastTransactionPoint === null) { if (lastDate !== date || lastTransactionPoint === null) {
lastTransactionPoint = { lastTransactionPoint = {
date: currentDate, date,
items: newItems items: newItems
}; };
@ -858,7 +863,7 @@ export class PortfolioCalculator {
lastTransactionPoint.items = newItems; lastTransactionPoint.items = newItems;
} }
lastDate = currentDate; lastDate = date;
} }
} }

Loading…
Cancel
Save