protected override void DoRequestMarketDataOrderBook(Object param) { string symbol = (string)param; try { DoLog(string.Format("@{0}:Requesting market data order book por symbol {1}", BitmexConfiguration.Name, symbol), Main.Common.Util.Constants.MessageType.Information); if (ActiveSecuritiesOrderBook.Values.Where(x => x.Active).Any(x => x.Symbol == symbol)) { lock (tLock) { PriceLevelHandler.GetPriceLevelDict(symbol).Clear(); WSMarketDataManager.SubscribeOrderBookL2(symbol); } } else { DoLog(string.Format("@{0}:Unsubscribing market data order book for symbol {1}", BitmexConfiguration.Name, symbol), Main.Common.Util.Constants.MessageType.Information); } } catch (Exception ex) { DoLog(string.Format("@{0}: Error Requesting market data order book por symbol {1}:{2}", BitmexConfiguration.Name, symbol, ex.Message), Main.Common.Util.Constants.MessageType.Error); } }
protected void CancelMarketDataOrderBook(Security sec) { DoLog(string.Format("@{0}:Requesting Unsubscribe Market Data order book On Demand for Symbol: {0}", GetConfig().Name, sec.Symbol), Main.Common.Util.Constants.MessageType.Information); if (ActiveSecuritiesOrderBook.Values.Any(x => x.Symbol == sec.Symbol)) { lock (ActiveSecuritiesOrderBook) { DoRemove(ActiveSecuritiesOrderBook, sec.Symbol); WSMarketDataManager.UnsubscribeOrderBookL2(sec.Symbol); PriceLevelHandler.GetPriceLevelDict(sec.Symbol).Clear(); } } else { throw new Exception(string.Format("@{0}: Could not find active security to unsubscribe order book for symbol {1}", GetConfig().Name, sec.Symbol)); } }
protected void ProcessPriceLevelIds(string action, zHFT.InstructionBasedMarketClient.BitMex.Common.DTO.OrderBookEntry entry) { //First we have to process the price level Ids if (action == "partial") { if (!PriceLevelHandler.GetPriceLevelDict(entry.symbol).ContainsKey(entry.id)) { PriceLevelHandler.GetPriceLevelDict(entry.symbol).Add(entry.id, entry.price); } else { DoLog(string.Format("@{0}:WARNING1:Received PARTIAL Price Level for a price leven that already existed", BitmexConfiguration.Name), Main.Common.Util.Constants.MessageType.Error); } } else if (action == "insert") { if (!PriceLevelHandler.GetPriceLevelDict(entry.symbol).ContainsKey(entry.id)) { PriceLevelHandler.GetPriceLevelDict(entry.symbol).Add(entry.id, entry.price); } else { DoLog(string.Format("@{0}:WARNING1:Received INSERT Price Level for a price leven that already existed", BitmexConfiguration.Name), Main.Common.Util.Constants.MessageType.Error); } } else if (action == "update" || action == "delete") { if (PriceLevelHandler.GetPriceLevelDict(entry.symbol).ContainsKey(entry.id)) { decimal priceLevel = PriceLevelHandler.GetPriceLevelDict(entry.symbol)[entry.id]; entry.price = priceLevel; } else { DoLog(string.Format("@{0}:WARNING2 :Received UPDATE/REMOVE Price Level for a price leven that did not existed", BitmexConfiguration.Name), Main.Common.Util.Constants.MessageType.Error); } } else { DoLog(string.Format("Received message for unknown action : {0}", action), Main.Common.Util.Constants.MessageType.Error); } }
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); } }