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; }
private ExchangeEntryRate createExchangeEntryRate(ExchangeType exchangeType) { return new ExchangeEntryRate( new Date(), exchangeType ); }
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); }); }
private boolean checkIfExchangeIsPresent(List<ExchangeAggregateRate> rates, ExchangeType exchangeType) { return rates.stream().anyMatch((aggregateRate) -> { return aggregateRate.getExchangeEntryRates().stream().anyMatch((entry) -> { return entry.getExchangeType() == exchangeType; }); }); }
ExchangeEntryRate exchangeEntryRate = new ExchangeEntryRate(new Date(), enabledExchange);
private ExchangeAggregateRate createExchangeAggregateRateWithMultipleExchangeEntry(ExchangeType... exchangeTypes) { ExchangeAggregateRate aggregateRate = createExchangeAggregateRate(); Arrays.asList(exchangeTypes).stream().forEach((type) -> { ExchangeEntryRate entryRate = createExchangeEntryRate(type); ExchangeCurrencyRate rateBTC = createExchangeCurrencyRate(CurrencyType.BTC); ExchangeCurrencyRate rateETH = createExchangeCurrencyRate(CurrencyType.ETH); entryRate.addCurrencyRate(rateBTC); entryRate.addCurrencyRate(rateETH); aggregateRate.addExchangeEntry(entryRate); }); ExchangeAggregateCurrencyRate aggregateCurrencyRateBTC = createExchangeAggregateCurrencyRate( CurrencyType.BTC, aggregateRate.getAllExchangeCurrencyRates(CurrencyType.BTC)); ExchangeAggregateCurrencyRate aggregateCurrencyRateETH = createExchangeAggregateCurrencyRate( CurrencyType.ETH, aggregateRate.getAllExchangeCurrencyRates(CurrencyType.ETH)); aggregateRate.addExchangeAggregateCurrencyRate(aggregateCurrencyRateBTC); aggregateRate.addExchangeAggregateCurrencyRate(aggregateCurrencyRateETH); aggregateRateRepository.save(aggregateRate); return aggregateRate; }
@Test public void testFindBlockNrBtcGreaterThan_HavingMultipleExchanges() { createExchangeAggregateRateWithMultipleExchangeEntry(ExchangeType.BITSTAMP, ExchangeType.KRAKEN); Optional<ExchangeAggregateRate> optionalAggregateRate = aggregateRateRepository .findFirstOptionalByBlockNrBtcLessThanEqualOrderByBlockNrBtcDesc(new Long(1)); assertTrue(optionalAggregateRate.filter((aggRate) -> aggRate.getExchangeEntryRates().stream() .anyMatch((exRate) -> exRate.getExchangeType() == ExchangeType.BITSTAMP) ).isPresent() ); assertTrue(optionalAggregateRate.filter((aggRate) -> aggRate.getExchangeEntryRates().stream() .anyMatch((exRate) -> exRate.getExchangeType() == ExchangeType.KRAKEN) ).isPresent() ); assertTrue(optionalAggregateRate.filter((aggRate) -> aggRate.getExchangeAggregateCurrencyRates().stream() .anyMatch((aggregateCurrencyRate) -> aggregateCurrencyRate.getCurrencyType() == CurrencyType.BTC) ).isPresent() ); assertTrue(optionalAggregateRate.filter((aggRate) -> aggRate.getExchangeAggregateCurrencyRates().stream() .anyMatch((aggregateCurrencyRate) -> aggregateCurrencyRate.getCurrencyType() == CurrencyType.ETH) ).isPresent() ); }
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; }); }); }); }
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()); }