Exemplo n.º 1
0
 public static AggregatedOrderBookItemBackendContract ToBackendContract(this OrderBookLevel src)
 {
     return(new AggregatedOrderBookItemBackendContract
     {
         Price = src.Price,
         Volume = src.Volume
     });
 }
Exemplo n.º 2
0
        public async Task <OrderBook> GetOrderBook(String productId, OrderBookLevel level = OrderBookLevel.Level1)
        {
            Check.NotNullOrWhiteSpace(productId, nameof(productId));

            var request = new GdaxRequestBuilder($"/products/{productId}/book")
                          .AddParameterIfNotNull("level", ((Int32)level).ToString())
                          .Build();

            return((await this.GetResponse <OrderBook>(request).ConfigureAwait(false)).Value);
        }
        public Task UpdateAsync(string assetPair)
        {
            string exchangeName = _settingsService.GetExchangeName();

            AssetPairModel assetPairSettings = _marketInstrumentService.GetAssetPair(assetPair, exchangeName);

            if (assetPairSettings == null)
            {
                throw new FailedOperationException("Asset pair not found");
            }

            IReadOnlyList <ExternalOrderBook> externalOrderBooks = _externalOrderBookService.GetByAssetPair(assetPair);

            var sellLevels = new Dictionary <decimal, decimal>();

            decimal ask = decimal.MaxValue;

            foreach (ExternalOrderBook externalOrderBook in externalOrderBooks)
            {
                foreach (ExternalOrderBookLevel priceLevel in externalOrderBook.SellLevels)
                {
                    decimal price = priceLevel.Price.TruncateDecimalPlaces(assetPairSettings.PriceAccuracy, true);

                    if (!sellLevels.ContainsKey(price))
                    {
                        sellLevels[price] = 0;
                    }

                    sellLevels[price] += priceLevel.Volume;

                    if (ask > price)
                    {
                        ask = price;
                    }
                }
            }

            var buyLevels = new Dictionary <decimal, decimal>();

            decimal bid = decimal.MinValue;

            foreach (ExternalOrderBook externalOrderBook in externalOrderBooks)
            {
                foreach (ExternalOrderBookLevel priceLevel in externalOrderBook.BuyLevels)
                {
                    decimal price = priceLevel.Price.TruncateDecimalPlaces(assetPairSettings.PriceAccuracy);

                    if (!buyLevels.ContainsKey(price))
                    {
                        buyLevels[price] = 0;
                    }

                    buyLevels[price] += priceLevel.Volume;

                    if (bid < price)
                    {
                        bid = price;
                    }
                }
            }

            if (ask <= bid)
            {
                decimal mid = Math.Round((ask + bid) / 2, assetPairSettings.PriceAccuracy);

                var basisPoint = (decimal)Math.Pow(.1, assetPairSettings.PriceAccuracy);

                ask = mid + basisPoint;

                bid = mid - basisPoint;
            }

            var sellOrderBookLevels = new List <OrderBookLevel>();

            var bestSellLevel = new OrderBookLevel {
                Price = ask
            };

            foreach (var(price, volume) in sellLevels)
            {
                if (price <= ask)
                {
                    bestSellLevel.Volume += volume;
                }
                else
                {
                    sellOrderBookLevels.Add(new OrderBookLevel {
                        Price = price, Volume = volume
                    });
                }
            }

            if (bestSellLevel.Volume > 0)
            {
                sellOrderBookLevels.Add(bestSellLevel);
            }

            var buyOrderBookLevels = new List <OrderBookLevel>();

            var bestBuyLevel = new OrderBookLevel {
                Price = bid
            };

            foreach (var(price, volume) in buyLevels)
            {
                if (price >= bid)
                {
                    bestBuyLevel.Volume += volume;
                }
                else
                {
                    buyOrderBookLevels.Add(new OrderBookLevel {
                        Price = price, Volume = volume
                    });
                }
            }

            if (bestBuyLevel.Volume > 0)
            {
                buyOrderBookLevels.Add(bestBuyLevel);
            }

            var internalOrderBook = new InternalOrderBook
            {
                AssetPair  = assetPairSettings.Name,
                Timestamp  = DateTime.UtcNow,
                SellLevels = sellOrderBookLevels
                             .OrderBy(o => o.Price)
                             .ToList(),
                BuyLevels = buyOrderBookLevels
                            .OrderByDescending(o => o.Price)
                            .ToList()
            };

            _orderBooks.AddOrUpdate(assetPair, internalOrderBook, (key, value) => internalOrderBook);

            return(Task.CompletedTask);
        }
Exemplo n.º 4
0
 private static bool AreEqual(OrderBookLevel a, OrderBookLevel b)
 => a.Price == b.Price && a.Volume == b.Volume;