@@ -31,7 +31,7 @@ private CrossRateCalculator() {
31
31
* @throws IllegalArgumentException if the 2 fx1 and fx2 do not share a common cross currency or either currencies in the targetPair
32
32
*/
33
33
public static FxRate calculateCross (final CurrencyPair targetPair , final FxRate fx1 , final FxRate fx2 , final int precision ,
34
- final MajorCurrencyRanking ranking ) {
34
+ final int precisionForInverseFxRate , final MajorCurrencyRanking ranking , final int bidRounding , final int askRounding ) {
35
35
final Optional <String > crossCcy = fx1 .getCurrencyPair ().findCommonCcy (fx2 .getCurrencyPair ());
36
36
final String xCcy = crossCcy .orElseThrow (() -> new IllegalArgumentException ("The 2 FXRates do not share a ccy " + fx1 .getCurrencyPair () + " "
37
37
+ fx2 .getCurrencyPair ()));
@@ -55,14 +55,18 @@ public static FxRate calculateCross(final CurrencyPair targetPair, final FxRate
55
55
final FxRate denominatorFx = numeratorFx == fx1 ? fx2 : fx1 ;
56
56
LOG .debug ("CALC {} / {}" , numeratorFx , denominatorFx );
57
57
58
- bid = BigDecimalUtil .divide (precision , numeratorFx .getBid (), denominatorFx .getAsk (), BigDecimal . ROUND_HALF_UP );
59
- ask = BigDecimalUtil .divide (precision , numeratorFx .getAsk (), denominatorFx .getBid (), BigDecimal . ROUND_HALF_UP );
58
+ bid = BigDecimalUtil .divide (precision , numeratorFx .getBid (), denominatorFx .getAsk (), bidRounding );
59
+ ask = BigDecimalUtil .divide (precision , numeratorFx .getAsk (), denominatorFx .getBid (), askRounding );
60
60
} else {
61
61
final boolean inverse = targetPair .getCcy1 ().equals (fx2Ccy2 ) || targetPair .getCcy1 ().equals (fx1Ccy2 );
62
62
LOG .debug ("CALC {} x {}" , fx1 , fx2 );
63
63
if (inverse ) {
64
- ask = BigDecimalUtil .setScale (BigDecimalUtil .inverse (BigDecimalUtil .multiply (fx1 .getBid (), fx2 .getBid ())), precision );
65
- bid = BigDecimalUtil .setScale (BigDecimalUtil .inverse (BigDecimalUtil .multiply (fx1 .getAsk (), fx2 .getAsk ())), precision );
64
+ ask = BigDecimalUtil .setScale (
65
+ BigDecimalUtil .inverse (BigDecimalUtil .multiply (fx1 .getBid (), fx2 .getBid ()), precisionForInverseFxRate , bidRounding ),
66
+ precision );
67
+ bid = BigDecimalUtil .setScale (
68
+ BigDecimalUtil .inverse (BigDecimalUtil .multiply (fx1 .getAsk (), fx2 .getAsk ()), precisionForInverseFxRate , askRounding ),
69
+ precision );
66
70
} else {
67
71
bid = BigDecimalUtil .setScale (BigDecimalUtil .multiply (fx1 .getBid (), fx2 .getBid ()), precision );
68
72
ask = BigDecimalUtil .setScale (BigDecimalUtil .multiply (fx1 .getAsk (), fx2 .getAsk ()), precision );
0 commit comments