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 f73e4c5d3..a1f60d71a 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 @@ -12,6 +12,7 @@ import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.misc.OvernightSettings; +import ru.clearing.classes.statics.data.misc.SCrossRate; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; @@ -41,6 +42,7 @@ public class ImdgQueryService { private final Imdg marketImdg; private final Imdg riskParameterImdg; private final Imdg ratesImdg; + private final Imdg sCrossRateImdg; private final Imdg registryImdg; private final Imdg overnightSettingsImdg; private final Imdg orderCurrencyImdg; @@ -57,6 +59,7 @@ public class ImdgQueryService { this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class); this.riskParameterImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RiskParameter, RiskParameter.class); this.ratesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Rates, Rates.class); + this.sCrossRateImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SCrossRate, SCrossRate.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.overnightSettingsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class); this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); @@ -177,6 +180,16 @@ public class ImdgQueryService { ); } + public SCrossRate getSCrossRates(String currency, LocalDate date) { + ImdgPredicateBuilder pb = sCrossRateImdg.predicateBuilder(); + return sCrossRateImdg.getSingleObjectByPredicate( + pb.and( + pb.equals("currency", currency), + pb.equals("date", date) + ) + ); + } + public BigDecimal defineTransferRate(Long currencyPairDictionaryId, String securitySymbol) { ImdgPredicateBuilder pb = riskParameterImdg.predicateBuilder(); String baseCurrency = "RUB".equals(securitySymbol) ? "CNY" : securitySymbol; 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 b4a237e1c..a7b4b3c27 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 @@ -7,6 +7,7 @@ import java.time.LocalDate; 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; @@ -37,8 +38,8 @@ public class OrderCalculationService { BigDecimal n = transferDateService.numberOfDaysOfTransfer(); CalculationResult result = isRub(registry) - ? calculationSwapRubSums(registry, listing.getLotSize().intValue(), s, n) - : calculationSwapSums(registry, listing.getLotSize().intValue(), s, n); + ? calculationRubSums(registry, listing.getLotSize().intValue(), s, n) + : calculationSums(registry, listing.getLotSize().intValue(), s, n); BigDecimal quantityLot = result.sum3().abs(); BigDecimal price = swapPriceCalc(pair.getBaseCurrency(), s, n); @@ -57,26 +58,26 @@ public class OrderCalculationService { BigDecimal n = transferDateService.numberOfDaysOfTransfer(); CalculationResult result = isRub(registry) - ? calculationSwapRubSums(registry, listing.getLotSize().intValue(), s, n) - : calculationSwapSums(registry, listing.getLotSize().intValue(), s, n); + ? calculationRubSums(registry, listing.getLotSize().intValue(), s, n) + : calculationSums(registry, listing.getLotSize().intValue(), s, n); - Rates rates = imdgQueryService.getRate(pair.getBaseCurrency(), LocalDate.now()); + SCrossRate rates = imdgQueryService.getSCrossRates(pair.getBaseCurrency(), LocalDate.now()); BigDecimal quantityLot; BigDecimal price; if (SettleCode.T0.equalsByKey(order.getSettleCode())) { quantityLot = result.sum3().abs(); - price = rates.getValue(); + price = rates.getUnitRate(); } else { quantityLot = result.sum5().abs(); BigDecimal delta = swapPriceCalc(pair.getBaseCurrency(), s, n); - price = rates.getValue().add(delta); + price = rates.getUnitRate().add(delta); } order.setPrice(price); order.setQuantityLot(quantityLot); } - private CalculationResult calculationSwapSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) { + private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) { BigDecimal planPosition = registry.getBalance(); BigDecimal sum1 = planPosition.abs(); @@ -101,7 +102,7 @@ public class OrderCalculationService { return new CalculationResult(sum1, sum2, sum3, sum4, sum5, sum6); } - private CalculationResult calculationSwapRubSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) { + private CalculationResult calculationRubSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) { BigDecimal planPosition = registry.getBalance(); Rates cnyRate = imdgQueryService.getRate(registry.getSecuritySymbol(), LocalDate.now()); BigDecimal rateValue = cnyRate.getValue();