etreschenkov 2026-04-24 15:45:31 +03:00
parent fd01d2ce3b
commit 8f4f1a1a9a

View file

@ -4,6 +4,8 @@ import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.OrderCurrency;
@ -17,6 +19,7 @@ import ru.spcex.platform.enumeration.SettleCode;
@Service
public class OrderCalculationService {
protected final Logger log = LoggerFactory.getLogger(getClass());
private static final MathContext MC = new MathContext(20, RoundingMode.HALF_UP);
private final ImdgQueryService imdgQueryService;
@ -106,6 +109,9 @@ public class OrderCalculationService {
private CalculationResult calculationRubSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
BigDecimal planPosition = registry.getBalance();
Rates cnyRate = imdgQueryService.getRate(registry.getSecuritySymbol(), LocalDate.now());
if (cnyRate == null) {
throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", registry.getSecuritySymbol()));
}
BigDecimal rateValue = cnyRate.getValue();
BigDecimal sum1 = planPosition.divide(rateValue, MC);
@ -130,10 +136,13 @@ public class OrderCalculationService {
private BigDecimal swapPriceCalc(String baseCurrency, BigDecimal s, BigDecimal n) {
Rates rate = imdgQueryService.getRate(baseCurrency, LocalDate.now());
BigDecimal p = BigDecimal.ONE.divide(n, MC);
log.info("Calculation swap price: {}*{}*{}", s, n, p);
return rate.getValue()
.multiply(s, MC)
.multiply(n, MC)
.divide(BigDecimal.valueOf(365), MC);
.multiply(p, MC)
.setScale(8, RoundingMode.HALF_UP);
}
private boolean isRub(Registry registry) {