private static void ProcessEvent(WebSocketMessage msg) { if (msg is ClientLoginResponse) { ClientLoginResponse loginResp = (ClientLoginResponse)msg; if (loginResp.JsonWebToken != null) { ClientLoginResponse = loginResp; } Thread publishOrderBookThread = new Thread(PublishOrderBookThread); publishOrderBookThread.Start(); DoLog(string.Format("Client successfully logged with token {0}", loginResp.JsonWebToken)); SubscribeOrderBook(); } if (msg is DepthOfBook) { DepthOfBook depthOfBookDelta = (DepthOfBook)msg; ProcessDepthOfBook(depthOfBookDelta); } }
private static void ProcessEvent(WebSocketMessage msg) { if (msg is ClientLoginResponse) { ClientLoginResponse loginResp = (ClientLoginResponse)msg; if (loginResp.JsonWebToken != null) { ClientLoginResponse = loginResp; } Thread publishOrderBookThread = new Thread(PublishOrderBookThread); publishOrderBookThread.Start(); DoLog(string.Format("Client successfully logged with token {0}", loginResp.JsonWebToken)); SubscribeLastSales(); SubscribeQuotes(); Thread.Sleep(1000); SubscribeOrderBook(); } else if (msg is DepthOfBook) { DepthOfBook depthOfBookDelta = (DepthOfBook)msg; ProcessDepthOfBook(depthOfBookDelta); } else if (msg is LastSale) { LastSale lastSale = (LastSale)msg; DoLog(string.Format("Received last sale for symbol {1}: {0}", lastSale.LastPrice, lastSale.Symbol)); } else if (msg is Quote) { Quote quote = (Quote)msg; DoLog(string.Format("Received quote for symbol {4}: Bid {0}-{1} -- Ask {2}-{3}", quote.BidSize, quote.Bid, quote.AskSize, quote.Ask, quote.Symbol)); } }
private static void ProcessDepthOfBook(DepthOfBook depthOfBookDelta) { lock (Security) { if (depthOfBookDelta.cAction == DepthOfBook._ACTION_INSERT) { InitialSnapshotReceived = true; // If the price level existed, we create the price level but a HUGE warning (WARNING3) should be logged PriceLevel pl = Security.MarketData.OrderBook.Where(x => x.Price == depthOfBookDelta.Price && x.IsBidOrAsk(depthOfBookDelta.IsBid())) .FirstOrDefault(); if (pl != null) { pl.Size = depthOfBookDelta.Size; DoLog(string.Format("WARNING3 - Received ADD DepthOfBook message for a price level that existed. Price Level = {0}", depthOfBookDelta.Price.ToString("0.##"))); } else { PriceLevel newPl = new PriceLevel() { Price = depthOfBookDelta.Price, Size = depthOfBookDelta.Size, OrderBookEntryType = depthOfBookDelta.IsBid() ? OrderBookEntryType.Bid : OrderBookEntryType.Ask }; Security.MarketData.OrderBook.Add(newPl); } } else if (depthOfBookDelta.cAction == DepthOfBook._ACTION_CHANGE) { PriceLevel pl = Security.MarketData.OrderBook.Where(x => x.Price == depthOfBookDelta.Price && x.IsBidOrAsk(depthOfBookDelta.IsBid())) .FirstOrDefault(); if (pl != null) { pl.Size = depthOfBookDelta.Size; } else { //This is not ok, we receive a PriceLevel for a Price that didn't exist. //We create the price level, but we log a HUGE warning (WARNING4) PriceLevel newPl = new PriceLevel() { Price = depthOfBookDelta.Price, Size = depthOfBookDelta.Size, OrderBookEntryType = depthOfBookDelta.IsBid() ? OrderBookEntryType.Bid : OrderBookEntryType.Ask }; Security.MarketData.OrderBook.Add(newPl); DoLog(string.Format("WARNING4 - Received CHANGE DepthOfBook message for a price level that did not exist. Price Level = {0}", depthOfBookDelta.Price.ToString("0.##"))); } } else if (depthOfBookDelta.cAction == DepthOfBook._ACTION_REMOVE) { PriceLevel pl = Security.MarketData.OrderBook.Where(x => x.Price == depthOfBookDelta.Price && x.IsBidOrAsk(depthOfBookDelta.IsBid())) .FirstOrDefault(); if (pl != null) { Security.MarketData.OrderBook.Remove(pl); } else { //Another HUGE warning. We receive a message to delete a price level that didn't exist //We have to log another HUGE warning (WARNING5) DoLog(string.Format("WARNING5 - Received REMOVE DepthOfBook message for a price level that did not exist. Price Level = {0}", depthOfBookDelta.Price.ToString("0.##"))); } } } }