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)))); }
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); }
public async Task <OrderBook> GetOrderBook(string assetPair) { Domain.OrderBook order = await _fakeExchange.GetOrderBookAsync(assetPair); return(order?.ToModel(await _fakeExchange.GetNameAsync())); }