private void Dispatch(OrderBookModel orderBookModel) { Asks.Clear(); Bids.Clear(); int count = orderBookModel.Asks.Count; int takeCount = 100; orderBookModel.Asks.Skip(count - takeCount).Take(takeCount).ToList().ForEach(x => Asks.Add(new OrderBookEntry { Amount = x.Amount, DateTime = x.DateTime, Price = x.Price, GroupedPrice = x.GroupedPrice, GroupedVolume = x.GroupedVolume })); orderBookModel.Bids.Take(100).ToList().ForEach(x => Bids.Add(new OrderBookEntry { Amount = x.Amount, DateTime = x.DateTime, Price = x.Price, GroupedPrice = x.GroupedPrice, GroupedVolume = x.GroupedVolume })); }
/// <summary> /// Get orderbook for specify markets. /// </summary> /// <param name="crypto"></param> /// <param name="fiat"></param> /// <returns></returns> public OrderBookModel OrderBook(CryptoCurrency crypto, FiatCurrency fiat) { IRestRequest req = new RestRequest($"/stats/orderbook_{crypto.ToString().ToLower()}{fiat.ToString().ToLower()}.json"); string response = client.Execute(req).Content; OrderBookModel orderbook = JsonConvert.DeserializeObject <OrderBookModel>(response); return(orderbook); }
public OrderBookModel Transform() { var firstOrderBook = OrderBooks.Values.First(); var asks = new List <OrderBookEntryModel>(); var bids = new List <OrderBookEntryModel>(); firstOrderBook.Asks.ForEach(x => asks.Add(x.Transform())); firstOrderBook.Bids.ForEach(x => bids.Add(x.Transform())); var result = new OrderBookModel { Asks = new List <OrderBookEntryModel>(asks), Bids = new List <OrderBookEntryModel>(bids) }; return(result); }
/// <summary> /// Parses the data from source to datapoints. /// </summary> /// <param name="data">The data.</param> /// <param name="ticker">Associated ticker</param> /// <returns></returns> public DataPointImpl[] ParseData(string data, string ticker = "") { //Initial items DepthModel depthupdate = null; TradeModel treadeupdate = null; OrderBookModel orderbookupdate = null; var toreturn = new List <DataPointImpl>(); data = data.Replace(",[]", ""); //Convert models if (data.Contains("depthUpdate")) { depthupdate = JSON.Deserialize <DepthModel>(data); } else if (data.Contains("aggTrade")) { treadeupdate = JSON.Deserialize <TradeModel>(data); } else if (data.Contains("lastUpdateId")) { //Check if this contains additional data if (data.Contains("|")) { var splitted = data.Split('|'); ticker = splitted[0]; data = splitted[1]; } //Parse data orderbookupdate = JSON.Deserialize <OrderBookModel>(data); } //Full update order book if (orderbookupdate != null && !string.IsNullOrWhiteSpace(ticker)) { //Check data if (!_orderbook.TryGetValue(ticker, out var orderbook)) { //Set order book instance orderbook = new OrderBook(ticker); _orderbook[ticker] = orderbook; } //Helper function void UpdateBook(bool isBid, PriceModel x) => orderbook.AddQuote(isBid, x.DoubleValue, x.DoubleSize); //Clear and refresh orderbook.Clear(); orderbookupdate.Asks.ForEach(u => UpdateBook(false, u)); orderbookupdate.Bids.ForEach(u => UpdateBook(true, u)); } //Update order book else if (depthupdate != null) { //Check data if (!_orderbook.TryGetValue(ticker, out var orderbook)) { //Set order book instance orderbook = new OrderBook(ticker); _orderbook[ticker] = orderbook; } //DateTime occured DateTime occuredutc = Time.FromUnixTime(depthupdate.EventTime, true); //Check for quote updates in the order book (size == 0 = remove from order book) bool update = depthupdate.AskPricesModel.Count(x => orderbook.AddQuote(false, x.DoubleValue, x.DoubleSize)) > 0; update = depthupdate.BidPricesModel.Count(x => orderbook.AddQuote(true, x.DoubleValue, x.DoubleSize)) > 0 | update; //Check for full quote update if (update) { toreturn.Add(new Tick(GetQuantlerTicker(depthupdate.Symbol), DataSource) { AskSize = Convert.ToDecimal(orderbook.AskSize), AskPrice = Convert.ToDecimal(orderbook.BestAsk), BidPrice = Convert.ToDecimal(orderbook.BestBid), BidSize = Convert.ToDecimal(orderbook.BidSize), Depth = 0, Occured = occuredutc, TimeZone = TimeZone.Utc }); } } //Send trade else if (treadeupdate != null) { //DateTime occured DateTime occuredutc = Time.FromUnixTime(treadeupdate.EventTime, true); toreturn.Add(new Tick(GetQuantlerTicker(treadeupdate.Symbol), DataSource) { TradePrice = decimal.Parse(treadeupdate.Price, NumberStyles.Any, new CultureInfo("en-US")), Size = decimal.Parse(treadeupdate.Quantity, NumberStyles.Any, new CultureInfo("en-US")), Occured = occuredutc, TimeZone = TimeZone.Utc }); } //Return what we have return(toreturn.ToArray()); }
private void GroupEntries(OrderBookModel model) { GroupEntries(model.Asks, true); GroupEntries(model.Bids, false); }