fix calc sum3

This commit is contained in:
etreschenkov 2026-04-29 18:22:46 +03:00
parent 2a8fbad2dc
commit 6e5cfd8c6a
3 changed files with 14 additions and 7 deletions

View file

@ -5,6 +5,7 @@ import java.math.BigDecimal;
public record FinalCalculationResult(
BigDecimal price,
BigDecimal rate,
BigDecimal quantityLot
BigDecimal quantityLot,
CalculationResult calculationResult
) {
}

View file

@ -48,7 +48,7 @@ public class OrderCalculationService {
BigDecimal quantityLot = result.sum3().abs();
BigDecimal price = swapPriceCalc(pair.getBaseCurrency(), s, n, listing.getPrecision().intValue());
return new FinalCalculationResult(price, s, quantityLot);
return new FinalCalculationResult(price, s, quantityLot, result);
}
public FinalCalculationResult calcAndEnrichSpot(SettleCode settleCode,
@ -76,7 +76,7 @@ public class OrderCalculationService {
price = rates.getUnitRate().add(delta).setScale(listing.getPrecision().intValue(), RoundingMode.HALF_UP);;
}
return new FinalCalculationResult(price, s, quantityLot);
return new FinalCalculationResult(price, s, quantityLot, result);
}
private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
@ -94,7 +94,8 @@ public class OrderCalculationService {
}
BigDecimal rateValue = sCrossRates.getUnitRate();
BigDecimal sum2 = planPositionRub.divide(rateValue, lotSize, RoundingMode.HALF_DOWN);
BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING);
//Математическое округление кратное lotSize
BigDecimal sum3 = mathCeil(sum1, lotSize);
BigDecimal sum4 = sum3.multiply(rateValue, MC).negate();
BigDecimal sum5 = sum3.negate();
@ -116,13 +117,14 @@ public class OrderCalculationService {
}
BigDecimal rateValue = sCrossRates.getUnitRate();
BigDecimal sum1 = planPosition.divide(rateValue, MC);
BigDecimal sum1 = planPosition.divide(rateValue, MC).abs();
Registry amtRegistry = imdgQueryService.findAmtRegistry(registry, "CNY");
BigDecimal planPositionCny = amtRegistry.getBalance();
BigDecimal sum2 = planPositionCny.setScale(lotSize, RoundingMode.HALF_DOWN);
BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING).min(sum2).negate();
BigDecimal y = sum1.min(sum2);
BigDecimal sum3 = mathCeil(y, lotSize).negate();
BigDecimal sum4 = sum3.multiply(rateValue, MC).negate();
BigDecimal sum5 = sum3.negate();
@ -150,4 +152,8 @@ public class OrderCalculationService {
private boolean isRub(Registry registry) {
return "RUB".equals(registry.getSecuritySymbol());
}
private BigDecimal mathCeil(BigDecimal val, Integer multiplicity) {
return BigDecimal.valueOf(Math.ceil(val.doubleValue() / multiplicity) * multiplicity);
}
}

View file

@ -61,7 +61,7 @@ public class SwapOvernightOrderService {
.build();
FinalCalculationResult finalCalculationResult = swapCalculationService.calcAndEnrichSwap(SettleCode.T1, context);
if (finalCalculationResult.quantityLot().compareTo(BigDecimal.ZERO) > 0) {
if (finalCalculationResult.calculationResult().sum3().compareTo(BigDecimal.ZERO) >= 0) {
log.warn("QuantityLot greater than zero; skip forming order currency");
return;
}