protected internal override void ApplyCapturedEvent(Ticker ticker, TickerCaptureDataInfo info) { if (info.StreamType == CaptureStreamType.OrderBook) { OnOrderBookSocketMessageReceived(OrderBookSockets.FirstOrDefault(s => s.Ticker == ticker).Socket, new MessageReceivedEventArgs(info.Message)); } else if (info.StreamType == CaptureStreamType.TradeHistory) { OnTradeHistorySocketMessageReceived(TradeHistorySockets.FirstOrDefault(s => s.Ticker == ticker).Socket, new MessageReceivedEventArgs(info.Message)); } }
protected internal override void OnOrderBookSocketError(object sender, ErrorEventArgs e) { SocketConnectionInfo info = OrderBookSockets.FirstOrDefault(c => c.Key == sender); if (info != null) { info.Ticker.OrderBook.IsDirty = true; if (CheckProcessError(info)) { return; } } base.OnOrderBookSocketError(sender, e); }
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(); } }