Ejemplo n.º 1
0
        public virtual void StopListenTickerStream(Ticker ticker)
        {
            SubscribedTickers.Remove(ticker);

            SocketConnectionInfo info = GetConnectionInfo(ticker, OrderBookSockets);

            if (info != null)
            {
                info.Socket.Error           -= OnOrderBookSocketError;
                info.Socket.Opened          -= OnOrderBookSocketOpened;
                info.Socket.Closed          -= OnOrderBookSocketClosed;
                info.Socket.MessageReceived -= OnOrderBookSocketMessageReceived;
                info.Close();
                info.Dispose();
                OrderBookSockets.Remove(info.Socket);
            }

            info = GetConnectionInfo(ticker, TradeHistorySockets);
            if (info != null)
            {
                info.Socket.Error           -= OnTradeHistorySocketError;
                info.Socket.Opened          -= OnTradeHistorySocketOpened;
                info.Socket.Closed          -= OnTradeHistorySocketClosed;
                info.Socket.MessageReceived -= OnTradeHistorySocketMessageReceived;
                info.Close();
                info.Dispose();
                TradeHistorySockets.Remove(info.Socket);
            }
        }
        public override void StartListenTickerStream(Ticker ticker)
        {
            base.StartListenTickerStream(ticker);

            SocketConnectionInfo info = CreateOrderBookWebSocket(ticker);

            OrderBookSockets.Add(info.Socket, info);
        }
 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();
            }
        }