etreschenkov 2026-04-17 15:56:54 +03:00
parent 5c20cde107
commit 8d1797eb4b
2 changed files with 23 additions and 9 deletions

View file

@ -12,6 +12,7 @@ import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.Market;
import ru.clearing.classes.statics.data.misc.OrderCurrency;
import ru.clearing.classes.statics.data.misc.OvernightSettings;
import ru.clearing.classes.statics.data.misc.SCrossRate;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
@ -41,6 +42,7 @@ public class ImdgQueryService {
private final Imdg<Market> marketImdg;
private final Imdg<RiskParameter> riskParameterImdg;
private final Imdg<Rates> ratesImdg;
private final Imdg<SCrossRate> sCrossRateImdg;
private final Imdg<Registry> registryImdg;
private final Imdg<OvernightSettings> overnightSettingsImdg;
private final Imdg<OrderCurrency> orderCurrencyImdg;
@ -57,6 +59,7 @@ public class ImdgQueryService {
this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class);
this.riskParameterImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RiskParameter, RiskParameter.class);
this.ratesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Rates, Rates.class);
this.sCrossRateImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SCrossRate, SCrossRate.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.overnightSettingsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class);
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
@ -177,6 +180,16 @@ public class ImdgQueryService {
);
}
public SCrossRate getSCrossRates(String currency, LocalDate date) {
ImdgPredicateBuilder pb = sCrossRateImdg.predicateBuilder();
return sCrossRateImdg.getSingleObjectByPredicate(
pb.and(
pb.equals("currency", currency),
pb.equals("date", date)
)
);
}
public BigDecimal defineTransferRate(Long currencyPairDictionaryId, String securitySymbol) {
ImdgPredicateBuilder pb = riskParameterImdg.predicateBuilder();
String baseCurrency = "RUB".equals(securitySymbol) ? "CNY" : securitySymbol;

View file

@ -7,6 +7,7 @@ import java.time.LocalDate;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.OrderCurrency;
import ru.clearing.classes.statics.data.misc.SCrossRate;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.Rates;
import ru.clearing.platform.dictionary.CurrencyPairDictionary;
@ -37,8 +38,8 @@ public class OrderCalculationService {
BigDecimal n = transferDateService.numberOfDaysOfTransfer();
CalculationResult result = isRub(registry)
? calculationSwapRubSums(registry, listing.getLotSize().intValue(), s, n)
: calculationSwapSums(registry, listing.getLotSize().intValue(), s, n);
? calculationRubSums(registry, listing.getLotSize().intValue(), s, n)
: calculationSums(registry, listing.getLotSize().intValue(), s, n);
BigDecimal quantityLot = result.sum3().abs();
BigDecimal price = swapPriceCalc(pair.getBaseCurrency(), s, n);
@ -57,26 +58,26 @@ public class OrderCalculationService {
BigDecimal n = transferDateService.numberOfDaysOfTransfer();
CalculationResult result = isRub(registry)
? calculationSwapRubSums(registry, listing.getLotSize().intValue(), s, n)
: calculationSwapSums(registry, listing.getLotSize().intValue(), s, n);
? calculationRubSums(registry, listing.getLotSize().intValue(), s, n)
: calculationSums(registry, listing.getLotSize().intValue(), s, n);
Rates rates = imdgQueryService.getRate(pair.getBaseCurrency(), LocalDate.now());
SCrossRate rates = imdgQueryService.getSCrossRates(pair.getBaseCurrency(), LocalDate.now());
BigDecimal quantityLot;
BigDecimal price;
if (SettleCode.T0.equalsByKey(order.getSettleCode())) {
quantityLot = result.sum3().abs();
price = rates.getValue();
price = rates.getUnitRate();
} else {
quantityLot = result.sum5().abs();
BigDecimal delta = swapPriceCalc(pair.getBaseCurrency(), s, n);
price = rates.getValue().add(delta);
price = rates.getUnitRate().add(delta);
}
order.setPrice(price);
order.setQuantityLot(quantityLot);
}
private CalculationResult calculationSwapSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
BigDecimal planPosition = registry.getBalance();
BigDecimal sum1 = planPosition.abs();
@ -101,7 +102,7 @@ public class OrderCalculationService {
return new CalculationResult(sum1, sum2, sum3, sum4, sum5, sum6);
}
private CalculationResult calculationSwapRubSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
private CalculationResult calculationRubSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
BigDecimal planPosition = registry.getBalance();
Rates cnyRate = imdgQueryService.getRate(registry.getSecuritySymbol(), LocalDate.now());
BigDecimal rateValue = cnyRate.getValue();