ialbert 2026-05-13 13:48:02 +03:00
parent 096a059857
commit 74ff6250e2
4 changed files with 61 additions and 21 deletions

View file

@ -318,9 +318,9 @@ public class ImdgQueryService {
return registryImdg.getSingleObjectByID(id);
}
public Registry findRegistry(Registry pm_t, RegistryTradingParams rgsParam, String securitySymbol) {
public Collection<Registry> findOTRegistry(Registry pm_t, RegistryTradingParams rgsParam, String securitySymbol) {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
return registryImdg.getSingleObjectByPredicate(
return registryImdg.getCollectionObjectsByPredicate(
pb.and(
RegistryCodeSqlBuilder.getInstance(rgsParam).buildPredicate(pb),
pb.equals("securitySymbol", securitySymbol),

View file

@ -4,6 +4,7 @@ import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.Collection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@ -15,10 +16,13 @@ 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.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.SettleCode;
import static ru.spcex.platform.utils.log.LogUtil.logColl;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeSumBD;
@Service
public class OrderCalculationService {
@ -120,18 +124,18 @@ public class OrderCalculationService {
BigDecimal sum1 = planPosition.divide(rateValue, MC).abs();
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 am_t = imdgQueryService.findAmtRegistry(registry, "CNY");
Collection<Registry> om_ts = imdgQueryService.findOTRegistry(registry, RegistryTradingParams.OM_T, "CNY");
Collection<Registry> tm_ts = imdgQueryService.findOTRegistry(registry, RegistryTradingParams.TM_T, "CNY");
log.trace("calculation for {}[{}]: AM*T[{}], OM*T[{}], TM*T[{}]",
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());
am_t != null ? am_t.getId() : null,
logColl(om_ts, SpcexObjectBase::getId, 10),
logColl(tm_ts, SpcexObjectBase::getId, 10));
BigDecimal planPositionCny = safeBD(am_t, Registry::getBalance)
.subtract(safeSumBD(om_ts, Registry::getBalance))
.add(safeSumBD(tm_ts, Registry::getBalance));
BigDecimal sum2 = planPositionCny.setScale(lotSize, RoundingMode.HALF_DOWN);
BigDecimal y = sum1.min(sum2);
@ -149,14 +153,6 @@ 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);

View file

@ -0,0 +1,24 @@
package ru.spcex.platform.utils.log;
import java.util.Collection;
import java.util.function.Function;
import java.util.stream.Collectors;
public class LogUtil {
public static <T> String logColl(Collection<T> objs, Function<T, ?> f, int max) {
String specificMsg = "[too many...]";
if (objs.size() <= max) {
specificMsg = objs
.stream()
.map(f)
.map(obj -> obj != null ? obj.toString() : "null")
.collect(Collectors.joining(", ", "[", "]"));
}
return specificMsg;
}
public static <T> String logColl(Collection<T> objs, Function<T, ?> f) {
return logColl(objs, f, 15);
}
}

View file

@ -1,11 +1,31 @@
package ru.spcex.platform.utils.number;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import ru.spcex.platform.utils.text.TextUtil;
public class BigDecimalUtil {
// private final Pattern numberPattern = Pattern.compile("\\d+([.,]\\d+)?");
public static <T> BigDecimal safeSumBD(Collection<T> objs, Function<T, BigDecimal> map) {
if (objs == null) return BigDecimal.ZERO;
return objs.stream()
.filter(Objects::nonNull)
.map(map)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add)
;
}
public static <T> BigDecimal safeBD(T obj, Function<T, BigDecimal> map) {
return Optional
.ofNullable(obj)
.map(map)
.orElse(BigDecimal.ZERO);
}
public static BigDecimal parse(String number) {
if (TextUtil.isEmpty(number)) {