public List <TradeInfoItem> GetTradeVolumesForCandleStick(Ticker ticker, long start, long end)
        {
            List <TradeInfoItem> trades = new List <TradeInfoItem>();
            string address = string.Format("https://api.binance.com/api/v1/aggTrades?symbol={0}&limit={1}&startTime={2}&endTime={3}", Uri.EscapeDataString(ticker.CurrencyPair), 1000, start, end);

            byte[] data = ((Ticker)ticker).DownloadBytes(address);
            if (data == null || data.Length == 0)
            {
                return(trades);
            }

            int             parseIndex = 0;
            List <string[]> items      = JSonHelper.Default.DeserializeArrayOfObjects(data, ref parseIndex, AggTradesItem);

            for (int i = items.Count - 1; i >= 0; i--)
            {
                string[] item = items[i];
                DateTime time = FromUnixTime(FastValueConverter.ConvertPositiveLong(item[5]));

                TradeInfoItem t     = new TradeInfoItem(null, ticker);
                bool          isBuy = item[6][0] != 't';
                t.AmountString = item[2];
                t.Time         = time;
                t.Type         = isBuy ? TradeType.Buy : TradeType.Sell;
                trades.Add(t);
            }
            return(trades);
        }
        protected virtual void OnKlineItemRecv(Ticker ticker, string[] item)
        {
            long     dt   = FastValueConverter.ConvertPositiveLong(item[0]);
            DateTime time = FromUnixTime(dt);
            CandleStickIntervalInfo info = null;

            for (int ci = 0; ci < AllowedCandleStickIntervals.Count; ci++)
            {
                CandleStickIntervalInfo i = AllowedCandleStickIntervals[ci];
                if (i.Command == item[3])
                {
                    info = i;
                    break;
                }
            }
            if (ticker.CandleStickPeriodMin != info.Interval.TotalMinutes)
            {
                return;
            }
            //Debug.WriteLine(item[6] + " " + item[7] + " " + item[8] + " " + item[9]);
            lock (ticker.CandleStickData) {
                CandleStickData data = new CandleStickData();
                data.Time        = time;
                data.Open        = FastValueConverter.Convert(item[6]);
                data.Close       = FastValueConverter.Convert(item[7]);
                data.High        = FastValueConverter.Convert(item[8]);
                data.Low         = FastValueConverter.Convert(item[9]);
                data.Volume      = FastValueConverter.Convert(item[10]);
                data.QuoteVolume = FastValueConverter.Convert(item[13]);
                ticker.UpdateCandleStickData(data);
            }
        }
        void OnIncrementalOrderBookUpdateRecv(Ticker ticker, byte[] bytes)
        {
            int startIndex = 0;

            string[] updateId = JSonHelper.Default.StartDeserializeObject(bytes, ref startIndex, OrderBookStartItems);

            long seqNumber = FastValueConverter.ConvertPositiveLong(updateId[0]);

            if (seqNumber <= ticker.OrderBook.Updates.SeqNumber)
            {
                return;
            }

            const string bidString = "\"bids\":";
            const string askString = "\"asks\":";

            startIndex += bidString.Length + 1;
            List <string[]> jbids = JSonHelper.Default.DeserializeArrayOfArrays(bytes, ref startIndex, 3);

            startIndex += askString.Length + 1;
            List <string[]> jasks = JSonHelper.Default.DeserializeArrayOfArrays(bytes, ref startIndex, 3);

            long hackedNextSeqNumber = ticker.OrderBook.Updates.SeqNumber;

            ticker.OrderBook.Updates.Push(hackedNextSeqNumber, ticker, jbids, jasks, null);
            OnIncrementalUpdateRecv(ticker.OrderBook.Updates);
        }
        protected long GetServerTime()
        {
            string      adress = "https://binance.com/api/v1/time";
            MyWebClient client = GetWebClient();

            try {
                return(FastValueConverter.ConvertPositiveLong(client.DownloadString(adress)));
            }
            catch (Exception e) {
                LogManager.Default.Log(e.ToString());
                return((long)(DateTime.UtcNow - epoch).TotalMilliseconds);
            }
        }
        void OnTradeHistoryItemRecv(Ticker ticker, string[] str)
        {
            TradeInfoItem item = new TradeInfoItem(null, ticker);

            item.Id           = FastValueConverter.ConvertPositiveInteger(str[3]);
            item.RateString   = str[4];
            item.AmountString = str[5];
            item.Time         = FromUnixTime(FastValueConverter.ConvertPositiveLong(str[8]));
            item.Type         = str[9][0] == 't' ? TradeType.Sell : TradeType.Buy;

            ticker.TradeHistory.Insert(0, item);
            ticker.RaiseTradeHistoryAdd();
        }
        public override BindingList <CandleStickData> GetCandleStickData(Ticker ticker, int candleStickPeriodMin, DateTime startUtc, long periodInSeconds)
        {
            long startSec = (long)(startUtc.Subtract(epoch)).TotalSeconds;
            long end      = startSec + periodInSeconds;
            CandleStickIntervalInfo info = AllowedCandleStickIntervals.FirstOrDefault(i => i.Interval.TotalMinutes == candleStickPeriodMin);

            string address = string.Format("https://api.binance.com/api/v1/klines?symbol={0}&interval={1}&startTime={2}&endTime={3}&limit=10000",
                                           Uri.EscapeDataString(ticker.CurrencyPair), info.Command, startSec * 1000, end * 1000);

            byte[] bytes = null;
            try {
                bytes = GetDownloadBytes(address);
            }
            catch (Exception) {
                return(null);
            }
            if (bytes == null || bytes.Length == 0)
            {
                return(null);
            }

            DateTime startTime = epoch;

            BindingList <CandleStickData> list = new BindingList <CandleStickData>();
            int             startIndex         = 0;
            List <string[]> res = JSonHelper.Default.DeserializeArrayOfArrays(bytes, ref startIndex, 12);

            if (res == null)
            {
                return(list);
            }
            foreach (string[] item in res)
            {
                CandleStickData data = new CandleStickData();
                data.Time          = startTime.AddMilliseconds(FastValueConverter.ConvertPositiveLong(item[0])).ToLocalTime();
                data.Open          = FastValueConverter.Convert(item[1]);
                data.High          = FastValueConverter.Convert(item[2]);
                data.Low           = FastValueConverter.Convert(item[3]);
                data.Close         = FastValueConverter.Convert(item[4]);
                data.Volume        = FastValueConverter.Convert(item[5]);
                data.QuoteVolume   = FastValueConverter.Convert(item[7]);
                data.BuyVolume     = FastValueConverter.Convert(item[9]);
                data.SellVolume    = data.Volume - data.BuyVolume;
                data.BuySellVolume = data.BuyVolume - data.SellVolume;
                list.Add(data);
            }

            //List<TradeInfoItem> trades = GetTradeVolumesForCandleStick(ticker, startSec * 1000, end * 1000);
            //CandleStickChartHelper.InitializeVolumes(list, trades, ticker.CandleStickPeriodMin);
            return(list);
        }
Exemple #7
0
        protected override TradeInfoItem InitializeAccountTradeInfoItem(string[] item, Ticker ticker)
        {
            DateTime time = FromUnixTime(FastValueConverter.ConvertPositiveLong(item[13]));

            TradeInfoItem t = new TradeInfoItem(null, ticker);

            t.OrderNumber  = item[5];
            t.AmountString = item[7];
            t.Time         = time;
            t.Type         = String2TradeType(item[10]);
            t.RateString   = item[6];
            t.IdString     = item[3];
            return(t);
        }
Exemple #8
0
        protected override OpenedOrderInfo InitializeOpenedOrderItem(string[] item, Ticker ticker)
        {
            OpenedOrderInfo t = new OpenedOrderInfo(null, ticker);

            t.OrderId      = item[0];
            t.Ticker       = ticker;
            t.ValueString  = item[4];
            t.AmountString = item[6];
            t.TotalString  = item[7];
            t.Type         = item[13][0] == 'B'? OrderType.Buy: OrderType.Sell;
            t.Date         = FromUnixTime(FastValueConverter.ConvertPositiveLong(item[19]));

            return(t);
        }
Exemple #9
0
        protected override TradeInfoItem InitializeTradeInfoItem(string[] item, Ticker ticker)
        {
            DateTime time = FromUnixTime(FastValueConverter.ConvertPositiveLong(item[4]));

            TradeInfoItem t     = new TradeInfoItem(null, ticker);
            bool          isBuy = item[4][0] != 't';

            t.AmountString = item[2];
            t.Time         = time;
            t.Type         = isBuy ? TradeType.Buy : TradeType.Sell;
            t.RateString   = item[1];
            t.IdString     = item[0];

            return(t);
        }
        protected internal override void OnRequestCompleted(MyWebClient myWebClient)
        {
            base.OnRequestCompleted(myWebClient);
            if (XRateLimitLimit == 0)
            {
                IEnumerable <string> limit = myWebClient.ResponseHeaders.GetValues("X-RateLimit-Limit");
                XRateLimitLimit = Convert.ToInt32(limit.First());
            }
            IEnumerable <string> remain = myWebClient.ResponseHeaders.GetValues("X-RateLimit-Remaining");

            XRateLimitRemain = FastValueConverter.ConvertPositiveInteger(remain.First());
            IEnumerable <string> resetTime = myWebClient.ResponseHeaders.GetValues("X-RateLimit-Reset");

            XRateLimitReset = FastValueConverter.ConvertPositiveLong(resetTime.First());
        }
        public override bool UpdateTrades(Ticker ticker)
        {
            string address = string.Format("https://api.binance.com/api/v1/trades?symbol={0}&limit={1}",
                                           Uri.EscapeDataString(ticker.CurrencyPair), 1000);

            byte[] data = ((Ticker)ticker).DownloadBytes(address);
            if (data == null || data.Length == 0)
            {
                return(false);
            }

            ticker.TradeHistory.Clear();
            ticker.TradeStatistic.Clear();

            int             index = 0, parseIndex = 0;
            List <string[]> items = JSonHelper.Default.DeserializeArrayOfObjects(data, ref parseIndex, TradeItemString);
            ResizeableArray <TradeInfoItem> newItems = new ResizeableArray <TradeInfoItem>(items.Count);

            for (int i = items.Count - 1; i >= 0; i--)
            {
                string[] item    = items[i];
                DateTime time    = FromUnixTime(FastValueConverter.ConvertPositiveLong(item[3]));
                int      tradeId = FastValueConverter.ConvertPositiveInteger(item[0]);

                TradeInfoItem t     = new TradeInfoItem(null, ticker);
                bool          isBuy = item[4][0] != 't';
                t.AmountString = item[2];
                t.Time         = time;
                t.Type         = isBuy ? TradeType.Buy : TradeType.Sell;
                t.RateString   = item[1];
                t.Id           = tradeId;
                double price  = t.Rate;
                double amount = t.Amount;
                t.Total = price * amount;
                ticker.TradeHistory.Add(t);
                newItems.Add(t);
                index++;
            }
            if (ticker.HasTradeHistorySubscribers)
            {
                ticker.RaiseTradeHistoryChanged(new TradeHistoryChangedEventArgs()
                {
                    NewItems = newItems
                });
            }
            return(true);
        }
        void OnUpdateOrderBook(Ticker ticker, byte[] bytes)
        {
            int startIndex = 0;

            string[] updateId = JSonHelper.Default.StartDeserializeObject(bytes, ref startIndex, OrderBookStartItems);

            const string bidString = "\"bids\":";
            const string askString = "\"asks\":";

            startIndex += bidString.Length + 1;
            List <string[]> jbids = JSonHelper.Default.DeserializeArrayOfArrays(bytes, ref startIndex, 3);

            startIndex += askString.Length + 1;
            List <string[]> jasks = JSonHelper.Default.DeserializeArrayOfArrays(bytes, ref startIndex, 3);

            List <OrderBookEntry> bids  = ticker.OrderBook.Bids;
            List <OrderBookEntry> asks  = ticker.OrderBook.Asks;
            List <OrderBookEntry> iasks = ticker.OrderBook.AsksInverted;

            bids.Clear();
            asks.Clear();
            iasks.Clear();

            foreach (string[] item in jbids)
            {
                bids.Add(new OrderBookEntry()
                {
                    ValueString = item[0], AmountString = item[1]
                });
            }

            foreach (string[] item in jasks)
            {
                OrderBookEntry e = new OrderBookEntry()
                {
                    ValueString = item[0], AmountString = item[1]
                };
                asks.Add(e);
                iasks.Insert(0, e);
            }

            ticker.OrderBook.Updates.Clear(FastValueConverter.ConvertPositiveLong(updateId[0]) + 1);
            ticker.OrderBook.UpdateEntries();
            ticker.OrderBook.RaiseOnChanged(new IncrementalUpdateInfo());
            ticker.RaiseChanged();
        }
        bool OnUpdateOrderBook(Ticker ticker, byte[] bytes)
        {
            if (bytes == null)
            {
                return(false);
            }

            int startIndex = 0; // skip {

            List <string[]> items = JSonHelper.Default.DeserializeArrayOfObjects(bytes, ref startIndex, OrderBookItems);

            ticker.OrderBook.BeginUpdate();
            try {
                List <OrderBookEntry> bids  = ticker.OrderBook.Bids;
                List <OrderBookEntry> asks  = ticker.OrderBook.Asks;
                List <OrderBookEntry> iasks = ticker.OrderBook.AsksInverted;
                for (int i = 0; i < items.Count; i++)
                {
                    string[]       item  = items[i];
                    OrderBookEntry entry = new OrderBookEntry();
                    entry.Id           = FastValueConverter.ConvertPositiveLong(item[1]);
                    entry.ValueString  = item[4];
                    entry.AmountString = item[3];
                    if (item[2][0] == 'S')
                    {
                        if (iasks != null)
                        {
                            iasks.Add(entry);
                        }
                        asks.Insert(0, entry);
                    }
                    else
                    {
                        bids.Add(entry);
                    }
                }
            }
            finally {
                ticker.OrderBook.IsDirty = false;
                ticker.OrderBook.EndUpdate();
            }
            return(true);
        }
        void OnTradeHistoryItemRecv(Ticker ticker, string[] str)
        {
            TradeInfoItem item = new TradeInfoItem(null, ticker);

            item.Id           = FastValueConverter.ConvertPositiveInteger(str[3]);
            item.RateString   = str[4];
            item.AmountString = str[5];
            item.Time         = FromUnixTime(FastValueConverter.ConvertPositiveLong(str[8]));
            item.Type         = str[9][0] == 't' ? TradeType.Sell : TradeType.Buy;

            ticker.TradeHistory.Insert(0, item);
            if (ticker.HasTradeHistorySubscribers)
            {
                TradeHistoryChangedEventArgs e = new TradeHistoryChangedEventArgs()
                {
                    NewItem = item
                };
                ticker.RaiseTradeHistoryChanged(e);
            }
        }
Exemple #15
0
        protected override bool GetTradesCore(ResizeableArray <TradeInfoItem> list, Ticker ticker, DateTime start, DateTime end)
        {
            string address = string.Format("https://api.binance.com/api/v1/aggTrades?symbol={0}&limit={1}&startTime={2}&endTime={3}",
                                           Uri.EscapeDataString(ticker.CurrencyPair), 1000, ToUnixTimestampMs(start), ToUnixTimestampMs(end));

            byte[] data = ((Ticker)ticker).DownloadBytes(address);
            if (data == null || data.Length == 0)
            {
                return(false);
            }

            int             parseIndex = 0;
            List <string[]> items      = JSonHelper.Default.DeserializeArrayOfObjects(data, ref parseIndex, AggTradeItemString);

            for (int i = 0; i < items.Count; i++)
            {
                string[] item = items[i];
                DateTime time = FromUnixTimestampMs(FastValueConverter.ConvertPositiveLong(item[5]));
                //if(time > end)
                //    break;
                int tradeId = FastValueConverter.ConvertPositiveInteger(item[0]);

                TradeInfoItem t     = new TradeInfoItem(null, ticker);
                bool          isBuy = item[6][0] != 't';
                t.AmountString = item[2];
                t.Time         = time;
                t.Type         = isBuy ? TradeType.Buy : TradeType.Sell;
                t.RateString   = item[1];
                t.Id           = tradeId;
                double price  = t.Rate;
                double amount = t.Amount;
                t.Total = price * amount;
                if (list.Last() == null || list.Last().Time < time)
                {
                    list.Add(t);
                }
            }
            return(true);
        }
        protected virtual void OnKlineItemRecv(Ticker ticker, string[] item)
        {
            long     dt   = FastValueConverter.ConvertPositiveLong(item[0]);
            DateTime time = FromUnixTime(dt);
            CandleStickIntervalInfo info = AllowedCandleStickIntervals.FirstOrDefault(i => i.Command == item[3]);

            if (ticker.CandleStickPeriodMin != info.Interval.TotalMinutes)
            {
                return;
            }
            Debug.WriteLine(item[6] + " " + item[7] + " " + item[8] + " " + item[9]);
            lock (ticker.CandleStickData) {
                CandleStickData data = ticker.GetOrCreateCandleStickData(time);
                data.Open        = FastValueConverter.Convert(item[6]);
                data.Close       = FastValueConverter.Convert(item[7]);
                data.High        = FastValueConverter.Convert(item[8]);
                data.Low         = FastValueConverter.Convert(item[9]);
                data.Volume      = FastValueConverter.Convert(item[10]);
                data.QuoteVolume = FastValueConverter.Convert(item[13]);
                ticker.RaiseCandleStickChanged();
            }
        }
        bool UpdateOrderBook(Ticker ticker, byte[] bytes)
        {
            if (bytes == null)
            {
                return(false);
            }

            int startIndex = 0; // skip {

            List <string[]> items = JSonHelper.Default.DeserializeArrayOfObjects(bytes, ref startIndex, OrderBookItems);

            List <OrderBookEntry> bids  = ticker.OrderBook.Bids;
            List <OrderBookEntry> asks  = ticker.OrderBook.Asks;
            List <OrderBookEntry> iasks = ticker.OrderBook.AsksInverted;

            foreach (string[] item in items)
            {
                OrderBookEntry entry = new OrderBookEntry();

                entry.Id           = FastValueConverter.ConvertPositiveLong(item[1]);
                entry.ValueString  = item[4];
                entry.AmountString = item[3];

                if (item[2][0] == 'S')
                {
                    iasks.Add(entry);
                    asks.Insert(0, entry);
                }
                else
                {
                    bids.Add(entry);
                }
            }
            ticker.OrderBook.UpdateEntries();
            return(true);
        }
Exemple #18
0
 public long ReadPositiveInteger(byte[] bytes, ref int startIndex)
 {
     return(FastValueConverter.ConvertPositiveLong(bytes, ref startIndex));
 }
        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();
            }
        }
        internal void OnUpdateOrderBook(Ticker ticker, byte[] bytes)
        {
            int startIndex = 0;

            string[] updateId = JSonHelper.Default.StartDeserializeObject(bytes, ref startIndex, OrderBookStartItems);

            if (ticker.CaptureData)
            {
                ticker.CaptureDataCore(CaptureStreamType.OrderBook, CaptureMessageType.Snapshot, System.Text.ASCIIEncoding.Default.GetString(bytes));
            }

            const string bidString = "\"bids\":";
            const string askString = "\"asks\":";

            startIndex += bidString.Length + 1;
            List <string[]> jbids = JSonHelper.Default.DeserializeArrayOfArrays(bytes, ref startIndex, 2);

            startIndex += askString.Length + 1;
            List <string[]> jasks = JSonHelper.Default.DeserializeArrayOfArrays(bytes, ref startIndex, 2);

            ticker.OrderBook.BeginUpdate();
            try {
                List <OrderBookEntry> bids  = ticker.OrderBook.Bids;
                List <OrderBookEntry> asks  = ticker.OrderBook.Asks;
                List <OrderBookEntry> iasks = ticker.OrderBook.AsksInverted;

                bids.Clear();
                asks.Clear();
                if (iasks != null)
                {
                    iasks.Clear();
                }
                if (jbids != null)
                {
                    for (int i = 0; i < jbids.Count; i++)
                    {
                        string[] item = jbids[i];
                        bids.Add(new OrderBookEntry()
                        {
                            ValueString = item[0], AmountString = item[1]
                        });
                    }
                }
                if (jasks != null)
                {
                    for (int i = 0; i < jasks.Count; i++)
                    {
                        string[]       item = jasks[i];
                        OrderBookEntry e    = new OrderBookEntry()
                        {
                            ValueString = item[0], AmountString = item[1]
                        };
                        asks.Add(e);
                        if (iasks != null)
                        {
                            iasks.Insert(0, e);
                        }
                    }
                }
                ticker.OrderBook.Updates.Clear(FastValueConverter.ConvertPositiveLong(updateId[0]) + 1);
            }
            finally {
                ticker.OrderBook.IsDirty = false;
                ticker.OrderBook.EndUpdate();
            }
            ticker.RaiseChanged();
        }