Последовательность порядка совпадения происходит с Java + Spring + Mongo - PullRequest
1 голос
/ 19 апреля 2019

Я разработал сервис сопоставления заказов, и он функционирует (промежуточный сервер). Логическая реализация выполнения заказов работает нормально.

Но есть маленькая проблема, которая беспокоила меня и моего коллегу почти месяц. Чтобы объяснить это чуть более подробно, пожалуйста, посмотрите пример книги заказов ниже:

    Buy Side
    Qty 1 Price 3
    Qty 1 Price 2
    Qty 1 Price 1

Это существующий ордер на стороне покупки. Теперь, если Продавец приходит и размещает ордер на продажу 3 Кол-во @ Цена 1 / - все три ордера на покупку должны исполниться.

Эта функциональность работает отлично. Проблема в последовательности выполнения. В идеале код должен сначала соответствовать заказу с ценой 3, затем 2, а затем 1.

Но это выполняется в обратном порядке. Из-за этого последние цены также ошибаются, как и Чистые изменения, и Чистый% роста. Эта последовательность влияет на множество мест.

Невозможно опубликовать весь код, поэтому я публикую часть кода, которая, как я предполагаю, имеет проблему.

    if (matchOrderRequest.getOrderType() == OrderType.BUY) {
    optionalMatchOrder=orderRepository.findTopByMarketAndOrderTypeAndPriceLessThanEqualOrderByPriceAscTimestampAsc(request.getMarket(), OrderType.SELL, request.getPrice());
    } 

    else {

    optionalMatchOrder = 
    orderRepository.findTopByMarketAndOrderTypeAndPriceGreaterThanEqualOrderByPriceDescTimestampAsc(request.getMarket(),OrderType.BUY,request.getPrice());

    }

    if (optionalMatchOrder.isPresent()) {

    executedOrder.setOrderId(request.getOrderId());

Хранилище заказов (Mongo Query):

    import org.springframework.data.domain.Sort;
    import org.springframework.data.repository.CrudRepository;
    import org.springframework.stereotype.Repository;
    import org.springframework.transaction.annotation.Transactional;

    import java.math.BigDecimal;
    import java.util.Optional;

    @Repository
    public interface OrderRepository extends CrudRepository<MatchOrder, Long> {


Optional<MatchOrder> findTopByMarketAndOrderTypeAndPriceGreaterThanEqualOrderByPriceAscTimestampAsc(Market market, OrderType orderType, BigDecimal bigDecimal);


Optional<MatchOrder> findTopByMarketAndOrderTypeAndPriceGreaterThanEqualOrderByPriceDescTimestampAsc(Market market, OrderType orderType, BigDecimal bigDecimal);
...