@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case 3433178: // pair return ((FxRateScenarioArray) bean).getPair(); case 108285843: // rates return ((FxRateScenarioArray) bean).getRates(); } return super.propertyGet(bean, propertyName, quiet); }
private static void assertArraysEqual(FxRateScenarioArray a1, FxRateScenarioArray a2) { assertThat(a1.getScenarioCount()).isEqualTo(a2.getScenarioCount()); assertThat(a1.getPair()).isEqualTo(a2.getPair()); for (int i = 0; i < a1.getScenarioCount(); i++) { assertThat(a1.fxRate(Currency.GBP, Currency.USD, i)).isEqualTo(a2.fxRate(Currency.GBP, Currency.USD, i), offset(TOLERANCE)); } } }
private FxRateScenarioArray computeCross(FxRateScenarioArray other, CurrencyPair crossPairAC) { // aim is to convert AAA/BBB and BBB/CCC to AAA/CCC Currency currA = crossPairAC.getBase(); Currency currC = crossPairAC.getCounter(); // given the conventional cross rate pair, order the two rates to match boolean crossBaseCurrencyInFx1 = pair.contains(currA); FxRateScenarioArray fxABorBA = crossBaseCurrencyInFx1 ? this : other; FxRateScenarioArray fxBCorCB = crossBaseCurrencyInFx1 ? other : this; // extract the rates, taking the inverse if the pair is in the inverse order DoubleArray ratesAB = fxABorBA.getPair().getBase().equals(currA) ? fxABorBA.rates : fxABorBA.rates.map(v -> 1 / v); DoubleArray ratesBC = fxBCorCB.getPair().getCounter().equals(currC) ? fxBCorCB.rates : fxBCorCB.rates.map(v -> 1 / v); return FxRateScenarioArray.of(crossPairAC, ratesAB.multipliedBy(ratesBC)); }
public void getValues() { FxRateScenarioArray rates = FxRateScenarioArray.of(Currency.EUR, Currency.USD, DoubleArray.of(1.07, 1.08, 1.09)); assertThat(rates.getPair()).isEqualTo(CurrencyPair.of(Currency.EUR, Currency.USD)); assertThat(rates.getScenarioCount()).isEqualTo(3); assertThat(rates.get(0)).isEqualTo(FxRate.of(Currency.EUR, Currency.USD, 1.07)); assertThat(rates.get(1)).isEqualTo(FxRate.of(Currency.EUR, Currency.USD, 1.08)); assertThat(rates.get(2)).isEqualTo(FxRate.of(Currency.EUR, Currency.USD, 1.09)); assertThrows(ArrayIndexOutOfBoundsException.class, () -> rates.get(3)); }
@Override public double fxRate(Currency baseCurrency, Currency counterCurrency) { if (baseCurrency.equals(counterCurrency)) { return 1; } if (baseCurrency.equals(rates1.getPair().getBase())) { return rates1.fxRate(baseCurrency, counterCurrency, scenarioIndex); } else if (baseCurrency.equals(rates2.getPair().getBase())) { return rates2.fxRate(baseCurrency, counterCurrency, scenarioIndex); } else { return rates3.fxRate(baseCurrency, counterCurrency, scenarioIndex); } } };