public static OrderBook ToModel(this Domain.OrderBook orderBook, string exchangeName)
 {
     return(new OrderBook(exchangeName,
                          orderBook.Pair,
                          DateTime.UtcNow,
                          orderBook.Asks.Select(x => new OrderBookItem(x.Price, x.RemainingVolume)),
                          orderBook.Bids.Select(x => new OrderBookItem(x.Price, x.RemainingVolume))));
 }
Esempio n. 2
0
        public Task PublishAsync(Domain.OrderBook orderBook)
        {
            IEnumerable <OrderBookItem> sellOrderBookItems = orderBook.LimitOrders
                                                             .Where(o => o.Type == Domain.LimitOrderType.Sell)
                                                             .OrderBy(o => o.Price)
                                                             .Select(o => new OrderBookItem(o.Price, o.Volume));

            IEnumerable <OrderBookItem> buyOrderBookItems = orderBook.LimitOrders
                                                            .Where(o => o.Type == Domain.LimitOrderType.Buy)
                                                            .OrderByDescending(o => o.Price)
                                                            .Select(o => new OrderBookItem(o.Price, o.Volume));

            return(_publisher.ProduceAsync(new OrderBook($"LiquidityEngine{_instanceName}", orderBook.AssetPairId,
                                                         orderBook.Time, sellOrderBookItems, buyOrderBookItems)));
        }
        public async Task PublishAsync(string exchangeName, Domain.OrderBook orderBook)
        {
            var message = new OrderBook(
                exchangeName,
                orderBook.Pair,
                DateTime.UtcNow,
                orderBook.Asks.Select(x => new OrderBookItem(x.Price, x.RemainingVolume)),
                orderBook.Bids.Select(x => new OrderBookItem(x.Price, x.RemainingVolume)));

            if (message.AskLevels.IsEmpty && message.BidLevels.IsEmpty)
            {
                return;
            }

            await _publisher.ProduceAsync(message);
        }
        private async Task ProcessMessageAsync(OrderBook orderBook)
        {
            // workaround for Lykke production
            var internalAssetPair = orderBook.Asset.Replace("EOS", "EOScoin");

            var now = DateTime.UtcNow;

            //_log.Info("B2C2 Order Book handled.", new
            //{
            //    AssetPairId = orderBook.Asset,
            //    OrderBookTimestamp = orderBook.Timestamp,
            //    Now = now,
            //    Latency = (now - orderBook.Timestamp).TotalMilliseconds
            //});

            PrometheusMetrics.B2C2OrderBookLatency.Inc((now - orderBook.Timestamp).TotalMilliseconds);

            var sellLimitOrders = orderBook.Asks.Select(o => new Domain.LimitOrder
            {
                Price  = o.Price,
                Volume = o.Volume,
                Type   = Domain.LimitOrderType.Sell
            });

            var buyLimitOrders = orderBook.Bids.Select(o => new Domain.LimitOrder
            {
                Price  = o.Price,
                Volume = o.Volume,
                Type   = Domain.LimitOrderType.Buy
            });

            var newOrderBook = new Domain.OrderBook
            {
                AssetPairId = internalAssetPair,
                Time        = orderBook.Timestamp,
                LimitOrders = sellLimitOrders.Concat(buyLimitOrders).ToArray()
            };

            await _b2C2OrderBookService.SetAsync(newOrderBook);

            await _marketMakerService.UpdateOrderBooksAsync(newOrderBook.AssetPairId);
        }
Esempio n. 5
0
        public async Task <OrderBook> GetOrderBook(string assetPair)
        {
            Domain.OrderBook order = await _fakeExchange.GetOrderBookAsync(assetPair);

            return(order?.ToModel(await _fakeExchange.GetNameAsync()));
        }