public void ApplyIncrementalUpdate(OrderBookEntryType type, OrderBookUpdateType updateType, long id, string rateString, string amountString) { if (type == OrderBookEntryType.Ask) { lock (Asks) { ApplyIncrementalUpdate(id, updateType, rateString, amountString, Asks, true); } if (AllowInvertedAsks) { lock (AsksInverted) { ApplyIncrementalUpdate(id, updateType, rateString, amountString, AsksInverted, false); } } } else { lock (Bids) { ApplyIncrementalUpdate(id, updateType, rateString, amountString, Bids, false); } } LastUpdateTime = DateTime.Now; if (UpdateCount > 0) { return; } UpdateEntries(); RaiseOnChanged(new IncrementalUpdateInfo()); }
protected override void OnOrderBookSocketMessageReceived(object sender, MessageReceivedEventArgs e) { base.OnOrderBookSocketMessageReceived(sender, e); LastWebSocketRecvTime = DateTime.Now; SocketConnectionInfo info = OrderBookSockets[(WebSocket)sender]; JObject obj = JsonConvert.DeserializeObject <JObject>(e.Message); JArray items = obj.Value <JArray>("data"); if (items == null) { return; } OrderBookUpdateType type = String2UpdateType(obj.Value <string>("action")); foreach (JObject item in items) { Ticker t = info.Ticker; OrderBookEntryType entryType = item.Value <string>("side")[0] == 'S' ? OrderBookEntryType.Ask : OrderBookEntryType.Bid; string rate = type == OrderBookUpdateType.Add ? item.Value <string>("price") : null; string size = type != OrderBookUpdateType.Remove ? item.Value <string>("size") : null; t.OrderBook.ApplyIncrementalUpdate(entryType, type, item.Value <long>("id"), rate, size); } }
public void GetOrderBook(PoloniexTicker ticker, int depth) { string address = string.Format("https://poloniex.com/public?command=returnOrderBook¤cyPair={0}&depth={1}", Uri.EscapeDataString(ticker.CurrencyPair), depth); string text; using (WebClient client = new WebClient()) { text = client.DownloadString(address); } ticker.OrderBook.Bids.Clear(); ticker.OrderBook.Asks.Clear(); JObject res = (JObject)JsonConvert.DeserializeObject(text); foreach (JProperty prop in res.Children()) { if (prop.Name == "asks" || prop.Name == "bids") { OrderBookEntryType type = prop.Name == "asks" ? OrderBookEntryType.Ask : OrderBookEntryType.Bid; JArray items = prop.Value.ToObject <JArray>(); foreach (JArray item in items.Children()) { OrderBookUpdateInfo info = new OrderBookUpdateInfo(); info.Type = prop.Name == "asks" ? OrderBookEntryType.Ask : OrderBookEntryType.Bid; info.Entry = new OrderBookEntry(); info.Action = OrderBookUpdateType.Modify; JEnumerable <JToken> values = (JEnumerable <JToken>)item.Children(); JValue rateValue = (JValue)values.First(); info.Entry.Value = rateValue.ToObject <double>(); info.Entry.Amount = rateValue.Next.ToObject <double>(); if (type == OrderBookEntryType.Ask) { ticker.OrderBook.ForceAddAsk(info); } else { ticker.OrderBook.ForceAddBid(info); } } } else if (prop.Name == "seq") { ticker.OrderBook.SeqNumber = prop.Value.ToObject <int>(); Console.WriteLine("Snapshot seq no = " + ticker.OrderBook.SeqNumber); } else if (prop.Name == "isFrozen") { ticker.IsFrozen = prop.Value.ToObject <int>() == 0; } } ticker.OrderBook.ApplyQueueUpdates(); }
public void ApplyIncrementalUpdate(OrderBookEntryType type, OrderBookUpdateType updateType, long id, string rateString, string amountString) { if (type == OrderBookEntryType.Ask) { ApplyIncrementalUpdate(id, updateType, rateString, amountString, Asks, true); ApplyIncrementalUpdate(id, updateType, rateString, amountString, AsksInverted, false); } else { ApplyIncrementalUpdate(id, updateType, rateString, amountString, Bids, false); } UpdateEntries(); RaiseOnChanged(new IncrementalUpdateInfo()); }
/// <summary> /// Converts the order book entry type into order book frame. /// </summary> /// <param name="type">Order book entry type.</param> /// <returns>Order book frame.</returns> public static OrderBookFrame ConvertFrame(OrderBookEntryType type) { switch (type) { case OrderBookEntryType.NewEntry: return(OrderBookFrame.Create); case OrderBookEntryType.UpdateEntry: return(OrderBookFrame.Update); case OrderBookEntryType.RemoveEntry: return(OrderBookFrame.Remove); default: throw new ArgumentException($"Unsupported order book entry type '{type}'.", nameof(type)); } }
public void ApplyIncrementalUpdate(OrderBookEntryType type, string rateString, string amountString) { if (type == OrderBookEntryType.Ask) { ApplyIncrementalUpdate(rateString, amountString, Asks, true); if (AllowInvertedAsks) { ApplyIncrementalUpdate(rateString, amountString, AsksInverted, false); } } else { ApplyIncrementalUpdate(rateString, amountString, Bids, false); } if (UpdateCount > 0) { return; } UpdateEntries(); RaiseOnChanged(new IncrementalUpdateInfo()); }
protected internal override void OnOrderBookSocketMessageReceived(object sender, MessageReceivedEventArgs e) { base.OnOrderBookSocketMessageReceived(sender, e); LastWebSocketRecvTime = DateTime.Now; SocketConnectionInfo info = OrderBookSockets.FirstOrDefault(c => c.Key == sender); if (info == null) { return; } Ticker t = info.Ticker; if (t.CaptureData) { t.CaptureDataCore(CaptureStreamType.OrderBook, CaptureMessageType.Incremental, e.Message); } const string incrementalUpdateStartString = "{\"table\":\"orderBookL2\",\"action\":\""; if (e.Message.StartsWith(incrementalUpdateStartString)) { int index = incrementalUpdateStartString.Length; if (e.Message[index] == 'u') // update { index = e.Message.IndexOf("[{"); List <string[]> jsItems = JSonHelper.Default.DeserializeArrayOfObjects(Encoding.ASCII.GetBytes(e.Message), ref index, UpdateItems); foreach (string[] item in jsItems) { OrderBookEntryType entryType = item[2][0] == 'S' ? OrderBookEntryType.Ask : OrderBookEntryType.Bid; t.OrderBook.ApplyIncrementalUpdate(entryType, OrderBookUpdateType.Modify, FastValueConverter.ConvertPositiveLong(item[1]), null, item[3]); } return; } //else if(e.Message[index] == 'i') { // insert // index = e.Message.IndexOf("[{"); // List<string[]> jsItems = JSonHelper.Default.DeserializeArrayOfObjects(Encoding.ASCII.GetBytes(e.Message), ref index, InsertItems); // foreach(string[] item in jsItems) { // OrderBookEntryType entryType = item[2][0] == 'S' ? OrderBookEntryType.Ask : OrderBookEntryType.Bid; // t.OrderBook.ApplyIncrementalUpdate(entryType, OrderBookUpdateType.Add, FastValueConverter.ConvertPositiveLong(item[1]), item[4], item[3]); // } // return; //} else if (e.Message[index] == 'd') // delete { index = e.Message.IndexOf("[{"); List <string[]> jsItems = JSonHelper.Default.DeserializeArrayOfObjects(Encoding.ASCII.GetBytes(e.Message), ref index, DeleteItems); foreach (string[] item in jsItems) { OrderBookEntryType entryType = item[2][0] == 'S' ? OrderBookEntryType.Ask : OrderBookEntryType.Bid; t.OrderBook.ApplyIncrementalUpdate(entryType, OrderBookUpdateType.Remove, FastValueConverter.ConvertPositiveLong(item[1]), null, null); } return; } } JObject obj = JsonConvert.DeserializeObject <JObject>(e.Message); JArray items = obj.Value <JArray>("data"); if (items == null) { return; } OrderBookUpdateType type = String2UpdateType(obj.Value <string>("action")); lock (t.OrderBook.Bids) { lock (t.OrderBook.Asks) { if (type == OrderBookUpdateType.RefreshAll) { t.OrderBook.Clear(); t.OrderBook.BeginUpdate(); } for (int i = 0; i < items.Count; i++) { JObject item = (JObject)items[i]; OrderBookEntryType entryType = item.Value <string>("side")[0] == 'S' ? OrderBookEntryType.Ask : OrderBookEntryType.Bid; string rate = null; if (type == OrderBookUpdateType.Add || type == OrderBookUpdateType.RefreshAll) { rate = item.Value <string>("price"); } string size = null; if (type != OrderBookUpdateType.Remove) { size = item.Value <string>("size"); } t.OrderBook.ApplyIncrementalUpdate(entryType, type, item.Value <long>("id"), rate, size); } } } if (type == OrderBookUpdateType.RefreshAll) { t.OrderBook.EndUpdate(); } }
/// <summary> /// ctor /// </summary> /// <param name="type"></param> /// <param name="entry"></param> public ProcessEntry(OrderBookEntryType type, ISymbolOrderBookEntry entry) { Type = type; Entry = entry; }