diff --git a/apps/api/src/app/benchmark/benchmark.service.ts b/apps/api/src/app/benchmark/benchmark.service.ts index a897a6814..9c60757f5 100644 --- a/apps/api/src/app/benchmark/benchmark.service.ts +++ b/apps/api/src/app/benchmark/benchmark.service.ts @@ -4,7 +4,10 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; -import { PROPERTY_BENCHMARKS } from '@ghostfolio/common/config'; +import { + MAX_CHART_ITEMS, + PROPERTY_BENCHMARKS +} from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { BenchmarkMarketDataDetails, @@ -16,7 +19,6 @@ import { SymbolProfile } from '@prisma/client'; import Big from 'big.js'; import { format } from 'date-fns'; import ms from 'ms'; -import { v4 as uuidv4 } from 'uuid'; @Injectable() export class BenchmarkService { @@ -157,27 +159,38 @@ export class BenchmarkService { }) ]); - marketDataItems.push({ - ...currentSymbolItem, - createdAt: new Date(), - date: new Date(), - id: uuidv4() - }); + const step = Math.round( + marketDataItems.length / Math.min(marketDataItems.length, MAX_CHART_ITEMS) + ); const marketPriceAtStartDate = marketDataItems?.[0]?.marketPrice ?? 0; return { - marketData: marketDataItems.map((marketDataItem) => { - return { - date: format(marketDataItem.date, DATE_FORMAT), + marketData: [ + ...marketDataItems + .filter((marketDataItem, index) => { + return index % step === 0; + }) + .map((marketDataItem) => { + return { + date: format(marketDataItem.date, DATE_FORMAT), + value: + marketPriceAtStartDate === 0 + ? 0 + : this.calculateChangeInPercentage( + marketPriceAtStartDate, + marketDataItem.marketPrice + ) * 100 + }; + }), + { + date: format(new Date(), DATE_FORMAT), value: - marketPriceAtStartDate === 0 - ? 0 - : this.calculateChangeInPercentage( - marketPriceAtStartDate, - marketDataItem.marketPrice - ) * 100 - }; - }) + this.calculateChangeInPercentage( + marketPriceAtStartDate, + currentSymbolItem.marketPrice + ) * 100 + } + ] }; } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 737d7db01..36b7bd48e 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -21,6 +21,7 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation.ser import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; import { ASSET_SUB_CLASS_EMERGENCY_FUND, + MAX_CHART_ITEMS, UNKNOWN_KEY } from '@ghostfolio/common/config'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; @@ -85,7 +86,6 @@ const emergingMarkets = require('../../assets/countries/emerging-markets.json'); @Injectable() export class PortfolioService { - private static readonly MAX_CHART_ITEMS = 250; private baseCurrency: string; public constructor( @@ -387,7 +387,7 @@ export class PortfolioService { const daysInMarket = differenceInDays(new Date(), startDate); const step = Math.round( - daysInMarket / Math.min(daysInMarket, PortfolioService.MAX_CHART_ITEMS) + daysInMarket / Math.min(daysInMarket, MAX_CHART_ITEMS) ); const items = await portfolioCalculator.getChartData( diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index 2d8953058..3574f9b92 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -23,11 +23,7 @@ import { getTextColor, parseDate } from '@ghostfolio/common/helper'; -import { - LineChartItem, - UniqueAsset, - User -} from '@ghostfolio/common/interfaces'; +import { LineChartItem, User } from '@ghostfolio/common/interfaces'; import { DateRange } from '@ghostfolio/common/types'; import { Chart, @@ -215,7 +211,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { locale: this.locale, unit: '%' }), - mode: 'index', + mode: 'x', position: 'top', xAlign: 'center', yAlign: 'bottom' diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index b58ba8b18..6c61e3b04 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -67,6 +67,8 @@ export const GATHER_HISTORICAL_MARKET_DATA_PROCESS_OPTIONS: JobOptions = { } }; +export const MAX_CHART_ITEMS = 365; + export const PROPERTY_BENCHMARKS = 'BENCHMARKS'; export const PROPERTY_COUPONS = 'COUPONS'; export const PROPERTY_CURRENCIES = 'CURRENCIES';