mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.0 KiB
85 lines
2.0 KiB
import { Big } from 'big.js';
|
|
import {
|
|
endOfDay,
|
|
endOfYear,
|
|
max,
|
|
startOfMonth,
|
|
startOfWeek,
|
|
startOfYear,
|
|
subDays,
|
|
subYears
|
|
} from 'date-fns';
|
|
import { isFinite, isNumber } from 'lodash';
|
|
|
|
import { resetHours } from './helper';
|
|
import { DateRange } from './types';
|
|
|
|
export function getAnnualizedPerformancePercent({
|
|
daysInMarket,
|
|
netPerformancePercentage
|
|
}: {
|
|
daysInMarket: number;
|
|
netPerformancePercentage: Big;
|
|
}): Big {
|
|
if (isNumber(daysInMarket) && daysInMarket > 0) {
|
|
const exponent = new Big(365).div(daysInMarket).toNumber();
|
|
const growthFactor = Math.pow(
|
|
netPerformancePercentage.plus(1).toNumber(),
|
|
exponent
|
|
);
|
|
|
|
if (isFinite(growthFactor)) {
|
|
return new Big(growthFactor).minus(1);
|
|
}
|
|
}
|
|
|
|
return new Big(0);
|
|
}
|
|
|
|
export function getIntervalFromDateRange(params: {
|
|
dateRange: DateRange;
|
|
endDate?: Date;
|
|
startDate?: Date;
|
|
}) {
|
|
const { dateRange } = params;
|
|
let endDate = params.endDate ?? endOfDay(new Date());
|
|
let startDate = params.startDate ?? new Date(0);
|
|
|
|
switch (dateRange) {
|
|
case '1d':
|
|
startDate = max([startDate, subDays(resetHours(new Date()), 1)]);
|
|
break;
|
|
case 'mtd':
|
|
startDate = max([
|
|
startDate,
|
|
subDays(startOfMonth(resetHours(new Date())), 1)
|
|
]);
|
|
break;
|
|
case 'wtd':
|
|
startDate = max([
|
|
startDate,
|
|
subDays(startOfWeek(resetHours(new Date()), { weekStartsOn: 1 }), 1)
|
|
]);
|
|
break;
|
|
case 'ytd':
|
|
startDate = max([
|
|
startDate,
|
|
subDays(startOfYear(resetHours(new Date())), 1)
|
|
]);
|
|
break;
|
|
case '1y':
|
|
startDate = max([startDate, subYears(resetHours(new Date()), 1)]);
|
|
break;
|
|
case '5y':
|
|
startDate = max([startDate, subYears(resetHours(new Date()), 5)]);
|
|
break;
|
|
case 'max':
|
|
break;
|
|
default:
|
|
// '2024', '2023', '2022', etc.
|
|
endDate = endOfYear(new Date(dateRange));
|
|
startDate = max([startDate, new Date(dateRange)]);
|
|
}
|
|
|
|
return { endDate, startDate };
|
|
}
|
|
|