예제 #1
0
        }//UpdateQuotes().

        //
        //
        // *************************************************
        // ****         MarketInstrumentChanged()       ****
        // *************************************************
        public void MarketInstrumentChanged(Book marketBook, InstrumentChangeArgs eventArgs)
        {
            if (m_IsQuoteSideUpdateRequired[0] || m_IsQuoteSideUpdateRequired[1])
            {
                UpdateQuotes();
            }
        }// MarketInstrumentChanged()
예제 #2
0
        }// MarketInstrumentInitialized()

        //
        //
        #endregion //Startup methods


        #region Public Run-Time methods
        //
        //
        //
        // ****************************************************************
        // ****                 MarketInstrumentChanged()              ****
        // ****************************************************************
        /// <summary>
        /// The main pricing update.
        /// </summary>
        /// <param name="marketBook"></param>
        /// <param name="eventArgs"></param>
        /// <param name="isForceUpdate"></param>
        public void MarketInstrumentChanged(Book marketBook, InstrumentChangeArgs eventArgs, bool isForceUpdate)
        {
            foreach (PricingEngine pricingEngine in this.PricingEngines)
            {
                pricingEngine.MarketInstrumentChanged(marketBook, eventArgs);
            }
            m_QuoteEngine.MarketInstrumentChanged(marketBook, eventArgs);
        }// MarketInstrumentChanged()
예제 #3
0
        }// MarketInstrumentInitialized()

        //
        //
        //
        // ****************************************************************
        // ****                 MarketInstrumentChanged()              ****
        // ****************************************************************
        /// <summary>
        /// The main pricing update.
        /// </summary>
        /// <param name="marketBook"></param>
        /// <param name="isForceUpdate"></param>
        public void MarketInstrumentChanged(Book marketBook, InstrumentChangeArgs eventArgs, bool isForceUpdate)
        {
            m_PricingEngine.MarketInstrumentChanged(marketBook, eventArgs);

            /*
             * if (m_OrderEngine != null && m_OrderEngine.m_OrderInstrument != null)
             * {
             *  m_OrderEngine.UpdateOrders(isForceUpdate);	// TODO: we need not check this if pricing model is not changed recently.
             *  if (isForceUpdate)
             *      m_OrderEngine.SynchronizeRunningState();
             * }
             */
        }// MarketChange()
예제 #4
0
        }// MarketInstrumentInitialized()

        //
        //
        //
        // ****************************************************
        // ****         Market Instrument Changed()        ****
        // ****************************************************
        /// <summary>
        /// Called whenever the market changes.
        /// Notes:
        ///     1) If you extend the PricingEngine class, and override this
        ///         method, call this base version first!
        /// </summary>
        /// <param name="marketBook"></param>
        /// <returns></returns>
        public virtual bool MarketInstrumentChanged(Book marketBook, InstrumentChangeArgs eventArgs)
        {
            this.m_IsUpdateRequired = false;                    // reset my flag.
            ImpliedMarket.SetMarket(marketBook, m_Legs);        // update my market depth

            // Inform subscribers of market change.
            bool isMarketSubscriberChanged = false;

            foreach (IMarketSubscriber iMarketSubscriber in m_MarketSubscribers)
            {
                isMarketSubscriberChanged = iMarketSubscriber.MarketInstrumentChanged(marketBook, eventArgs) || isMarketSubscriberChanged;
            }

            return(isMarketSubscriberChanged);
        }//end MarketChange().
예제 #5
0
        //
        //
        /// <summary>
        /// Called by the executionListener thread to process an event on the queue.
        /// </summary>
        private void ProcessEvent()
        {
            if (m_isDisposing)
            {
                return;
            }
            EventArgs e;

            while (m_InQueue.TryDequeue(out e))   //remove from threadsafe queue
            {
                m_WorkQueue.Enqueue(e);           // place on my current work stack
            }
            //
            // Process all events now
            //
            while (m_WorkQueue.Count > 0)
            {
                e = m_WorkQueue.Dequeue();
                if (e is EngineEventArgs)
                {
                    EngineEventArgs engEvent = (EngineEventArgs)e;
                    if (engEvent.EngineID >= 0)
                    {
                        m_ExecContainer.EngineList[engEvent.EngineID].ProcessEvent(engEvent);
                        if (engEvent.Status == EngineEventArgs.EventStatus.Confirm || engEvent.Status == EngineEventArgs.EventStatus.Failed)
                        {
                            m_EngineHub.OnEngineChanged(engEvent);
                        }
                    }
                    if (engEvent.MsgType == EngineEventArgs.EventType.SyntheticOrder)
                    {
                        m_ExecContainer.IOrderEngine.ProcessEvent(e);
                    }
                }
                else if (e is InstrumentChangeArgs)
                { // this is a market update.
                    // 1. Fill Orders ( we should do this first)
                    // 2. Update Internal Markets
                    InstrumentChangeArgs instrChangeArgs = (InstrumentChangeArgs)e;
                    m_MarketInstrumentIdChangedList.Clear();      // load ids for instruments we need to check.
                    foreach (KeyValuePair <int, InstrumentChange> pair in instrChangeArgs.ChangedInstruments)
                    {
                        if (pair.Value.MarketDepthChanged[QTMath.BidSide].Contains(0) || pair.Value.MarketDepthChanged[QTMath.AskSide].Contains(0))
                        {
                            m_MarketInstrumentIdChangedList.Add(pair.Value.InstrumentID);
                        }
                    }
                    if (m_MarketInstrumentIdChangedList.Count > 0)
                    {
                        SimulateFills(m_MarketInstrumentIdChangedList);
                        SimulateMarketUpdates(m_MarketInstrumentIdChangedList);
                    }
                }
                else if (e is FoundServiceEventArg)
                {
                    FoundServiceEventArg foundServiceEvent = (FoundServiceEventArg)e;
                    if (foundServiceEvent.FoundInstruments != null && foundServiceEvent.FoundInstruments.Count != 0)
                    {
                        foreach (InstrumentName instrName in foundServiceEvent.FoundInstruments)
                        {
                            if (!m_ExecContainer.m_Markets.ContainsKey(instrName))
                            {
                                UV.Lib.BookHubs.Market newMarket = UV.Lib.BookHubs.Market.Create(instrName);
                                m_ExecContainer.m_Markets.Add(instrName, newMarket);
                            }
                            InstrumentDetails instrDetails;
                            if (m_Market.TryGetInstrumentDetails(instrName, out instrDetails))
                            {
                                ProcessInstrumentsFound(instrDetails);
                            }
                        }
                    }
                }
            }
        }
예제 #6
0
        //
        protected override InstrumentChangeArgs ProcessBookEventsForABook(int bookID, List <EventArgs> eArgList)
        {
            BookHubs.Book         aBook           = m_Book[bookID];
            List <InstrumentName> newMarketsFound = null;
            int ithInstr = 0;

            while (ithInstr < m_InstrumentsToUpdate.Count)
            {
                int             instrId = m_InstrumentsToUpdate[ithInstr];
                BookHubs.Market mkt;
                if (!aBook.Instruments.TryGetValue(instrId, out mkt))
                {
                    ithInstr++;
                    continue;
                }
                DB.Queries.MarketDataItem mktItems = m_MarketItems[instrId][m_MarketItemPtrs[instrId]];
                bool   isChanged = false;
                double p;
                int    q;
                bool   firstUpdate = mkt.DeepestLevelKnown < 0;
                for (int side = 0; side < 2; ++side)
                {
                    p = mktItems.Price[side];
                    q = mktItems.Qty[side];
                    if (p != mkt.Price[side][0] || q != mkt.Qty[side][0])
                    {
                        mkt.SetMarket(side, 0, p, q, mkt.Volume[side], 0);
                        isChanged = true;
                    }
                }
                if (!isChanged)
                {
                    m_InstrumentsToUpdate.RemoveAt(ithInstr);
                    if (firstUpdate)
                    {
                        mkt.DeepestLevelKnown = -1;                 // keep this -1 to remember we are not updated.
                    }
                }
                else
                {
                    if (firstUpdate)
                    {
                        if (newMarketsFound == null)
                        {
                            newMarketsFound = new List <InstrumentName>();
                        }
                        newMarketsFound.Add(mkt.Name);
                    }
                    ithInstr++;
                }
            }
            // New instruments found?
            if (newMarketsFound != null)
            {
                OnMarketInstrumentFound(newMarketsFound);
            }

            InstrumentChangeArgs instrChangedArgs = new InstrumentChangeArgs();     // create change args for all instruments

            foreach (int instrId in m_InstrumentsToUpdate)
            {
                instrChangedArgs.AppendChangedInstrument(instrId, m_ChangedDepths); // assume all changes are top of book
            }
            return(instrChangedArgs);
        }// ProcessBookEventsForABook()