public List<ExchangeCurrencyRate> getAllExchangeCurrencyRates(CurrencyType currencyType) { List<ExchangeCurrencyRate> allExchangeCurrencyRates = new ArrayList<>(); getExchangeEntryRates().stream().forEach((exchangeEntryRate) -> { allExchangeCurrencyRates.addAll(exchangeEntryRate.getExchangeCurrencyRates() .stream() .filter((currencyRate) -> currencyRate.getCurrencyType() == currencyType) .collect(Collectors.toList()) ); }); return allExchangeCurrencyRates; }
protected ExchangeEntryRate getRateFromHistoricalProviderFromAllSupportedCurrencies(Instant timestamp) { List<CurrencyType> enabledCryptoCurrencies = ratesAppConfigHolder.getEnabledCryptoCurrencies(); ExchangeEntryRate exchangeEntryRate = new ExchangeEntryRate(Date.from(Instant.now()), ExchangeType.CRYPTOCOMPARE); // for each enabled crypto currency enabledCryptoCurrencies.stream().forEach((enabledCryptoCurrency) -> { // get rate from the historical provider getRateFromHistoricalProvider(enabledCryptoCurrency, timestamp) // if the rate could be fetched, then create a new ExchangeCurrencyRate object .map((v) -> new ExchangeCurrencyRate(enabledCryptoCurrency, v)) // and, if present, add to the ExchangeEntryRate object .ifPresent((currencyRate) -> exchangeEntryRate.addCurrencyRate(currencyRate)); }); return exchangeEntryRate; }
public BigDecimal removeOutliersAndGetMean(List<ExchangeCurrencyRate> allExchangeCurrencyRates) { List<Double> data = allExchangeCurrencyRates.stream().map((value) -> value.getExchangeRate().doubleValue()).collect(Collectors.toList()); OutlierCalculation outlierCalculation = new OutlierCalculation( data.stream().mapToDouble((value) -> value.doubleValue()).toArray(), ratesAppConfig.getOutlierStdDevThresholdLowerBound(), ratesAppConfig.getOutlierStdDevThresholdUpperBound()); double[] upperBoundOutlierValues = outlierCalculation.findUpperBoundOutlierValues(); double[] lowerBoundOutlierValues = outlierCalculation.findLowerBoundOutlierValues(); data.removeAll(Arrays.asList(upperBoundOutlierValues)); data.removeAll(Arrays.asList(lowerBoundOutlierValues)); return getMean(data); }
private boolean checkIfCurrencyIsPresent(List<ExchangeAggregateRate> rates, CurrencyType currencyType) { return rates.stream().anyMatch((aggregateRate) -> { return aggregateRate.getExchangeEntryRates().stream().anyMatch((entry) -> { return entry.getExchangeCurrencyRates().stream().anyMatch((currency) -> { return currency.getCurrencyType() == currencyType; }); }); }); }
private ExchangeCurrencyRate createExchangeCurrencyRate(CurrencyType currencyType) { return new ExchangeCurrencyRate(currencyType, new BigDecimal(123.45)); }
private ExchangeAggregateCurrencyRate createExchangeAggregateCurrencyRate(CurrencyType currencyType, List<ExchangeCurrencyRate> currencyRates) { Mean mean = new Mean(); double[] rateDoubles = currencyRates.stream().mapToDouble((value) -> value.getExchangeRate().doubleValue()).toArray(); double meanValue = mean.evaluate(rateDoubles, 0, rateDoubles.length); return new ExchangeAggregateCurrencyRate(currencyType, new BigDecimal(meanValue)); } }
protected Optional<BigDecimal> getRateFromHistoricalProviderAndSaveToDB(CurrencyType currencyType, Instant timestamp) { ExchangeEntryRate exchangeEntryRate = getRateFromHistoricalProviderFromAllSupportedCurrencies(timestamp); // create the aggregation object ExchangeAggregateRate aggregateRate = new ExchangeAggregateRate(Date.from(Instant.now()), blockNrProviderService.getCurrentBlockNrEthereum(), blockNrProviderService.getCurrentBlockNrBitcoin()); aggregateRate.addExchangeEntry(exchangeEntryRate); if (exchangeEntryRate.getExchangeCurrencyRates() != null && !exchangeEntryRate.getExchangeCurrencyRates().isEmpty()) { exchangeEntryRate.getExchangeCurrencyRates().stream() .filter(distinctByKey(ExchangeCurrencyRate::getCurrencyType)) .forEach((entry) -> { // get all "ExchangeCurrencyRate" objects of distinct crypto currencies List<ExchangeCurrencyRate> allExchangeCurrencyRates = aggregateRate.getAllExchangeCurrencyRates(entry.getCurrencyType()); // remove outliers and get the mean BigDecimal mean = aggregationService.removeOutliersAndGetMean(allExchangeCurrencyRates); // create a new aggregate currency ExchangeAggregateCurrencyRate aggCurrencyRate = new ExchangeAggregateCurrencyRate(entry.getCurrencyType(), mean); // add to the top-level "ExchangeAggregateRate" aggregateRate.addExchangeAggregateCurrencyRate(aggCurrencyRate); }); // save to DB exchangeAggregateRateRepository.save(aggregateRate); } return aggregateRate.getExchangeAggregateCurrencyRates(currencyType) .map((aggregateObj) -> aggregateObj.getAggregateExchangeRate()); }
private void getRateAndAddCurrencyRate(ExchangeEntryRate exchangeEntryRate, ExchangeType exchangeType, CurrencyType cryptoType, CurrencyType fiatType) { Optional<BigDecimal> oRate = getRate(exchangeType, new CurrencyPair(Currency.getInstance(cryptoType.toString()), convertCurrencyTypes(fiatType))); oRate.ifPresent((rate) -> { ExchangeCurrencyRate exchangeCurrencyRate = new ExchangeCurrencyRate(cryptoType, rate); exchangeEntryRate.addCurrencyRate(exchangeCurrencyRate); }); }