ialbert 2026-05-08 14:56:26 +03:00
parent 84e6395f8a
commit b9cf86bb7a
3 changed files with 13 additions and 42 deletions

View file

@ -27,9 +27,7 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.platform.dictionary.CurrencyPairDictionary; import ru.clearing.platform.dictionary.CurrencyPairDictionary;
import ru.spcex.clearing.dflt.management.component.validation.OrderCurrencyValidationStored; import ru.spcex.clearing.dflt.management.component.validation.OrderCurrencyValidationStored;
import ru.spcex.clearing.dflt.management.config.ValidationConfig;
import ru.spcex.clearing.dflt.management.service.ImdgQueryService; import ru.spcex.clearing.dflt.management.service.ImdgQueryService;
import ru.spcex.clearing.dflt.management.service.TransferDateService;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -69,8 +67,6 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing
private final Function<CommonDeleteRequest, IValidator> orderCompanyDeleteValidator; private final Function<CommonDeleteRequest, IValidator> orderCompanyDeleteValidator;
private final ImdgQueryService imdgQueryService; private final ImdgQueryService imdgQueryService;
private final IMessageResolver msgResolver; private final IMessageResolver msgResolver;
private final ValidationConfig validationConfig;
private final TransferDateService transferDateService;
@Autowired @Autowired
public OrderCurrencyListener(Consumer<String, Object> kafkaQueue, public OrderCurrencyListener(Consumer<String, Object> kafkaQueue,
@ -88,12 +84,11 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing
Function<OrderCurrencyUpdateRequest, IValidator> orderCurrencyUpdateStatusValidator, Function<OrderCurrencyUpdateRequest, IValidator> orderCurrencyUpdateStatusValidator,
Function<CommonDeleteRequest, IValidator> orderCompanyDeleteValidator, Function<CommonDeleteRequest, IValidator> orderCompanyDeleteValidator,
ImdgQueryService imdgQueryService, ImdgQueryService imdgQueryService,
IMessageResolver msgResolver, ValidationConfig validationConfig, TransferDateService transferDateService) { IMessageResolver msgResolver) {
super(kafkaQueue, kafkaProducer); super(kafkaQueue, kafkaProducer);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.overnightSettingsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class); this.overnightSettingsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class);
this.sOrdersImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SOrders, SOrders.class); this.sOrdersImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SOrders, SOrders.class);
this.transferDateService = transferDateService;
this.orderCurrencyUpdateValidator = orderCurrencyUpdateValidator; this.orderCurrencyUpdateValidator = orderCurrencyUpdateValidator;
this.orderCurrencyUpdateStatusValidator = orderCurrencyUpdateStatusValidator; this.orderCurrencyUpdateStatusValidator = orderCurrencyUpdateStatusValidator;
this.overnightTypeUpdateValidator = overnightTypeUpdateValidator; this.overnightTypeUpdateValidator = overnightTypeUpdateValidator;
@ -103,7 +98,6 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing
this.imdgQueryService = imdgQueryService; this.imdgQueryService = imdgQueryService;
this.msgResolver = msgResolver; this.msgResolver = msgResolver;
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
this.validationConfig = validationConfig;
} }
@Override @Override
@ -233,11 +227,7 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing
CurrencyPairDictionary currPairT0 = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listingT0.getSecurityId()); CurrencyPairDictionary currPairT0 = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listingT0.getSecurityId());
SCrossRate rateT0 = imdgQueryService.getSCrossRates(currPairT0.getBaseCurrency(), now); SCrossRate rateT0 = imdgQueryService.getSCrossRates(currPairT0.getBaseCurrency(), now);
CurrencyPairDictionary currPairT1 = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listingT1.getSecurityId()); CurrencyPairDictionary currPairT1 = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listingT1.getSecurityId());
BigDecimal nextWorkDayDelta = transferDateService.numberOfDaysOfTransfer(); SCrossRate rateT1 = imdgQueryService.getSCrossRates(currPairT1.getBaseCurrency(), now);
SCrossRate rateT1 = imdgQueryService.getSCrossRates(
currPairT1.getBaseCurrency(),
now.plusDays(nextWorkDayDelta.longValue())
);
var pair = new Pair<>(orderT0, orderT1); var pair = new Pair<>(orderT0, orderT1);
Pair.forEach(pair, o -> { Pair.forEach(pair, o -> {

View file

@ -32,7 +32,6 @@ import ru.spcex.clearing.dflt.management.service.ImdgQueryService;
import ru.spcex.clearing.dflt.management.service.OrderCurrencyTriExportService; import ru.spcex.clearing.dflt.management.service.OrderCurrencyTriExportService;
import ru.spcex.clearing.dflt.management.service.SpotOvernightOrderService; import ru.spcex.clearing.dflt.management.service.SpotOvernightOrderService;
import ru.spcex.clearing.dflt.management.service.SwapOvernightOrderService; import ru.spcex.clearing.dflt.management.service.SwapOvernightOrderService;
import ru.spcex.clearing.dflt.management.service.TransferDateService;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -45,7 +44,6 @@ import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.OrderStatus; import ru.spcex.platform.enumeration.OrderStatus;
import ru.spcex.platform.enumeration.OvernightType; import ru.spcex.platform.enumeration.OvernightType;
import ru.spcex.platform.enumeration.Priority; import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.SettleCode;
import ru.spcex.platform.enumeration.Task; import ru.spcex.platform.enumeration.Task;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
@ -66,7 +64,6 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
private final Path storagePath; private final Path storagePath;
private final SendOrdersTypes sendOrdersTypes; private final SendOrdersTypes sendOrdersTypes;
private final Charset winCharset = Charset.forName("windows-1251"); private final Charset winCharset = Charset.forName("windows-1251");
private final TransferDateService transferDateService;
@Autowired @Autowired
public TaskListener(Consumer<String, Object> kafkaQueue, public TaskListener(Consumer<String, Object> kafkaQueue,
@ -77,7 +74,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
SpotOvernightOrderService spotOvernightOrderService, SpotOvernightOrderService spotOvernightOrderService,
OrderCurrencyTriExportService orderCurrencyTriExportService, OrderCurrencyTriExportService orderCurrencyTriExportService,
KafkaSender kafkaSender, KafkaSender kafkaSender,
DefaultManagementSettings defaultManagementSettings, TransferDateService transferDateService) { DefaultManagementSettings defaultManagementSettings) {
super(kafkaQueue, kafkaProducer); super(kafkaQueue, kafkaProducer);
this.imdgQueryService = imdgQueryService; this.imdgQueryService = imdgQueryService;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
@ -88,7 +85,6 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
this.kafkaSender = kafkaSender; this.kafkaSender = kafkaSender;
this.storagePath = Path.of(defaultManagementSettings.getFileStoragePath()); this.storagePath = Path.of(defaultManagementSettings.getFileStoragePath());
this.sendOrdersTypes = defaultManagementSettings.getSendOrdersType(); this.sendOrdersTypes = defaultManagementSettings.getSendOrdersType();
this.transferDateService = transferDateService;
} }
@Override @Override
@ -186,12 +182,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
} }
String currency = isRubPmt ? CurrencyCode.CNY.getKey() : pmtRegistry.getSecuritySymbol(); String currency = isRubPmt ? CurrencyCode.CNY.getKey() : pmtRegistry.getSecuritySymbol();
LocalDate rateDate = LocalDate.now(); SCrossRate sCrossRate = imdgQueryService.getSCrossRates(currency, LocalDate.now());
if (SettleCode.T1.equalsByKey(orderCurrency.getSettleCode())) {
BigDecimal workDayDelta = transferDateService.numberOfDaysOfTransfer();
rateDate = rateDate.plusDays(workDayDelta.longValue());
}
SCrossRate sCrossRate = imdgQueryService.getSCrossRates(currency, rateDate);
BigDecimal val = orderCurrency.getQuantityLot() BigDecimal val = orderCurrency.getQuantityLot()
.multiply(orderCurrency.getLotSize()) .multiply(orderCurrency.getLotSize())

View file

@ -42,8 +42,8 @@ public class OrderCalculationService {
BigDecimal n = transferDateService.numberOfDaysOfTransfer(); BigDecimal n = transferDateService.numberOfDaysOfTransfer();
CalculationResult result = isRub(registry) CalculationResult result = isRub(registry)
? calculationRubSums(registry, listing.getLotSize().intValue(), s, n, settleCode) ? calculationRubSums(registry, listing.getLotSize().intValue(), s, n)
: calculationSums(registry, listing.getLotSize().intValue(), s, n, settleCode); : calculationSums(registry, listing.getLotSize().intValue(), s, n);
BigDecimal quantityLot = result.sum3().abs(); BigDecimal quantityLot = result.sum3().abs();
BigDecimal price; BigDecimal price;
@ -66,18 +66,16 @@ public class OrderCalculationService {
BigDecimal n = transferDateService.numberOfDaysOfTransfer(); BigDecimal n = transferDateService.numberOfDaysOfTransfer();
CalculationResult result = isRub(registry) CalculationResult result = isRub(registry)
? calculationRubSums(registry, listing.getLotSize().intValue(), s, n, settleCode) ? calculationRubSums(registry, listing.getLotSize().intValue(), s, n)
: calculationSums(registry, listing.getLotSize().intValue(), s, n, settleCode); : calculationSums(registry, listing.getLotSize().intValue(), s, n);
SCrossRate rates; SCrossRate rates = imdgQueryService.getSCrossRates(pair.getBaseCurrency(), LocalDate.now());
BigDecimal quantityLot; BigDecimal quantityLot;
BigDecimal price; BigDecimal price;
if (SettleCode.T0 == settleCode) { if (SettleCode.T0 == settleCode) {
rates = imdgQueryService.getSCrossRates(pair.getBaseCurrency(), LocalDate.now());
quantityLot = result.sum3().abs(); quantityLot = result.sum3().abs();
price = rates.getUnitRate().setScale(listing.getPrecision().intValue(), RoundingMode.HALF_UP); price = rates.getUnitRate().setScale(listing.getPrecision().intValue(), RoundingMode.HALF_UP);
} else { } else {
rates = imdgQueryService.getSCrossRates(pair.getBaseCurrency(), LocalDate.now().plusDays(n.longValue()));
quantityLot = result.sum5().abs(); quantityLot = result.sum5().abs();
BigDecimal delta = swapPriceCalcT1(pair.getBaseCurrency(), s, n, listing.getPrecision().intValue()); BigDecimal delta = swapPriceCalcT1(pair.getBaseCurrency(), s, n, listing.getPrecision().intValue());
price = rates.getUnitRate().add(delta).setScale(listing.getPrecision().intValue(), RoundingMode.HALF_UP);; price = rates.getUnitRate().add(delta).setScale(listing.getPrecision().intValue(), RoundingMode.HALF_UP);;
@ -86,15 +84,11 @@ public class OrderCalculationService {
return new FinalCalculationResult(price, s, quantityLot, result); return new FinalCalculationResult(price, s, quantityLot, result);
} }
private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n, SettleCode settleCode) { private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
BigDecimal planPosition = registry.getBalance(); BigDecimal planPosition = registry.getBalance();
BigDecimal sum1 = planPosition.abs(); BigDecimal sum1 = planPosition.abs();
LocalDate rateDate = LocalDate.now(); SCrossRate sCrossRates = imdgQueryService.getSCrossRates(registry.getSecuritySymbol(), LocalDate.now());
if (settleCode.equals(SettleCode.T1)) {
rateDate = rateDate.plusDays(n.longValue());
}
SCrossRate sCrossRates = imdgQueryService.getSCrossRates(registry.getSecuritySymbol(), rateDate);
if (sCrossRates == null) { if (sCrossRates == null) {
throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", CurrencyCode.CNY.getKey())); throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", CurrencyCode.CNY.getKey()));
} }
@ -113,13 +107,9 @@ public class OrderCalculationService {
return new CalculationResult(sum1, BigDecimal.ZERO, sum3, sum4, sum5, sum6); return new CalculationResult(sum1, BigDecimal.ZERO, sum3, sum4, sum5, sum6);
} }
private CalculationResult calculationRubSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n, SettleCode settleCode) { private CalculationResult calculationRubSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
BigDecimal planPosition = registry.getBalance(); BigDecimal planPosition = registry.getBalance();
LocalDate rateDate = LocalDate.now(); SCrossRate sCrossRates = imdgQueryService.getSCrossRates(CurrencyCode.CNY.getKey(), LocalDate.now());
if (settleCode.equals(SettleCode.T1)) {
rateDate = rateDate.plusDays(n.longValue());
}
SCrossRate sCrossRates = imdgQueryService.getSCrossRates(CurrencyCode.CNY.getKey(), rateDate);
if (sCrossRates == null) { if (sCrossRates == null) {
throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", CurrencyCode.CNY.getKey())); throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", CurrencyCode.CNY.getKey()));
} }