protected override List <int> ProcessBookEventsForABook(int bookID, List <EventArgs> eArgList) { List <int> updatedInstrList = new List <int>(); foreach (EventArgs eArg in eArgList) { Type eArgType = eArg.GetType(); /* * if (eArgType == typeof(PriceListener.PriceUpdateEventArgs)) * { * PriceListener.PriceUpdateEventArgs e = (PriceListener.PriceUpdateEventArgs)eArg; * int Id; * if (m_InstrumentMarkets.TryGetValue(e.Instrument, out Id)) * { * m_Book[bookID].Instruments[Id].SetMarket(0, 0, ((Price)e.BidPrice).ToDouble(), ((Quantity)e.BidQty).ToInt(), 0); * m_Book[bookID].Instruments[Id].SetMarket(1, 0, ((Price)e.AskPrice).ToDouble(), ((Quantity)e.AskQty).ToInt(), 0); * //m_Book[bookID].Instruments[Id].LastPrice = (e * } * } */ if (eArgType == typeof(Misty.Lib.BookHubs.MarketUpdateEventArgs)) { Misty.Lib.BookHubs.MarketUpdateEventArgs e = (Misty.Lib.BookHubs.MarketUpdateEventArgs)eArg; int Id; Misty.Lib.BookHubs.Market mktInstrument; // TODO: Figure out how we can get here, with ID=0 and no Instrument yet in dictionary with that Id. if (m_InstrumentMarkets.TryGetValue(e.Name, out Id) && m_Book[bookID].Instruments.TryGetValue(Id, out mktInstrument)) { mktInstrument.SetMarket(e.Side, 0, e.Price, e.Qty, 0); } } else if (eArgType == typeof(Misty.Lib.BookHubs.MarketStatusEventArgs)) { Misty.Lib.BookHubs.MarketStatusEventArgs e = (Misty.Lib.BookHubs.MarketStatusEventArgs)eArg; int Id; Misty.Lib.BookHubs.Market mktInstrument; if (m_InstrumentMarkets.TryGetValue(e.InstrumentName, out Id) && m_Book[bookID].Instruments.TryGetValue(Id, out mktInstrument)) { if (e.Status == Misty.Lib.BookHubs.MarketStatus.Trading) { m_Book[bookID].Instruments[Id].IsMarketGood = true; } else { m_Book[bookID].Instruments[Id].IsMarketGood = false; } } } else { Log.NewEntry(LogLevel.Warning, string.Format("Error unexpected event of type {0} : {1}", eArgType.Name, eArg.ToString())); } } return(new List <int>()); }
private void PriceListener_ProcessMarketEvents(ref List <EventArgs> eventArgs) { DateTime now = Log.GetTime(); foreach (EventArgs eventArg in eventArgs) { if (eventArg is Misty.Lib.BookHubs.MarketUpdateEventArgs) { Misty.Lib.BookHubs.MarketUpdateEventArgs e = (Misty.Lib.BookHubs.MarketUpdateEventArgs)eventArg; Market mkt; if (m_Markets.TryGetValue(e.Name, out mkt)) { mkt.PQ[e.Side].Price = e.Price; mkt.PQ[e.Side].Qty = e.Qty; mkt.IsChanged = true; } } else if (eventArg is Misty.Lib.BookHubs.MarketStatusEventArgs) { Misty.Lib.BookHubs.MarketStatusEventArgs e = (Misty.Lib.BookHubs.MarketStatusEventArgs)eventArg; string s = string.Format("{0},{1},Status,{2}", now.ToString(Strings.FormatDateTimeZone), e.InstrumentName, e.Status); Console.WriteLine(s); m_Writer.RequestEnqueue(s); } } // foreach (Market mkt in m_Markets.Values) { if (mkt.IsChanged) { Console.WriteLine(mkt.ToString(now)); m_Writer.RequestEnqueue(mkt.ToString(now)); // REset trades to zero mkt.PQ[2].Qty = 0; mkt.IsChanged = false; } } }// PriceListener_ProcessMarketEvents
// // // // **** PriceSubscription_Updated() **** // private void PriceSubscription_Updated(object sender, FieldsUpdatedEventArgs eventArgs) { if (m_isDisposing) { return; } bool isSnapShot = (eventArgs.UpdateType == UpdateType.Snapshot); if (eventArgs.Error == null) { // Analyze FieldId[] changedFieldIds = eventArgs.Fields.GetChangedFieldIds(); if (changedFieldIds.Length > 0) { InstrumentKey key = eventArgs.Fields.Instrument.Key; MistyProd.InstrumentName instrKey; if (m_KeyToInstruments.TryGetValue(key, out instrKey)) { m_NewEvents.Clear(); // Bid side if (isSnapShot || changedFieldIds.Contains <FieldId>(FieldId.BestBidPrice) || changedFieldIds.Contains <FieldId>(FieldId.BestBidQuantity)) { Price p = (Price)eventArgs.Fields.GetField(FieldId.BestBidPrice).Value; Quantity q = (Quantity)eventArgs.Fields.GetField(FieldId.BestBidQuantity).Value; if (p.IsValid && q.IsValid) { int qty = q.ToInt(); if (qty > 0) { Misty.Lib.BookHubs.MarketUpdateEventArgs e = new Misty.Lib.BookHubs.MarketUpdateEventArgs(); //e.Instrument = instrument; e.Name = instrKey; e.Price = p.ToDouble(); e.Qty = q.ToInt(); e.Side = QTMath.BidSide; m_NewEvents.Add(e); } } } // Ask side if (isSnapShot || changedFieldIds.Contains <FieldId>(FieldId.BestAskPrice) || changedFieldIds.Contains <FieldId>(FieldId.BestAskQuantity)) { Price p = (Price)eventArgs.Fields.GetField(FieldId.BestAskPrice).Value; Quantity q = (Quantity)eventArgs.Fields.GetField(FieldId.BestAskQuantity).Value; if (p.IsValid && q.IsValid) { int qty = q.ToInt(); if (qty > 0) { Misty.Lib.BookHubs.MarketUpdateEventArgs e = new Misty.Lib.BookHubs.MarketUpdateEventArgs(); //e.Instrument = instrument; e.Name = instrKey; e.Price = p.ToDouble(); e.Qty = q.ToInt(); e.Side = QTMath.AskSide; m_NewEvents.Add(e); } } } // Last if (isSnapShot || changedFieldIds.Contains <FieldId>(FieldId.LastTradedPrice) || changedFieldIds.Contains <FieldId>(FieldId.LastTradedQuantity)) { Price p = (Price)eventArgs.Fields.GetField(FieldId.LastTradedPrice).Value; Quantity q = (Quantity)eventArgs.Fields.GetField(FieldId.LastTradedQuantity).Value; if (p == 0) { //int nn = 0; } if (p.IsValid && q.IsValid) { int qty = q.ToInt(); if (qty > 0) { Misty.Lib.BookHubs.MarketUpdateEventArgs e = new Misty.Lib.BookHubs.MarketUpdateEventArgs(); //e.Instrument = instrument; e.Name = instrKey; e.Price = p.ToDouble(); e.Qty = q.ToInt(); e.Side = QTMath.LastSide; m_NewEvents.Add(e); } } } // Total Volume /* * if (isSnapShot || changedFieldIds.Contains<FieldId>(FieldId.TotalTradedQuantity)) * { * object f = eventArgs.Fields.GetField(FieldId.TotalTradedQuantity).Value; * Quantity q = (Quantity)eventArgs.Fields.GetField(FieldId.LastTradedQuantity).Value; * if (q.IsValid) * { * Misty.Lib.BookHubs.MarketUpdateEventArgs e = new Misty.Lib.BookHubs.MarketUpdateEventArgs(); * e.Instrument = instrument; * e.Qty = q.ToInt(); * //e.Side = QTMath.LastSide; * //m_NewEvents.Add(e); * } * } * if (isSnapShot || changedFieldIds.Contains<FieldId>(FieldId.HighPrice)) * { * object f = eventArgs.Fields.GetField(FieldId.HighPrice).Value; * } * if (isSnapShot || changedFieldIds.Contains<FieldId>(FieldId.LowPrice)) * { * object f = eventArgs.Fields.GetField(FieldId.LowPrice).Value; * } */ /* * if (changedFieldIds.Contains<FieldId>(FieldId.OpenPrice)) * { * object f = eventArgs.Fields.GetField(FieldId.OpenPrice).Value; * } * if (isSnapShot || changedFieldIds.Contains<FieldId>(FieldId.SettlementPrice)) * { * object f = eventArgs.Fields.GetField(FieldId.SettlementPrice).Value; * } */ // Series Status if (changedFieldIds.Contains <FieldId>(FieldId.SeriesStatus)) { TradingStatus status = (TradingStatus)eventArgs.Fields.GetField(FieldId.SeriesStatus).Value; Log.NewEntry(LogLevel.Minor, "PriceListener: SeriesStatus change {0} is {1}.", instrKey, status.ToString()); Misty.Lib.BookHubs.MarketStatusEventArgs e = new Misty.Lib.BookHubs.MarketStatusEventArgs(); //e.Instrument = instrument; e.InstrumentName = instrKey; if (status == TradingStatus.Trading) { e.Status = Misty.Lib.BookHubs.MarketStatus.Trading; } else if (status == TradingStatus.Closed || status == TradingStatus.ClosingAuction || status == TradingStatus.Expired || status == TradingStatus.NotTradable || status == TradingStatus.PostTrading) { e.Status = Misty.Lib.BookHubs.MarketStatus.NotTrading; } else { e.Status = Misty.Lib.BookHubs.MarketStatus.Special; } m_NewEvents.Add(e); } // Session rollover if (changedFieldIds.Contains <FieldId>(FieldId.SessionRollover)) { TradingStatus status = (TradingStatus)eventArgs.Fields.GetField(FieldId.SeriesStatus).Value; Log.NewEntry(LogLevel.Minor, "PriceListener: SessionRollover change {0} is {1}.", instrKey, status.ToString()); Misty.Lib.BookHubs.MarketStatusEventArgs e = new Misty.Lib.BookHubs.MarketStatusEventArgs(); //e.Instrument = instrument; e.InstrumentName = instrKey; if (status == TradingStatus.Trading) { e.Status = Misty.Lib.BookHubs.MarketStatus.Trading; } else if (status == TradingStatus.Closed || status == TradingStatus.ClosingAuction || status == TradingStatus.Expired || status == TradingStatus.NotTradable || status == TradingStatus.PostTrading) { e.Status = Misty.Lib.BookHubs.MarketStatus.NotTrading; } else { e.Status = Misty.Lib.BookHubs.MarketStatus.Special; } m_NewEvents.Add(e); } // // Fire events // ProcessPriceChangeEvents(ref m_NewEvents); }// if instrument not found for ttKey. else { Log.NewEntry(LogLevel.Warning, "{0}: Failed to find instrument for TTKey {1}.", this.Name, key); } } } else { Log.NewEntry(LogLevel.Warning, "{0}: Error in price subscription {1}.", this.Name, eventArgs.Error.Message); } }//PriceSubscription()