Esempio n. 1
0
        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>());
        }
Esempio n. 2
0
        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
Esempio n. 3
0
        //
        //
        //
        // ****             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()