diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java index 05468783f..91590fd68 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java @@ -151,7 +151,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean { kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, newReq); } - log.info("SDOR export and send command to fix, request={}", req); + log.info("export to tri..."); try { Collection orders = imdgQueryService.getClccOrderCurrencyIds(); String content = orderCurrencyTriExportService.exportToTri(orders); @@ -159,6 +159,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean { LocalDateTime.now().format(formatter))); Files.writeString(fileName, content, StandardCharsets.UTF_8); if (SendOrdersTypes.FIX == sendOrdersTypes) { + log.info("send command to fix service..."); kafkaSender.sendRequestToQueue(Consts.SDOR_FIX_TASK, req.getRequestPayload()); } } catch (IOException e) { 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 new file mode 100644 index 000000000..60a8b246b --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/FinalCalculationResult.java @@ -0,0 +1,10 @@ +package ru.spcex.clearing.dflt.management.model; + +import java.math.BigDecimal; + +public record FinalCalculationResult( + BigDecimal price, + BigDecimal rate, + BigDecimal quantityLot +) { +} \ No newline at end of file diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java index e6da65351..e400d01ea 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java @@ -209,7 +209,6 @@ public class ImdgQueryService { public BigDecimal defineTransferRate(Long currencyPairDictionaryId, String securitySymbol) { ImdgPredicateBuilder pb = riskParameterImdg.predicateBuilder(); boolean isRub = "RUB".equals(securitySymbol); - String baseCurrency = isRub ? "CNY" : securitySymbol; RiskParameter riskParameter = riskParameterImdg.getSingleObjectByPredicate( pb.and( @@ -217,7 +216,7 @@ public class ImdgQueryService { pb.equals("currencyPairId", currencyPairDictionaryId) ) ); - return isRub ? riskParameter.getQuoteValue() : riskParameter.getValue(); + return isRub ? riskParameter.getQuoteValue() : riskParameter.getPenaltyValue(); } public CurrencyPairDictionary getCurrencyPairDictionaryBySecurityId(Long securityId) { 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 af5d89260..f57e7388e 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 @@ -8,12 +8,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.misc.Listing; -import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.misc.SCrossRate; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.Rates; import ru.clearing.platform.dictionary.CurrencyPairDictionary; import ru.spcex.clearing.dflt.management.model.CalculationResult; +import ru.spcex.clearing.dflt.management.model.FinalCalculationResult; import ru.spcex.clearing.dflt.management.model.OrderCurrencyContext; import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.SettleCode; @@ -32,10 +32,10 @@ public class OrderCalculationService { this.transferDateService = transferDateService; } - public void calcAndEnrichSwap(OrderCurrency order, + public FinalCalculationResult calcAndEnrichSwap(SettleCode settleCode, OrderCurrencyContext context) { Registry registry = context.getRegistry(); - Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), order.getSettleCode()); + Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), settleCode.getKey()); CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId()); BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol()); @@ -48,15 +48,13 @@ public class OrderCalculationService { BigDecimal quantityLot = result.sum3().abs(); BigDecimal price = swapPriceCalc(pair.getBaseCurrency(), s, n); - order.setPrice(price); - order.setQuantityLot(quantityLot); - order.setRate(s); + return new FinalCalculationResult(price, s, quantityLot); } - public void calcAndEnrichSpot(OrderCurrency order, - OrderCurrencyContext context) { + public FinalCalculationResult calcAndEnrichSpot(SettleCode settleCode, + OrderCurrencyContext context) { Registry registry = context.getRegistry(); - Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), order.getSettleCode()); + Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), settleCode.getKey()); CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId()); BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol()); @@ -69,7 +67,7 @@ public class OrderCalculationService { SCrossRate rates = imdgQueryService.getSCrossRates(pair.getBaseCurrency(), LocalDate.now()); BigDecimal quantityLot; BigDecimal price; - if (SettleCode.T0.equalsByKey(order.getSettleCode())) { + if (SettleCode.T0 == settleCode) { quantityLot = result.sum3().abs(); price = rates.getUnitRate(); } else { @@ -78,9 +76,7 @@ public class OrderCalculationService { price = rates.getUnitRate().add(delta); } - order.setPrice(price); - order.setQuantityLot(quantityLot); - order.setRate(s); + return new FinalCalculationResult(price, s, quantityLot); } private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) { diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java index 03faf6e79..bbc744c44 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java @@ -7,6 +7,7 @@ import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; +import ru.spcex.clearing.dflt.management.model.FinalCalculationResult; import ru.spcex.clearing.dflt.management.model.OrderCurrencyContext; import ru.spcex.platform.enumeration.SettleCode; import static ru.spcex.platform.enumeration.SettleCode.T0; @@ -20,7 +21,9 @@ public class OrderTemplateBuilder { this.imdgQueryService = imdgQueryService; } - public OrderCurrency buildPrimaryTransfer(OrderCurrencyContext context, SettleCode settleCode) { + public OrderCurrency buildPrimaryTransfer(OrderCurrencyContext context, + SettleCode settleCode, + FinalCalculationResult finalCalculationResult) { OrderCurrency orderCurrency; switch (context.getOrderCategory()) { case "PL" -> orderCurrency = buildPrimaryTransferPl(context); @@ -28,11 +31,13 @@ public class OrderTemplateBuilder { default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory()); } Side side = resolvePrimaryTransferSide(context.getRegistry(), settleCode); - enrichOrder(orderCurrency, context, side, "overnight", settleCode); + enrichOrder(orderCurrency, context, side, "overnight", settleCode, finalCalculationResult); return orderCurrency; } - public OrderCurrency buildCounterTransfer(OrderCurrencyContext context, SettleCode settleCode) { + public OrderCurrency buildCounterTransfer(OrderCurrencyContext context, + SettleCode settleCode, + FinalCalculationResult finalCalculationResult) { OrderCurrency orderCurrency; switch (context.getOrderCategory()) { case "PL" -> orderCurrency = buildCounterTransferPl(context); @@ -41,11 +46,13 @@ public class OrderTemplateBuilder { } ; Side side = resolveCounterTransferSide(context.getRegistry(), settleCode); - enrichOrder(orderCurrency, context, side, "overnight", settleCode); + enrichOrder(orderCurrency, context, side, "overnight", settleCode, finalCalculationResult); return orderCurrency; } - public OrderCurrency buildPrimaryBalancing(OrderCurrencyContext context, SettleCode settleCode) { + public OrderCurrency buildPrimaryBalancing(OrderCurrencyContext context, + SettleCode settleCode, + FinalCalculationResult finalCalculationResult) { OrderCurrency orderCurrency; switch (context.getOrderCategory()) { case "PL" -> orderCurrency = buildPrimaryBalancingPl(context); @@ -54,11 +61,13 @@ public class OrderTemplateBuilder { } ; Side side = resolvePrimaryBalancingSide(context.getRegistry(), settleCode); - enrichOrder(orderCurrency, context, side, "balance", settleCode); + enrichOrder(orderCurrency, context, side, "balance", settleCode, finalCalculationResult); return orderCurrency; } - public OrderCurrency buildCounterBalancing(OrderCurrencyContext context, SettleCode settleCode) { + public OrderCurrency buildCounterBalancing(OrderCurrencyContext context, + SettleCode settleCode, + FinalCalculationResult finalCalculationResult) { OrderCurrency orderCurrency; switch (context.getOrderCategory()) { case "PL" -> orderCurrency = buildCounterBalancingPl(context); @@ -67,7 +76,7 @@ public class OrderTemplateBuilder { } ; Side side = resolveCounterBalancingSide(context.getRegistry(), settleCode); - enrichOrder(orderCurrency, context, side, "balance", settleCode); + enrichOrder(orderCurrency, context, side, "balance", settleCode, finalCalculationResult); return orderCurrency; } @@ -195,7 +204,8 @@ public class OrderTemplateBuilder { OrderCurrencyContext context, Side side, String comment, - SettleCode settleCode) { + SettleCode settleCode, + FinalCalculationResult finalCalculationResult) { Registry registry = context.getRegistry(); Market market = context.getMarket(); Listing listing = imdgQueryService.findListing(registry, market.getCode(), settleCode.getKey()); @@ -212,6 +222,10 @@ public class OrderTemplateBuilder { order.setComment(comment); order.setRegistryId(registry.getId()); order.setCreated(Instant.now()); + + order.setPrice(finalCalculationResult.price()); + order.setQuantityLot(finalCalculationResult.quantityLot()); + order.setRate(finalCalculationResult.rate()); } public Side resolvePrimaryTransferSide(Registry registry, SettleCode settleCode) { diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java index 9b9991915..e7bb83d53 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java @@ -8,6 +8,7 @@ import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.RiskParameter; import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; +import ru.spcex.clearing.dflt.management.model.FinalCalculationResult; import ru.spcex.clearing.dflt.management.model.OrderCurrencyContext; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.CompanyRole; @@ -58,25 +59,17 @@ public class SpotOvernightOrderService { .overnightType(OvernightType.SPOT) .build(); - OrderCurrency primaryTransferT0 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T0); - OrderCurrency counterTransferT0 = templateBuilder.buildCounterTransfer(context, SettleCode.T0); - OrderCurrency primaryTransferT1 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1); - OrderCurrency counterTransferT1 = templateBuilder.buildCounterTransfer(context, SettleCode.T1); + FinalCalculationResult finalCalculationResultT0 = swapCalculationService.calcAndEnrichSpot(SettleCode.T0, context); + FinalCalculationResult finalCalculationResultT1 = swapCalculationService.calcAndEnrichSpot(SettleCode.T1, context); + OrderCurrency primaryTransferT0 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T0, finalCalculationResultT0); + OrderCurrency counterTransferT0 = templateBuilder.buildCounterTransfer(context, SettleCode.T0, finalCalculationResultT0); + OrderCurrency primaryTransferT1 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1, finalCalculationResultT1); + OrderCurrency counterTransferT1 = templateBuilder.buildCounterTransfer(context, SettleCode.T1, finalCalculationResultT1); - OrderCurrency primaryBalancingT0 = templateBuilder.buildPrimaryBalancing(context, SettleCode.T0); - OrderCurrency counterBalancingT0 = templateBuilder.buildCounterBalancing(context, SettleCode.T0); - OrderCurrency primaryBalancingT1 = templateBuilder.buildPrimaryBalancing(context, SettleCode.T1); - OrderCurrency counterBalancingT1 = templateBuilder.buildCounterBalancing(context, SettleCode.T1); - - swapCalculationService.calcAndEnrichSpot(primaryTransferT0, context); - swapCalculationService.calcAndEnrichSpot(counterTransferT0, context); - swapCalculationService.calcAndEnrichSpot(primaryTransferT1, context); - swapCalculationService.calcAndEnrichSpot(counterTransferT1, context); - - swapCalculationService.calcAndEnrichSpot(primaryBalancingT0, context); - swapCalculationService.calcAndEnrichSpot(counterBalancingT0, context); - swapCalculationService.calcAndEnrichSpot(primaryBalancingT1, context); - swapCalculationService.calcAndEnrichSpot(counterBalancingT1, context); + OrderCurrency primaryBalancingT0 = templateBuilder.buildPrimaryBalancing(context, SettleCode.T0, finalCalculationResultT0); + OrderCurrency counterBalancingT0 = templateBuilder.buildCounterBalancing(context, SettleCode.T0, finalCalculationResultT0); + OrderCurrency primaryBalancingT1 = templateBuilder.buildPrimaryBalancing(context, SettleCode.T1, finalCalculationResultT1); + OrderCurrency counterBalancingT1 = templateBuilder.buildCounterBalancing(context, SettleCode.T1, finalCalculationResultT1); orderCurrencyImdg.insert(primaryTransferT0); orderCurrencyImdg.insert(counterTransferT0); 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 67f95849c..dd9b5d6e6 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 @@ -1,5 +1,6 @@ package ru.spcex.clearing.dflt.management.service; +import java.math.BigDecimal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -8,6 +9,7 @@ import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.RiskParameter; import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; +import ru.spcex.clearing.dflt.management.model.FinalCalculationResult; import ru.spcex.clearing.dflt.management.model.OrderCurrencyContext; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.CompanyRole; @@ -58,15 +60,16 @@ public class SwapOvernightOrderService { .overnightType(OvernightType.SWAP) .build(); - OrderCurrency primaryTransfer = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1); - OrderCurrency counterTransfer = templateBuilder.buildCounterTransfer(context, SettleCode.T1); - OrderCurrency primaryBalancing = templateBuilder.buildPrimaryBalancing(context, SettleCode.T1); - OrderCurrency counterBalancing = templateBuilder.buildCounterBalancing(context, SettleCode.T1); + FinalCalculationResult finalCalculationResult = swapCalculationService.calcAndEnrichSwap(SettleCode.T1, context); + if (finalCalculationResult.quantityLot().compareTo(BigDecimal.ZERO) > 0) { + log.warn("QuantityLot greater than zero; skip forming order currency"); + return; + } - swapCalculationService.calcAndEnrichSwap(primaryTransfer, context); - swapCalculationService.calcAndEnrichSwap(counterTransfer, context); - swapCalculationService.calcAndEnrichSwap(primaryBalancing, context); - swapCalculationService.calcAndEnrichSwap(counterBalancing, context); + OrderCurrency primaryTransfer = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1, finalCalculationResult); + OrderCurrency counterTransfer = templateBuilder.buildCounterTransfer(context, SettleCode.T1, finalCalculationResult); + OrderCurrency primaryBalancing = templateBuilder.buildPrimaryBalancing(context, SettleCode.T1, finalCalculationResult); + OrderCurrency counterBalancing = templateBuilder.buildCounterBalancing(context, SettleCode.T1, finalCalculationResult); orderCurrencyImdg.insert(primaryTransfer); orderCurrencyImdg.insert(counterTransfer);