Я разработал сервис сопоставления заказов, и он функционирует (промежуточный сервер). Логическая реализация выполнения заказов работает нормально.
Но есть маленькая проблема, которая беспокоила меня и моего коллегу почти месяц. Чтобы объяснить это чуть более подробно, пожалуйста, посмотрите пример книги заказов ниже:
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);