import { PortfolioPosition } from 'apps/api/src/app/portfolio/interfaces/portfolio-position.interface'; import { ExchangeRateDataService } from 'apps/api/src/services/exchange-rate-data.service'; import { Rule } from '../../rule'; export class CurrencyClusterRiskInitialInvestment extends Rule { public constructor(public exchangeRateDataService: ExchangeRateDataService) { super(exchangeRateDataService, { name: 'Initial Investment' }); } public evaluate( aPositions: { [symbol: string]: PortfolioPosition }, aFees: number, aRuleSettingsMap?: { [key: string]: any; } ) { const ruleSettings = aRuleSettingsMap[CurrencyClusterRiskInitialInvestment.name]; const positionsGroupedByCurrency = this.groupPositionsByAttribute( aPositions, 'currency', ruleSettings.baseCurrency ); let maxItem = positionsGroupedByCurrency[0]; let totalInvestment = 0; positionsGroupedByCurrency.forEach((groupItem) => { // Calculate total investment totalInvestment += groupItem.investment; // Find maximum if (groupItem.investment > maxItem.investment) { maxItem = groupItem; } }); const maxInvestmentRatio = maxItem.investment / totalInvestment; if (maxInvestmentRatio > ruleSettings.threshold) { return { evaluation: `Over ${ ruleSettings.threshold * 100 }% of your initial investment is in ${maxItem.groupKey} (${( maxInvestmentRatio * 100 ).toPrecision(3)}%)`, value: false }; } return { evaluation: `The major part of your initial investment is in ${ maxItem.groupKey } (${(maxInvestmentRatio * 100).toPrecision(3)}%) and does not exceed ${ ruleSettings.threshold * 100 }%`, value: true }; } }