//We update an orderBook in memory and publish protected void UpdateOrderBook(WebSocketSubscriptionEvent subscrEvent) { if (subscrEvent is WebSocketErrorMessage) { ProcessSubscrError((WebSocketErrorMessage)subscrEvent); return; } WebSocketOrderBookL2Event orderBookEvent = (WebSocketOrderBookL2Event)subscrEvent; try { zHFT.InstructionBasedMarketClient.BitMex.Common.DTO.OrderBookEntry[] bids = orderBookEvent.data.Where(x => x.IsBuy()).OrderByDescending(x => x.price).ToArray(); zHFT.InstructionBasedMarketClient.BitMex.Common.DTO.OrderBookEntry[] asks = orderBookEvent.data.Where(x => x.IsSell()).OrderBy(x => x.price).ToArray(); SendOrderBookEntries(orderBookEvent.action, bids, asks); OrderBookHandler.DoUpdateOrderBooks(orderBookEvent.action, bids, asks); //string symbol = ""; //if (bids.Length > 0) // symbol = bids[0].symbol; //else if (asks.Length > 0) // symbol = asks[0].symbol; //else // return; //if (ActiveSecuritiesQuotes.Values.Any(x => x.Symbol == symbol) && OrderBookHandler.OrderBooks.ContainsKey(symbol)) //{ // Security sec = ActiveSecuritiesQuotes.Values.Where(x => x.Symbol == symbol).FirstOrDefault(); // OrderBookDictionary dict = OrderBookHandler.OrderBooks[symbol]; // zHFT.InstructionBasedMarketClient.BitMex.Common.DTO.OrderBookEntry bestBid = dict.Entries.Values.Where(x => x.IsBuy() && x.size > 0).OrderByDescending(x => x.price).FirstOrDefault(); // zHFT.InstructionBasedMarketClient.BitMex.Common.DTO.OrderBookEntry bestAsk = dict.Entries.Values.Where(x => x.IsSell() && x.size > 0).OrderBy(x => x.price).FirstOrDefault(); // sec.MarketData.BestBidPrice = Convert.ToDouble(bestBid.price); // sec.MarketData.BestBidSize = Convert.ToInt64(bestBid.size); // sec.MarketData.BestAskPrice = Convert.ToDouble(bestAsk.price); // sec.MarketData.BestAskSize = Convert.ToInt64(bestAsk.size); // //DoLog(string.Format("@{5}:Publishing Market Data for symbol {0}: Best Bid Size={1} Best Bid Price={2} Best Ask Size={3} Best Ask Price={4}", // // symbol, bestBid.size.ToString("##.########"), bestBid.price.ToString("##.##"), // // bestAsk.size.ToString("##.########"), bestAsk.price.ToString("##.##"), // // BitmexConfiguration.Name), Main.Common.Util.Constants.MessageType.Information); // MarketDataWrapper wrapper = new MarketDataWrapper(sec, GetConfig()); // OnMessageRcv(wrapper); //} } catch (Exception ex) { DoLog(string.Format("@{0}:Error processing order book :{1}", BitmexConfiguration.Name, ex.Message), Main.Common.Util.Constants.MessageType.Error); } }
public async Task OpenAndClosePrices() { var listForPrices = new List <TickPrice>(); var listForBooks = new List <OrderBook>(); var tickPriceHandler = new TickPriceHandler(listForPrices); var orderBookHandler = new OrderBookHandler(listForBooks); Exchange = new LykkeExchange(config, null, tickPriceHandler, orderBookHandler, _tradeHandler, new LogToConsole()); var exchange = Exchange; exchange.Start(); await Task.Delay(TimeSpan.FromSeconds(10)); exchange.Stop(); Assert.True(listForPrices.Any()); }
public override bool Initialize(OnMessageReceived pOnMessageRcv, OnLogMessage pOnLogMsg, string configFile) { try { this.OnMessageRcv += pOnMessageRcv; this.OnLogMsg += pOnLogMsg; if (LoadConfig(configFile)) { DoLog("Initializing WSMarketDataManager @ BitMexInstructionBasedMarketClient", Main.Common.Util.Constants.MessageType.Information); WSMarketDataManager = new MarketDataManager(BitmexConfiguration.WebsocketURL, true); RESTMarketDataManager = new zHFT.InstructionBasedMarketClient.BitMex.DAL.MarketDataManager(BitmexConfiguration.RESTURL); DoLog(string.Format("Connected: {0} - Error Message: {1}", WSMarketDataManager.AuthSubscriptionResult.Success, WSMarketDataManager.AuthSubscriptionResult.ErrorMessage), Main.Common.Util.Constants.MessageType.Information); DoLog("Initializing SecurityListManager @ BitMexInstructionBasedMarketClient", Main.Common.Util.Constants.MessageType.Information); SecurityListManager = new DAL.REST.SecurityListManager(BitmexConfiguration.RESTURL); PriceLevelHandler = new PriceLevelHandler(); //Securities = SecurityListManager.GetActiveSecurityList(); //ProcessContractSize(Securities); DoLog("Assigning events @ BitMexInstructionBasedMarketClient", Main.Common.Util.Constants.MessageType.Information); OrderBookHandler = new OrderBookHandler(); WSMarketDataManager.SubscribeResponseRequest( BaseManager._ORDERBOOK_L2, OrderBookSubscriptionResponse, new object[] { }); WSMarketDataManager.SubscribeResponseRequest( BaseManager._TRADE, TradeSubscriptionResponse, new object[] { }); WSMarketDataManager.SubscribeResponseRequest( BaseManager._QUOTE, QuoteSubscriptionResponse, new object[] { }); WSMarketDataManager.SubscribeEvents(BaseManager._ORDERBOOK_L2, UpdateOrderBook); WSMarketDataManager.SubscribeEvents(BaseManager._TRADE, UpdateTrade); WSMarketDataManager.SubscribeEvents(BaseManager._QUOTE, UpdateQuotes); ActiveSecuritiesQuotes = new Dictionary <int, Security>(); ActiveSecuritiesTrades = new Dictionary <int, Security>(); ActiveSecuritiesOrderBook = new Dictionary <int, Security>(); ContractsTimeStamps = new Dictionary <int, DateTime>(); return(true); } else { DoLog("Error initializing config file " + configFile, Main.Common.Util.Constants.MessageType.Error); return(false); } } catch (Exception ex) { DoLog("Critical error initializing " + configFile + ":" + ex.Message, Main.Common.Util.Constants.MessageType.Error); return(false); } }