etreschenkov 2026-04-30 13:47:20 +03:00
parent 34b0b4c097
commit cabc01ca06
3 changed files with 17 additions and 11 deletions

View file

@ -83,18 +83,11 @@ public class OrderCalculationService {
BigDecimal planPosition = registry.getBalance();
BigDecimal sum1 = planPosition.abs();
Registry rubRegistry = imdgQueryService.findAmtRegistry(registry, "RUB");
BigDecimal planPositionRub = rubRegistry.getBalance();
Rates rates = imdgQueryService.getRate(registry.getSecuritySymbol(), LocalDate.now());
SCrossRate sCrossRates = imdgQueryService.getSCrossRates(registry.getSecuritySymbol(), LocalDate.now());
if (sCrossRates == null) {
throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", CurrencyCode.CNY.getKey()));
}
BigDecimal rateValue = sCrossRates.getUnitRate();
BigDecimal sum2 = planPositionRub.divide(rateValue, lotSize, RoundingMode.HALF_DOWN);
//Математическое округление кратное lotSize
BigDecimal sum3 = mathCeil(sum1, lotSize);
BigDecimal sum4 = sum3.multiply(rateValue, MC).negate();
BigDecimal sum5 = sum3.negate();
@ -106,7 +99,7 @@ public class OrderCalculationService {
BigDecimal sum6 = sum3.multiply(rateValue, MC).multiply(multiplier, MC);
return new CalculationResult(sum1, sum2, 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) {
@ -154,6 +147,6 @@ public class OrderCalculationService {
}
private BigDecimal mathCeil(BigDecimal val, Integer multiplicity) {
return BigDecimal.valueOf(Math.ceil(val.doubleValue() / multiplicity) * multiplicity);
return BigDecimal.valueOf(Math.ceil(val.doubleValue() / multiplicity));
}
}

View file

@ -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;
@ -12,11 +13,13 @@ 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;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.OvernightType;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.SettleCode;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IEnumKey;
@Service
public class SpotOvernightOrderService {
@ -47,6 +50,7 @@ public class SpotOvernightOrderService {
CounterpartyInfo categoryP = imdgQueryService.getCompanyByClearingCategory("P");
CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC);
CounterpartyInfo rgcm = imdgQueryService.getCompanyByRole(CompanyRole.RGCM);
CurrencyCode currency = IEnumKey.getEnumByKey(CurrencyCode.class, registry.getSecuritySymbol());
OrderCurrencyContext context = OrderCurrencyContext.builder()
.registry(registry)
@ -61,6 +65,12 @@ public class SpotOvernightOrderService {
FinalCalculationResult finalCalculationResultT0 = swapCalculationService.calcAndEnrichSpot(SettleCode.T0, context);
FinalCalculationResult finalCalculationResultT1 = swapCalculationService.calcAndEnrichSpot(SettleCode.T1, context);
if (CurrencyCode.RUB == currency &&
finalCalculationResultT0.calculationResult().sum3().compareTo(BigDecimal.ZERO) >= 0) {
log.warn("QuantityLot greater than zero; skip forming order currency");
return;
}
OrderCurrency primaryTransferT0 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T0, finalCalculationResultT0);
OrderCurrency counterTransferT0 = templateBuilder.buildCounterTransfer(context, SettleCode.T0, finalCalculationResultT0);
OrderCurrency primaryTransferT1 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1, finalCalculationResultT1);

View file

@ -13,11 +13,13 @@ 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;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.OvernightType;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.SettleCode;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IEnumKey;
@Service
public class SwapOvernightOrderService {
@ -48,7 +50,7 @@ public class SwapOvernightOrderService {
CounterpartyInfo categoryP = imdgQueryService.getCompanyByClearingCategory("P");
CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC);
CounterpartyInfo rgcm = imdgQueryService.getCompanyByRole(CompanyRole.RGCM);
CurrencyCode currency = IEnumKey.getEnumByKey(CurrencyCode.class, registry.getSecuritySymbol());
OrderCurrencyContext context = OrderCurrencyContext.builder()
.registry(registry)
.orderCategory(orderCategory)
@ -61,7 +63,8 @@ public class SwapOvernightOrderService {
.build();
FinalCalculationResult finalCalculationResult = swapCalculationService.calcAndEnrichSwap(SettleCode.T1, context);
if (finalCalculationResult.calculationResult().sum3().compareTo(BigDecimal.ZERO) >= 0) {
if (CurrencyCode.RUB == currency &&
finalCalculationResult.calculationResult().sum3().compareTo(BigDecimal.ZERO) >= 0) {
log.warn("QuantityLot greater than zero; skip forming order currency");
return;
}