ialbert 2026-05-12 19:49:42 +03:00
parent f8c8f92401
commit 4afb58f140
2 changed files with 41 additions and 2 deletions

View file

@ -26,11 +26,13 @@ import ru.spcex.platform.enumeration.CompanyRole;
import ru.spcex.platform.enumeration.MarketType;
import ru.spcex.platform.enumeration.OrderStatus;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
@Service
public class ImdgQueryService {
@ -316,6 +318,23 @@ public class ImdgQueryService {
return registryImdg.getSingleObjectByID(id);
}
public Registry findRegistry(Registry pm_t, RegistryTradingParams rgsParam, String securitySymbol) {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
return registryImdg.getSingleObjectByPredicate(
pb.and(
RegistryCodeSqlBuilder.getInstance(rgsParam).buildPredicate(pb),
pb.equals("securitySymbol", securitySymbol),
pb.or(
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
pb.equals("registryStatus", RegistryStatus.MNG.getKey())
),
pb.equals("tradingClearingRegistryId", pm_t.getTradingClearingRegistryId()),
pb.equals("companyId", pm_t.getCompanyId()),
pb.equals("settlementDate", LocalDate.now())
)
);
}
public Registry findAmtRegistry(Registry registry, String securitySymbol) {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
return registryImdg.getSingleObjectByPredicate(

View file

@ -15,7 +15,9 @@ 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.classes.base.interfaces.WithId;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.SettleCode;
@Service
@ -117,8 +119,18 @@ public class OrderCalculationService {
BigDecimal sum1 = planPosition.divide(rateValue, MC).abs();
Registry amtRegistry = imdgQueryService.findAmtRegistry(registry, "CNY");
BigDecimal planPositionCny = amtRegistry.getBalance();
Registry amtRegistry = imdgQueryService.findRegistry(registry, RegistryTradingParams.AM_T, "CNY");
Registry omt = imdgQueryService.findRegistry(registry, RegistryTradingParams.OM_T, "CNY");
Registry tmt = imdgQueryService.findRegistry(registry, RegistryTradingParams.TM_T, "CNY");
log.trace("calculation for {}[{}]: {}[{}], {}[{}], {}[{}]",
registry.getRegistryCode(),
registry.getId(),
logRegCode(amtRegistry), logId(amtRegistry),
logRegCode(omt), logId(omt),
logRegCode(tmt), logId(tmt));
BigDecimal planPositionCny = amtRegistry.getBalance()
.subtract(omt.getBalance())
.add(tmt.getBalance());
BigDecimal sum2 = planPositionCny.setScale(lotSize, RoundingMode.HALF_DOWN);
BigDecimal y = sum1.min(sum2);
@ -136,6 +148,14 @@ public class OrderCalculationService {
return new CalculationResult(sum1, sum2, sum3, sum4, sum5, sum6);
}
private String logId(WithId obj) {
return obj != null ? String.valueOf(obj.getId()) : "null";
}
private String logRegCode(Registry obj) {
return obj != null ? String.valueOf(obj.getRegistryCode()) : "null";
}
private BigDecimal swapPriceCalc(String baseCurrency, BigDecimal s, BigDecimal n, int precision) {
Rates rate = imdgQueryService.getRate(baseCurrency, LocalDate.now());
BigDecimal p = n.divide(BigDecimal.valueOf(365), MC);