diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 108699223..5ed265db6 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.23.295.167", + "version": "3.23.295.168", "enums": { @@ -11755,7 +11755,7 @@ } , {"code": "market", - "type": 12,"name": "Код режима торгов","shortname": "Режим торгов","visible": true,"searchable": true,"sortable": true,"link": "market","linkCode": "code" + "type": 12,"name": "Код режима торгов","shortname": "Режим торгов","visible": true,"searchable": true,"sortable": true } , {"code": "status", @@ -11843,7 +11843,7 @@ } , {"code": "market", - "type": 12,"name": "Код режима торгов","shortname": "Режим торгов","link": "market","linkCode": "code","enabled": false,"required": true + "type": 12,"name": "Код режима торгов","shortname": "Режим торгов","enabled": false,"required": true } , {"code": "price", diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index 3a2b87b44..fbc0ce044 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -2729,7 +2729,7 @@ - + @@ -2751,7 +2751,7 @@ - + diff --git a/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql index 8bbec5f24..5546656b4 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql @@ -7,5 +7,6 @@ /* Business objects */ INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1000, 'SCND', 'CURR', 'RUB', 'UVAK', 'Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)', 1, 'Continuous trading mode (foreign currency trading with a Liquidity Provider)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; -INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1001, 'SCSP', 'CURR', 'RUB', 'TVAK', 'Технический режим переговорных сделок для сделок урегулирования', 1, 'Technical negotiated deals mode for settlement') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; -INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1002, 'SCSW', 'CURR', 'RUB', 'TVWK', 'Технический режим витринных переговорных сделок для сделок урегулирования', 1, 'Technical negotiated showcase deals mode for settlement') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; \ No newline at end of file +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1001, 'SCND', 'CURR', 'RUB', 'NVAK', 'Режим анонимных переговорных сделок (торги иностранной валютой с Провайдером ликвидности)', 1, 'Anonimous negotiated deals mode (foreign currency trading with a Liquidity Provider)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (2002, 'SCSP', 'CURR', 'RUB', 'TVAK', 'Технический режим переговорных сделок для сделок урегулирования', 1, 'Technical negotiated deals mode for settlement') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (2003, 'SCSW', 'CURR', 'RUB', 'TVWK', 'Технический режим витринных переговорных сделок для сделок урегулирования', 1, 'Technical negotiated showcase deals mode for settlement') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; \ No newline at end of file diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java index f57e7388e..90a37270b 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java @@ -46,7 +46,7 @@ public class OrderCalculationService { : calculationSums(registry, listing.getLotSize().intValue(), s, n); BigDecimal quantityLot = result.sum3().abs(); - BigDecimal price = swapPriceCalc(pair.getBaseCurrency(), s, n); + BigDecimal price = swapPriceCalc(pair.getBaseCurrency(), s, n, listing.getPrecision().intValue()); return new FinalCalculationResult(price, s, quantityLot); } @@ -69,11 +69,11 @@ public class OrderCalculationService { BigDecimal price; if (SettleCode.T0 == settleCode) { quantityLot = result.sum3().abs(); - price = rates.getUnitRate(); + price = rates.getUnitRate().setScale(listing.getPrecision().intValue(), RoundingMode.HALF_UP); } else { quantityLot = result.sum5().abs(); - BigDecimal delta = swapPriceCalc(pair.getBaseCurrency(), s, n); - price = rates.getUnitRate().add(delta); + BigDecimal delta = swapPriceCalc(pair.getBaseCurrency(), s, n, listing.getPrecision().intValue()); + price = rates.getUnitRate().add(delta).setScale(listing.getPrecision().intValue(), RoundingMode.HALF_UP);; } return new FinalCalculationResult(price, s, quantityLot); @@ -136,7 +136,7 @@ public class OrderCalculationService { return new CalculationResult(sum1, sum2, sum3, sum4, sum5, sum6); } - private BigDecimal swapPriceCalc(String baseCurrency, BigDecimal s, BigDecimal n) { + private BigDecimal swapPriceCalc(String baseCurrency, BigDecimal s, BigDecimal n, int precision) { Rates rate = imdgQueryService.getRate(baseCurrency, LocalDate.now()); BigDecimal p = BigDecimal.ONE.divide(n, MC); log.info("Calculation swap price: {}*{}*{}", s, n, p); @@ -144,7 +144,7 @@ public class OrderCalculationService { .multiply(s, MC) .multiply(n, MC) .multiply(p, MC) - .setScale(8, RoundingMode.HALF_UP); + .setScale(precision, RoundingMode.HALF_UP); } private boolean isRub(Registry registry) { diff --git a/clearing-parent/fix-service/src/main/java/ru/spcex/clearing/fix/quickfix/Application.java b/clearing-parent/fix-service/src/main/java/ru/spcex/clearing/fix/quickfix/Application.java index 5132432e0..a6df06253 100644 --- a/clearing-parent/fix-service/src/main/java/ru/spcex/clearing/fix/quickfix/Application.java +++ b/clearing-parent/fix-service/src/main/java/ru/spcex/clearing/fix/quickfix/Application.java @@ -113,17 +113,10 @@ public class Application extends MessageCracker implements quickfix.Application, ImdgTransaction transaction = imdgProvider.newTransaction(); transaction.beginTransaction(); try { - if (executionReport.isSetField(OrderID.FIELD) && executionReport.isSetField(ExDestination.FIELD) && executionReport.isSetField(TransactTime.FIELD)) { + if (executionReport.isSetField(OrderID.FIELD) && executionReport.isSetField(ExDestination.FIELD) && executionReport.isSetField(TransactTime.FIELD) && executionReport.isSetField(OrdStatus.FIELD)) { OrderID orderId = executionReport.getOrderID(); ExDestination exDestination = (ExDestination) executionReport.getField(new ExDestination()); TransactTime transactTime = executionReport.getTransactTime(); - SecurityID securityID = executionReport.getSecurityID(); - Price price = executionReport.getPrice(); - OrderQty orderQty = executionReport.getOrderQty(); - Account account = executionReport.getAccount(); - Side side = executionReport.getSide(); - Currency currency = executionReport.getCurrency(); - SettlType settlType = executionReport.getSettlType(); OrdStatus ordStatus = executionReport.getOrdStatus(); Pattern orderIdPattern = Pattern.compile("(\\d{6})-([A-Z]+)-(\\d+)"); @@ -145,14 +138,20 @@ public class Application extends MessageCracker implements quickfix.Application, sOrders.setClassCode(exDestination.getValue()); sOrders.setTradeDate(transactTime.getValue().toLocalDate()); - sOrders.setSecCode(securityID.getValue()); - sOrders.setPrice(BigDecimal.valueOf(price.getValue())); - sOrders.setQty(BigDecimal.valueOf(orderQty.getValue())); - sOrders.setAccount(account.getValue()); - sOrders.setSettleCode(settlType.getValue()); - sOrders.setPriceCurrency(currency.getValue()); - sOrders.setState(String.valueOf(ordStatus.getValue())); + if (executionReport.isSetSecurityID()) + sOrders.setSecCode(executionReport.getSecurityID().getValue()); + if (executionReport.isSetPrice()) + sOrders.setPrice(BigDecimal.valueOf(executionReport.getPrice().getValue())); + if (executionReport.isSetOrderQty()) + sOrders.setQty(BigDecimal.valueOf(executionReport.getOrderQty().getValue())); + if (executionReport.isSetAccount()) + sOrders.setAccount(executionReport.getAccount().getValue()); + if (executionReport.isSetSettlType()) + sOrders.setSettleCode(executionReport.getSettlType().getValue()); + if (executionReport.isSetCurrency()) + sOrders.setPriceCurrency(executionReport.getCurrency().getValue()); + sOrders.setState(String.valueOf(ordStatus.getValue())); if (ordStatus.valueEquals(OrdStatus.NEW)) { sOrders.setOrderDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC)); } else if (ordStatus.valueEquals(OrdStatus.CANCELED)) { @@ -161,6 +160,7 @@ public class Application extends MessageCracker implements quickfix.Application, sOrdersImdg.insert(sOrders); } else { + sOrders.setState(String.valueOf(ordStatus.getValue())); if (ordStatus.valueEquals(OrdStatus.NEW)) { sOrders.setOrderDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC)); } else if (ordStatus.valueEquals(OrdStatus.CANCELED)) {