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

View file

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