Exemplo n.º 1
0
        private void Client_NewMarketDepth(OrderBookChannelSubscribedResponse orderBook)
        {
            if (_depths == null)
            {
                _depths = new List <MarketDepth>();
            }

            var newDepth = new MarketDepth();

            newDepth.SecurityNameCode = orderBook.CurrencyPair;

            List <MarketDepthLevel> ascs = new List <MarketDepthLevel>();
            List <MarketDepthLevel> bids = new List <MarketDepthLevel>();

            long biggestTimeStamp = 0;

            foreach (var level in orderBook.Datas)
            {
                if (level.order_type == OrderBookEvent.OrderType.Ask)
                {
                    ascs.Add(new MarketDepthLevel
                    {
                        Price = ParseDecimal(level.Price),
                        Ask   = ParseDecimal(level.Quantity),
                    });
                }
                else
                {
                    bids.Add(new MarketDepthLevel
                    {
                        Price = ParseDecimal(level.Price),
                        Bid   = ParseDecimal(level.Quantity),
                    });
                }

                if (level.Timestamp > biggestTimeStamp)
                {
                    biggestTimeStamp = level.Timestamp;
                }
            }

            newDepth.Asks = ascs;
            newDepth.Bids = bids;

            if (biggestTimeStamp != 0)
            {
                newDepth.Time = new DateTime(1970, 1, 1).AddMilliseconds(Convert.ToDouble(biggestTimeStamp));
                ServerTime    = newDepth.Time;
            }

            _depths.Add(newDepth);

            if (MarketDepthEvent != null)
            {
                MarketDepthEvent(newDepth.GetCopy());
            }
        }
Exemplo n.º 2
0
        private void Client_NewMarketDepth(OrderBookChannelSubscribedResponse orderBook)
        {
            if (_depths == null)
            {
                _depths = new List <MarketDepth>();
            }

            var newDepth = new MarketDepth();

            orderBook.CurrencyPair = orderBook.CurrencyPair.Replace("/", "_");

            newDepth.SecurityNameCode = orderBook.CurrencyPair;

            List <MarketDepthLevel> ascs = new List <MarketDepthLevel>();
            List <MarketDepthLevel> bids = new List <MarketDepthLevel>();

            foreach (var level in orderBook.Datas)
            {
                if (level.order_type == OrderBookEvent.OrderType.Ask)
                {
                    ascs.Add(new MarketDepthLevel
                    {
                        Price = ParseDecimal(level.Price),
                        Ask   = ParseDecimal(level.Quantity),
                    });
                }
                else
                {
                    bids.Add(new MarketDepthLevel
                    {
                        Price = ParseDecimal(level.Price),
                        Bid   = ParseDecimal(level.Quantity),
                    });
                }
            }

            newDepth.Asks = ascs;
            newDepth.Bids = bids;
            newDepth.Time = DateTime.Now;

            _depths.Add(newDepth);

            if (MarketDepthEvent != null)
            {
                MarketDepthEvent(newDepth.GetCopy());
            }
        }
Exemplo n.º 3
0
        private List <MarketDepth> CreateNew(GfSubscribeDepthResponseAll jt)
        {
            List <MarketDepth> returnedDepth = new List <MarketDepth>();

            var newDepth = new MarketDepth();

            newDepth.Time = DateTime.UtcNow;

            newDepth.SecurityNameCode = jt.Result.Contract;

            var needDepth = _allDepths.Find(d => d.SecurityNameCode == newDepth.SecurityNameCode);

            if (needDepth != null)
            {
                _allDepths.Remove(needDepth);
            }

            var bids = jt.Result.Bids;
            var asks = jt.Result.Asks;

            foreach (var bid in bids)
            {
                newDepth.Bids.Add(new MarketDepthLevel()
                {
                    Price = Converter.StringToDecimal(bid.P),
                    Bid   = bid.S
                });
            }

            foreach (var ask in asks)
            {
                newDepth.Asks.Add(new MarketDepthLevel()
                {
                    Price = Converter.StringToDecimal(ask.P),
                    Ask   = ask.S
                });
            }

            _allDepths.Add(newDepth);
            SortBids(newDepth.Bids);
            SortAsks(newDepth.Asks);

            returnedDepth.Add(newDepth.GetCopy());

            return(returnedDepth);
        }
Exemplo n.º 4
0
 void _client_UpdateMarketDepth(MarketDepth myDepth)
 {
     try
     {
         lock (_depthLocker)
         {
             if (MarketDepthEvent != null)
             {
                 MarketDepthEvent(myDepth.GetCopy());
             }
         }
     }
     catch (Exception error)
     {
         SendLogMessage(error.ToString(), LogMessageType.Error);
     }
 }
Exemplo n.º 5
0
        public MarketDepth Create(JToken jt)
        {
            var securityNameCode = jt.SelectToken(NamePath).ToString();
            var marketDepth      = new MarketDepth();
            var data             = jt.SelectToken(DataPath);
            var time             = data.SelectToken(TimePath).Value <decimal>();
            var bids             = data.SelectTokens(BidsPath).Children();
            var asks             = data.SelectTokens(AsksPath).Children();

            marketDepth                  = new MarketDepth();
            marketDepth.Time             = TimeManager.GetDateTimeFromTimeStampSeconds(Convert.ToInt64(time));
            marketDepth.SecurityNameCode = securityNameCode;

            foreach (var bid in bids)
            {
                marketDepth.Bids.Add(new MarketDepthLevel()
                {
                    Price = bid[0].Value <decimal>(),
                    Bid   = bid[1].Value <decimal>(),
                });
            }

            foreach (var ask in asks)
            {
                marketDepth.Asks.Add(new MarketDepthLevel()
                {
                    Price = ask[0].Value <decimal>(),
                    Ask   = ask[1].Value <decimal>(),
                });
            }

            if (_securityMarketDepths.ContainsKey(securityNameCode))
            {
                _securityMarketDepths[securityNameCode] = marketDepth;
            }
            else
            {
                _securityMarketDepths.Add(securityNameCode, marketDepth);
            }

            return(marketDepth.GetCopy());
        }
Exemplo n.º 6
0
        private MarketDepth CreateNew(Depth quotes)
        {
            var newDepth = new MarketDepth();

            newDepth.Time = DateTime.UtcNow;

            newDepth.SecurityNameCode = quotes.Symbol;

            var needDepth = _allDepths.Find(d => d.SecurityNameCode == newDepth.SecurityNameCode);

            if (needDepth != null)
            {
                _allDepths.Remove(needDepth);
            }

            var bids = quotes.Data.Bids;
            var asks = quotes.Data.Asks;

            foreach (var bid in bids)
            {
                newDepth.Bids.Add(new MarketDepthLevel()
                {
                    Price = bid[0].ToDecimal(),
                    Bid   = bid[1].ToDecimal(),
                });
            }

            foreach (var ask in asks)
            {
                newDepth.Asks.Add(new MarketDepthLevel()
                {
                    Price = ask[0].ToDecimal(),
                    Ask   = ask[1].ToDecimal(),
                });
            }

            _allDepths.Add(newDepth);

            return(newDepth.GetCopy());
        }
Exemplo n.º 7
0
        private MarketDepth CreateNew(JArray quotes)
        {
            var newDepth = new MarketDepth();

            newDepth.Time = DateTime.UtcNow;

            newDepth.SecurityNameCode = quotes[2].ToString();

            var needDepth = _allDepths.Find(d => d.SecurityNameCode == newDepth.SecurityNameCode);

            if (needDepth != null)
            {
                _allDepths.Remove(needDepth);
            }

            var bids = quotes[1]["bids"].Children();
            var asks = quotes[1]["asks"].Children();

            foreach (var bid in bids)
            {
                newDepth.Bids.Add(new MarketDepthLevel()
                {
                    Price = bid[0].Value <decimal>(),
                    Bid   = bid[1].Value <decimal>(),
                });
            }

            foreach (var ask in asks)
            {
                newDepth.Asks.Add(new MarketDepthLevel()
                {
                    Price = ask[0].Value <decimal>(),
                    Ask   = ask[1].Value <decimal>(),
                });
            }

            _allDepths.Add(newDepth);

            return(newDepth.GetCopy());
        }
Exemplo n.º 8
0
// depth / стакан

        /// <summary>
        /// got new depth
        /// пришёл новый стакан
        /// </summary>
        void _serverDde_UpdateGlass(MarketDepth marketDepth)
        {
            if (ServerTime == DateTime.MinValue)
            {
                return;
            }
            marketDepth.Time = ServerTime;

            if (MarketDepthEvent != null)
            {
                MarketDepthEvent(marketDepth);
            }

            // save depths in the storage  /грузим стаканы в хранилище
            for (int i = 0; i < _marketDepths.Count; i++)
            {
                if (_marketDepths[i].SecurityNameCode == marketDepth.SecurityNameCode)
                {
                    _marketDepths[i] = marketDepth;
                    return;
                }
            }
            _marketDepths.Add(marketDepth.GetCopy());
        }
Exemplo n.º 9
0
        /// <summary>
        /// пришел обновленный стакан
        /// </summary>
        void _client_UpdateMarketDepth(BitMexQuotes quotes)
        {
            try
            {
                lock (_quoteLock)
                {
                    if (quotes.action == "partial")
                    {
                        if (_depth == null)
                        {
                            _depth = new MarketDepth();
                        }
                        else
                        {
                            _depth.Asks.Clear();
                            _depth.Bids.Clear();
                        }
                        _depth.SecurityNameCode = quotes.data[0].symbol;
                        List <MarketDepthLevel> ascs = new List <MarketDepthLevel>();
                        List <MarketDepthLevel> bids = new List <MarketDepthLevel>();

                        for (int i = 0; i < quotes.data.Count; i++)
                        {
                            if (quotes.data[i].price == 0)
                            {
                                continue;
                            }
                            if (quotes.data[i].side == "Sell")
                            {
                                ascs.Add(new MarketDepthLevel()
                                {
                                    Ask   = quotes.data[i].size,
                                    Price = quotes.data[i].price,
                                    Id    = quotes.data[i].id
                                });

                                if (_depth.Bids != null && _depth.Bids.Count > 2 &&
                                    quotes.data[i].price < _depth.Bids[0].Price)
                                {
                                    _depth.Bids.RemoveAt(0);
                                }
                            }
                            else
                            {
                                bids.Add(new MarketDepthLevel()
                                {
                                    Bid   = quotes.data[i].size,
                                    Price = quotes.data[i].price,
                                    Id    = quotes.data[i].id
                                });

                                if (_depth.Asks != null && _depth.Asks.Count > 2 &&
                                    quotes.data[i].price > _depth.Asks[0].Price)
                                {
                                    _depth.Asks.RemoveAt(0);
                                }
                            }
                        }

                        ascs.Reverse();
                        _depth.Asks = ascs;
                        _depth.Bids = bids;
                    }

                    if (quotes.action == "update")
                    {
                        if (_depth == null)
                        {
                            return;
                        }

                        for (int i = 0; i < quotes.data.Count; i++)
                        {
                            if (quotes.data[i].side == "Sell")
                            {
                                if (_depth.Asks.Find(asc => asc.Id == quotes.data[i].id) != null)
                                {
                                    _depth.Asks.Find(asc => asc.Id == quotes.data[i].id).Ask = quotes.data[i].size;
                                }
                                else
                                {
                                    if (quotes.data[i].price == 0)
                                    {
                                        continue;
                                    }

                                    long id = quotes.data[i].id;

                                    for (int j = 0; j < _depth.Asks.Count; j++)
                                    {
                                        if (j == 0 && id > _depth.Asks[j].Id)
                                        {
                                            _depth.Asks.Insert(j, new MarketDepthLevel()
                                            {
                                                Ask   = quotes.data[i].size,
                                                Price = quotes.data[i].price,
                                                Id    = quotes.data[i].id
                                            });
                                        }
                                        else if (j != _depth.Asks.Count - 1 && id < _depth.Asks[j].Id && id > _depth.Asks[j + 1].Id)
                                        {
                                            _depth.Asks.Insert(j + 1, new MarketDepthLevel()
                                            {
                                                Ask   = quotes.data[i].size,
                                                Price = quotes.data[i].price,
                                                Id    = quotes.data[i].id
                                            });
                                        }
                                        else if (j == _depth.Asks.Count - 1 && id < _depth.Asks[j].Id)
                                        {
                                            _depth.Asks.Add(new MarketDepthLevel()
                                            {
                                                Ask   = quotes.data[i].size,
                                                Price = quotes.data[i].price,
                                                Id    = quotes.data[i].id
                                            });
                                        }

                                        if (_depth.Bids != null && _depth.Bids.Count > 2 &&
                                            quotes.data[i].price < _depth.Bids[0].Price)
                                        {
                                            _depth.Bids.RemoveAt(0);
                                        }
                                    }
                                }
                            }
                            else // (quotes.data[i].side == "Buy")
                            {
                                if (quotes.data[i].price == 0)
                                {
                                    continue;
                                }

                                long id = quotes.data[i].id;

                                for (int j = 0; j < _depth.Bids.Count; j++)
                                {
                                    if (j == 0 && id < _depth.Bids[i].Id)
                                    {
                                        _depth.Bids.Insert(j, new MarketDepthLevel()
                                        {
                                            Bid   = quotes.data[i].size,
                                            Price = quotes.data[i].price,
                                            Id    = quotes.data[i].id
                                        });
                                    }
                                    else if (j != _depth.Bids.Count - 1 && id > _depth.Bids[i].Id && id < _depth.Bids[j + 1].Id)
                                    {
                                        _depth.Bids.Insert(j + 1, new MarketDepthLevel()
                                        {
                                            Bid   = quotes.data[i].size,
                                            Price = quotes.data[i].price,
                                            Id    = quotes.data[i].id
                                        });
                                    }
                                    else if (j == _depth.Bids.Count - 1 && id > _depth.Bids[j].Id)
                                    {
                                        _depth.Bids.Add(new MarketDepthLevel()
                                        {
                                            Bid   = quotes.data[i].size,
                                            Price = quotes.data[i].price,
                                            Id    = quotes.data[i].id
                                        });
                                    }

                                    if (_depth.Asks != null && _depth.Asks.Count > 2 &&
                                        quotes.data[i].price > _depth.Asks[0].Price)
                                    {
                                        _depth.Asks.RemoveAt(0);
                                    }
                                }
                            }
                        }

                        _depth.Time = ServerTime;
                    }

                    if (quotes.action == "delete")
                    {
                        if (_depth == null)
                        {
                            return;
                        }

                        for (int i = 0; i < quotes.data.Count; i++)
                        {
                            if (quotes.data[i].side == "Sell")
                            {
                                _depth.Asks.Remove(_depth.Asks.Find(asc => asc.Id == quotes.data[i].id));
                            }
                            else
                            {
                                _depth.Bids.Remove(_depth.Bids.Find(bid => bid.Id == quotes.data[i].id));
                            }
                        }

                        _depth.Time = ServerTime;
                    }
                }

                if (quotes.action == "insert")
                {
                    if (_depth == null)
                    {
                        return;
                    }

                    for (int i = 0; i < quotes.data.Count; i++)
                    {
                        if (quotes.data[0].price == 0)
                        {
                            continue;
                        }
                        if (quotes.data[i].side == "Sell")
                        {
                            long id = quotes.data[i].id;

                            for (int j = 0; j < _depth.Asks.Count; j++)
                            {
                                if (j == 0 && id > _depth.Asks[j].Id)
                                {
                                    _depth.Asks.Insert(j, new MarketDepthLevel()
                                    {
                                        Ask   = quotes.data[i].size,
                                        Price = quotes.data[i].price,
                                        Id    = quotes.data[i].id
                                    });
                                }
                                else if (j != _depth.Asks.Count - 1 && id < _depth.Asks[j].Id && id > _depth.Asks[j + 1].Id)
                                {
                                    _depth.Asks.Insert(j + 1, new MarketDepthLevel()
                                    {
                                        Ask   = quotes.data[i].size,
                                        Price = quotes.data[i].price,
                                        Id    = quotes.data[i].id
                                    });
                                }
                                else if (j == _depth.Asks.Count - 1 && id < _depth.Asks[j].Id)
                                {
                                    _depth.Asks.Add(new MarketDepthLevel()
                                    {
                                        Ask   = quotes.data[i].size,
                                        Price = quotes.data[i].price,
                                        Id    = quotes.data[i].id
                                    });
                                }

                                if (_depth.Bids != null && _depth.Bids.Count > 2 &&
                                    quotes.data[i].price < _depth.Bids[0].Price)
                                {
                                    _depth.Bids.RemoveAt(0);
                                }
                            }
                        }
                        else // quotes.data[i].side == "Buy"
                        {
                            long id = quotes.data[i].id;

                            for (int j = 0; j < _depth.Bids.Count; j++)
                            {
                                if (j == 0 && id < _depth.Bids[j].Id)
                                {
                                    _depth.Bids.Insert(j, new MarketDepthLevel()
                                    {
                                        Bid   = quotes.data[i].size,
                                        Price = quotes.data[i].price,
                                        Id    = quotes.data[i].id
                                    });
                                }
                                else if (j != _depth.Bids.Count - 1 && id > _depth.Bids[j].Id && id < _depth.Bids[j + 1].Id)
                                {
                                    _depth.Bids.Insert(j + 1, new MarketDepthLevel()
                                    {
                                        Bid   = quotes.data[i].size,
                                        Price = quotes.data[i].price,
                                        Id    = quotes.data[i].id
                                    });
                                }
                                else if (j == _depth.Bids.Count - 1 && id > _depth.Bids[j].Id)
                                {
                                    _depth.Bids.Add(new MarketDepthLevel()
                                    {
                                        Bid   = quotes.data[i].size,
                                        Price = quotes.data[i].price,
                                        Id    = quotes.data[i].id
                                    });
                                }

                                if (_depth.Asks != null && _depth.Asks.Count > 2 &&
                                    quotes.data[i].price > _depth.Asks[0].Price)
                                {
                                    _depth.Asks.RemoveAt(0);
                                }
                            }
                        }
                    }

                    while (_depth.Asks != null && _depth.Asks.Count > 200)
                    {
                        _depth.Asks.RemoveAt(200);
                    }

                    while (_depth.Bids != null && _depth.Bids.Count > 200)
                    {
                        _depth.Bids.RemoveAt(200);
                    }

                    _depth.Time = ServerTime;

                    if (MarketDepthEvent != null)
                    {
                        MarketDepthEvent(_depth.GetCopy());
                    }
                }
            }
            catch (Exception error)
            {
                _client_SendLogMessage(error.ToString(), LogMessageType.Error);
            }
        }