From 6e5cfd8c6adcfea41c5428d9873cf7904f90bc90 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 29 Apr 2026 18:22:46 +0300 Subject: [PATCH] fix calc sum3 --- .../management/model/FinalCalculationResult.java | 3 ++- .../service/OrderCalculationService.java | 16 +++++++++++----- .../service/SwapOvernightOrderService.java | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/FinalCalculationResult.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/FinalCalculationResult.java index 60a8b246b..85844fca4 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/FinalCalculationResult.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/FinalCalculationResult.java @@ -5,6 +5,7 @@ import java.math.BigDecimal; public record FinalCalculationResult( BigDecimal price, BigDecimal rate, - BigDecimal quantityLot + BigDecimal quantityLot, + CalculationResult calculationResult ) { } \ No newline at end of file diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java index 90a37270b..61ae83d20 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java @@ -48,7 +48,7 @@ public class OrderCalculationService { BigDecimal quantityLot = result.sum3().abs(); BigDecimal price = swapPriceCalc(pair.getBaseCurrency(), s, n, listing.getPrecision().intValue()); - return new FinalCalculationResult(price, s, quantityLot); + return new FinalCalculationResult(price, s, quantityLot, result); } public FinalCalculationResult calcAndEnrichSpot(SettleCode settleCode, @@ -76,7 +76,7 @@ public class OrderCalculationService { price = rates.getUnitRate().add(delta).setScale(listing.getPrecision().intValue(), RoundingMode.HALF_UP);; } - return new FinalCalculationResult(price, s, quantityLot); + return new FinalCalculationResult(price, s, quantityLot, result); } private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) { @@ -94,7 +94,8 @@ public class OrderCalculationService { } BigDecimal rateValue = sCrossRates.getUnitRate(); BigDecimal sum2 = planPositionRub.divide(rateValue, lotSize, RoundingMode.HALF_DOWN); - BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING); + //Математическое округление кратное lotSize + BigDecimal sum3 = mathCeil(sum1, lotSize); BigDecimal sum4 = sum3.multiply(rateValue, MC).negate(); BigDecimal sum5 = sum3.negate(); @@ -116,13 +117,14 @@ public class OrderCalculationService { } BigDecimal rateValue = sCrossRates.getUnitRate(); - BigDecimal sum1 = planPosition.divide(rateValue, MC); + BigDecimal sum1 = planPosition.divide(rateValue, MC).abs(); Registry amtRegistry = imdgQueryService.findAmtRegistry(registry, "CNY"); BigDecimal planPositionCny = amtRegistry.getBalance(); BigDecimal sum2 = planPositionCny.setScale(lotSize, RoundingMode.HALF_DOWN); - BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING).min(sum2).negate(); + BigDecimal y = sum1.min(sum2); + BigDecimal sum3 = mathCeil(y, lotSize).negate(); BigDecimal sum4 = sum3.multiply(rateValue, MC).negate(); BigDecimal sum5 = sum3.negate(); @@ -150,4 +152,8 @@ public class OrderCalculationService { private boolean isRub(Registry registry) { return "RUB".equals(registry.getSecuritySymbol()); } + + private BigDecimal mathCeil(BigDecimal val, Integer multiplicity) { + return BigDecimal.valueOf(Math.ceil(val.doubleValue() / multiplicity) * multiplicity); + } } diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java index dd9b5d6e6..8d55b7cb6 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java @@ -61,7 +61,7 @@ public class SwapOvernightOrderService { .build(); FinalCalculationResult finalCalculationResult = swapCalculationService.calcAndEnrichSwap(SettleCode.T1, context); - if (finalCalculationResult.quantityLot().compareTo(BigDecimal.ZERO) > 0) { + if (finalCalculationResult.calculationResult().sum3().compareTo(BigDecimal.ZERO) >= 0) { log.warn("QuantityLot greater than zero; skip forming order currency"); return; }