All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.scalecube.examples.orderbook.service.DefaultMarketDataService Maven / Gradle / Ivy

package io.scalecube.examples.orderbook.service;

import io.scalecube.examples.orderbook.service.api.MarketDataService;
import io.scalecube.examples.orderbook.service.engine.OrderBooks;
import io.scalecube.examples.orderbook.service.engine.events.Side;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;


public class DefaultMarketDataService implements MarketDataService {

  OrderBooks books;
  List instumentList = new ArrayList<>();
  AtomicLong lastTrade = new AtomicLong();
  Map view = new ConcurrentHashMap<>();
  Market market = new Market(new MarketListener() {
    @Override
    public void update(OrderBook book, boolean bbo) {
      System.out.println(book);
    }

    @Override
    public void trade(OrderBook book, Side side, long price, long size) {
      System.out.println(book);
    }
  });

  public DefaultMarketDataService() {
    instumentList.add("ORCL");
    books = new OrderBooks(instumentList);
    OrderBook marketBook = market.open(1l);
    view.put(1l, marketBook);
    books.listenAdd("ORCL").subscribe(add -> {
      market.execute(add.orderId(), add.quantity(), add.price());
    });

    books.listenMatch("ORCL").subscribe(match -> {
      if (match.remainingQuantity() == 0) {
        market.delete(match.incomingOrderId());
      } else {
        market.execute(match.incomingOrderId(), match.executedQuantity(), match.price());
      }
    });
  }


  @Override
  public Mono processOrder(OrderRequest request) {

    books.enterOrder(request.order(), request.instrument());
    market.add(1l,
        request.order().id(),
        request.order().level().side(),
        request.order().level().price(),
        request.order().size());
    return Mono.just("OK");
  }

  @Override
  public Flux orderBook() {

    return Flux.interval(Duration.ofSeconds(1))
        .map(mapper -> new OrderBookSnapshoot(
            view.get(1l),
            lastTrade.get()));
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy