public void ProcessLevel2(LEVEL2RECORD pRec) { switch (pRec.side) { case enumMarketSide.msAsk: level2Asks.Process(pRec); break; case enumMarketSide.msBid: level2Bids.Process(pRec); break; default: throw new ApplicationException("Invalid Level II Side"); } lastBid = level2Bids.LastPrice; lastAsk = level2Asks.LastPrice; CheckSignalSync(); if (Environment.TickCount > lastChangeTime + 30) { if (level2Bids.HasChanged || level2Asks.HasChanged) { LogLevel2Change(false, TradeSide.Unknown, 0, 0); } } }
void MBTQUOTELib.IMbtQuotesNotify.OnLevel2Data(ref LEVEL2RECORD pRec) { lock ( level2Locker) { try { if (pRec.dPrice < 100000) { ProcessLevel2(pRec); } } catch (Exception e) { log.Notice(e.ToString()); } } }
void MBTQUOTELib.IMbtQuotesNotify.OnLevel2Data(ref LEVEL2RECORD pRec) { }
/// <summary> /// Processing Level2 data requires tracking the actual current best ask and bid. That's on the TODO /// Currently using Level1 data from OnQuoteData /// </summary> /// <param name="pRec"></param> void MBTQUOTELib.IMbtQuotesNotify.OnLevel2Data(ref LEVEL2RECORD pRec) { TickImpl k = new TickImpl(pRec.bstrSymbol); k.ex = pRec.bstrSource; k.time = Util.DT2FT(pRec.UTCTime); k.date = Util.ToTLDate(DateTime.UtcNow.Date); enumMarketSide ems = (enumMarketSide)pRec.side; switch (ems) { case enumMarketSide.msAsk: k.ask = (decimal)pRec.dPrice; k.oe = pRec.bstrSource; k.os = k.AskSize = pRec.lSize; k.trade = k.ask; k.size = k.AskSize; break; case enumMarketSide.msBid: k.bid = (decimal)pRec.dPrice; k.be = pRec.bstrSource; k.bs = k.BidSize = pRec.lSize; k.trade = k.bid; k.size = k.BidSize; break; } SendNewTick(k); }
void IMbtQuotesNotify.OnLevel2Data (ref LEVEL2RECORD data) { }
void IMbtQuotesNotify.OnLevel2Data(ref LEVEL2RECORD pRec) { throw new NotImplementedException(); }