コード例 #1
0
 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());
 }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        public void GetOrderBook(PoloniexTicker ticker, int depth)
        {
            string address = string.Format("https://poloniex.com/public?command=returnOrderBook&currencyPair={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();
        }
コード例 #4
0
 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());
 }
コード例 #5
0
        /// <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));
            }
        }
コード例 #6
0
 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());
 }
コード例 #7
0
        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();
            }
        }
コード例 #8
0
 /// <summary>
 /// ctor
 /// </summary>
 /// <param name="type"></param>
 /// <param name="entry"></param>
 public ProcessEntry(OrderBookEntryType type, ISymbolOrderBookEntry entry)
 {
     Type  = type;
     Entry = entry;
 }