This commit is contained in:
parent
096a059857
commit
74ff6250e2
4 changed files with 61 additions and 21 deletions
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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)) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue