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);
|
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();
|
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||||
return registryImdg.getSingleObjectByPredicate(
|
return registryImdg.getCollectionObjectsByPredicate(
|
||||||
pb.and(
|
pb.and(
|
||||||
RegistryCodeSqlBuilder.getInstance(rgsParam).buildPredicate(pb),
|
RegistryCodeSqlBuilder.getInstance(rgsParam).buildPredicate(pb),
|
||||||
pb.equals("securitySymbol", securitySymbol),
|
pb.equals("securitySymbol", securitySymbol),
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
||||||
import java.math.MathContext;
|
import java.math.MathContext;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.util.Collection;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
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.CalculationResult;
|
||||||
import ru.spcex.clearing.dflt.management.model.FinalCalculationResult;
|
import ru.spcex.clearing.dflt.management.model.FinalCalculationResult;
|
||||||
import ru.spcex.clearing.dflt.management.model.OrderCurrencyContext;
|
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.CurrencyCode;
|
||||||
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
||||||
import ru.spcex.platform.enumeration.SettleCode;
|
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
|
@Service
|
||||||
public class OrderCalculationService {
|
public class OrderCalculationService {
|
||||||
|
|
@ -120,18 +124,18 @@ public class OrderCalculationService {
|
||||||
|
|
||||||
BigDecimal sum1 = planPosition.divide(rateValue, MC).abs();
|
BigDecimal sum1 = planPosition.divide(rateValue, MC).abs();
|
||||||
|
|
||||||
Registry amtRegistry = imdgQueryService.findRegistry(registry, RegistryTradingParams.AM_T, "CNY");
|
Registry am_t = imdgQueryService.findAmtRegistry(registry, "CNY");
|
||||||
Registry omt = imdgQueryService.findRegistry(registry, RegistryTradingParams.OM_T, "CNY");
|
Collection<Registry> om_ts = imdgQueryService.findOTRegistry(registry, RegistryTradingParams.OM_T, "CNY");
|
||||||
Registry tmt = imdgQueryService.findRegistry(registry, RegistryTradingParams.TM_T, "CNY");
|
Collection<Registry> tm_ts = imdgQueryService.findOTRegistry(registry, RegistryTradingParams.TM_T, "CNY");
|
||||||
log.trace("calculation for {}[{}]: {}[{}], {}[{}], {}[{}]",
|
log.trace("calculation for {}[{}]: AM*T[{}], OM*T[{}], TM*T[{}]",
|
||||||
registry.getRegistryCode(),
|
registry.getRegistryCode(),
|
||||||
registry.getId(),
|
registry.getId(),
|
||||||
logRegCode(amtRegistry), logId(amtRegistry),
|
am_t != null ? am_t.getId() : null,
|
||||||
logRegCode(omt), logId(omt),
|
logColl(om_ts, SpcexObjectBase::getId, 10),
|
||||||
logRegCode(tmt), logId(tmt));
|
logColl(tm_ts, SpcexObjectBase::getId, 10));
|
||||||
BigDecimal planPositionCny = amtRegistry.getBalance()
|
BigDecimal planPositionCny = safeBD(am_t, Registry::getBalance)
|
||||||
.subtract(omt.getBalance())
|
.subtract(safeSumBD(om_ts, Registry::getBalance))
|
||||||
.add(tmt.getBalance());
|
.add(safeSumBD(tm_ts, Registry::getBalance));
|
||||||
|
|
||||||
BigDecimal sum2 = planPositionCny.setScale(lotSize, RoundingMode.HALF_DOWN);
|
BigDecimal sum2 = planPositionCny.setScale(lotSize, RoundingMode.HALF_DOWN);
|
||||||
BigDecimal y = sum1.min(sum2);
|
BigDecimal y = sum1.min(sum2);
|
||||||
|
|
@ -149,14 +153,6 @@ public class OrderCalculationService {
|
||||||
return new CalculationResult(sum1, sum2, sum3, sum4, sum5, sum6);
|
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) {
|
private BigDecimal swapPriceCalc(String baseCurrency, BigDecimal s, BigDecimal n, int precision) {
|
||||||
Rates rate = imdgQueryService.getRate(baseCurrency, LocalDate.now());
|
Rates rate = imdgQueryService.getRate(baseCurrency, LocalDate.now());
|
||||||
BigDecimal p = n.divide(BigDecimal.valueOf(365), MC);
|
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;
|
package ru.spcex.platform.utils.number;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
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;
|
import ru.spcex.platform.utils.text.TextUtil;
|
||||||
|
|
||||||
public class BigDecimalUtil {
|
public class BigDecimalUtil {
|
||||||
|
|
||||||
// private final Pattern numberPattern = Pattern.compile("\\d+([.,]\\d+)?");
|
// 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) {
|
public static BigDecimal parse(String number) {
|
||||||
if (TextUtil.isEmpty(number)) {
|
if (TextUtil.isEmpty(number)) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue