Beispiel #1
0
        private static void Client_SpreadReceived(object sender, Events.KrakenDataEventArgs<SpreadMessage> e)
        {
            // += (sender, e) => Console.WriteLine($"Spread received");
            return;

            string pair = e.Pair.ToString();

            Sec security = Securities.Find(sec => sec.NameInSocket == pair);
            DateTime time = new DateTime(1970, 1, 1).AddSeconds(Convert.ToDouble(e.DataMessage.Time));

            OsEngine.Entity.MarketDepth depth = new OsEngine.Entity.MarketDepth();
            depth.Time = time;
            depth.SecurityNameCode = security.NameInRest;

            OsEngine.Entity.MarketDepthLevel ask = new OsEngine.Entity.MarketDepthLevel();
            ask.Price = e.DataMessage.Ask;
            ask.Ask = 1;

            OsEngine.Entity.MarketDepthLevel bid = new OsEngine.Entity.MarketDepthLevel();
            bid.Price = e.DataMessage.Bid;
            bid.Bid = 1;

            depth.Asks.Add(ask);
            depth.Bids.Add(bid);

            if(MarketDepthUpdateEvent != null)
            {
                MarketDepthUpdateEvent(depth);
            }

        }
Beispiel #2
0
        private static void Client_BookSnapshotReceived(object sender, Events.KrakenDataEventArgs<BookSnapshotMessage> e)
        {
            string pair = e.Pair.ToString();

            Sec security = Securities.Find(sec => sec.NameInSocket == pair);

            MarketDepth depth = _marketDepths.Find(d => d.SecurityNameCode == security.NameInRest);

            if (depth == null)
            {
                depth = new MarketDepth();
                depth.SecurityNameCode = security.NameInRest;
                _marketDepths.Add(depth);
            }

            for (int i = 0; e.DataMessage.Asks != null && i < e.DataMessage.Asks.Length; i++)
            {
                OsEngine.Entity.MarketDepthLevel ask = new OsEngine.Entity.MarketDepthLevel();
                ask.Price = e.DataMessage.Asks[i].Price;
                ask.Ask = e.DataMessage.Asks[i].Volume;

                for (int i2 = 0; i2 < depth.Asks.Count; i2++)
                {
                    if (depth.Asks[i2].Price == ask.Price)
                    {
                        depth.Asks.RemoveAt(i2);
                        break;
                    }
                }

                if (ask.Ask != 0)
                {
                    depth.Asks.Add(ask);
                }

                depth.Time = new DateTime(1970, 1, 1).AddSeconds(Convert.ToDouble(e.DataMessage.Asks[i].Timestamp));
            }

            for (int i = 0; e.DataMessage.Bids != null && i < e.DataMessage.Bids.Length; i++)
            {
                OsEngine.Entity.MarketDepthLevel bid = new OsEngine.Entity.MarketDepthLevel();
                bid.Price = e.DataMessage.Bids[i].Price;
                bid.Bid = e.DataMessage.Bids[i].Volume;

                for (int i2 = 0; i2 < depth.Bids.Count; i2++)
                {
                    if (depth.Bids[i2].Price == bid.Price)
                    {
                        depth.Bids.RemoveAt(i2);
                        break;
                    }
                }

                if (bid.Bid != 0)
                {
                    depth.Bids.Add(bid);
                }

                depth.Time = new DateTime(1970, 1, 1).AddSeconds(Convert.ToDouble(e.DataMessage.Bids[i].Timestamp));
            }

            // 1 Теперь сортируем биды и аски

            for (int i = 0; i < depth.Asks.Count; i++)
            {
                for (int i2 = 0; i2 < depth.Asks.Count - 1; i2++)
                {
                    if (depth.Asks[i2].Price > depth.Asks[i2 + 1].Price)
                    {
                        MarketDepthLevel level = depth.Asks[i2];
                        depth.Asks[i2] = depth.Asks[i2 + 1];
                        depth.Asks[i2 + 1] = level;
                    }
                }
            }


            for (int i = 0; i < depth.Bids.Count; i++)
            {
                for (int i2 = 0; i2 < depth.Bids.Count - 1; i2++)
                {
                    if (depth.Bids[i2].Price < depth.Bids[i2 + 1].Price)
                    {
                        MarketDepthLevel level = depth.Bids[i2];
                        depth.Bids[i2] = depth.Bids[i2 + 1];
                        depth.Bids[i2 + 1] = level;
                    }
                }
            }

            // 2 Теперь удаляем перехлёсты


            while (depth.Bids.Count > 0 &&
                depth.Asks.Count > 0 &&
                depth.Bids[0].Price > depth.Asks[0].Price)
            {
                depth.Asks.RemoveAt(0);
            }

            // !!!!!!!!!!!!!!!!!!!!!!


            // высылаем копию

            if (MarketDepthUpdateEvent != null)
            {
                MarketDepthUpdateEvent(depth.GetCopy());
            }
        }