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); } }
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()); } }