Пример #1
0
 //
 //
 // *********************************************************
 // ****            ProcessProductsToRecord()            ****
 // *********************************************************
 /// <summary>
 /// Called by the hub thread to deal with requests for products to record. If more instruments are
 /// requested at a later time this should handle it correctly, however this functionality is largely untested.
 /// </summary>
 /// <param name="requestArg"></param>
 private void ProcessProductsToRecord(DataHubRequest requestArg)
 {
     foreach (object o in requestArg.Data)
     {
         ProductRequest prodRequest = (ProductRequest)o;
         if (!m_ProductRequestList.Contains(prodRequest))
         {                                                      // we have never seen this exact request
             if (!m_ProductsRequested.Contains(prodRequest.Product))
             {                                                  // we have also never requested this product!
                 m_ProductsRequested.Add(prodRequest.Product);
                 m_ProductRequestList.Add(prodRequest);         // add it
                 m_Market.RequestProducts(prodRequest.Product); // request it
             }
             else
             { // we have request this product previously but may need to request more contracts now.
                 foreach (ProductRequest completedRequest in m_ProductRequestList)
                 {
                     if (completedRequest.Product == prodRequest.Product &&
                         prodRequest.nInstrumentsToRecord > completedRequest.nInstrumentsToRecord)
                     {// this is the same product and we want more contracts (if less we ignore it)
                         List <InstrumentName>    instrumentsInProduct;
                         List <InstrumentDetails> instrumentDetailsList;
                         m_InstrumentsByProduct.TryGetValue(prodRequest.Product, out instrumentsInProduct);                 // find all the instruments
                         if (m_Market.TryGetInstrumentDetails(instrumentsInProduct, out instrumentDetailsList))             // get all the details
                         {                                                                                                  // we have instrument details to look at
                             instrumentDetailsList.Sort((x, y) => x.ExpirationDate.CompareTo(y.ExpirationDate));            // sort list by expirations
                             int noOfInstruments = Math.Min(prodRequest.nInstrumentsToRecord, instrumentDetailsList.Count); // if we are trying to subscribe to more contracts than exist!
                             for (int i = completedRequest.nInstrumentsToRecord - 1; i < noOfInstruments; i++)
                             {                                                                                              // for every instrument past what we already have, subscribe
                                 m_Market.RequestInstrumentPriceSubscription(instrumentDetailsList[i].InstrumentName);      // subscribe to instrument
                                 //m_Market.RequestInstrumentTimeAndSalesSubscription(instrumentDetailsList[i].InstrumentName);
                                 m_InstrumentsRequested.Add(instrumentDetailsList[i].InstrumentName);                       // add it to our list of subscriptions.
                             } // end i
                         }
                     }
                 }
             }
         }
     }
 } // ProcessProductsToRecord
Пример #2
0
        }//end HubEvent

        //
        //
        //
        //
        #endregion// Hub Event Handler overrides

        #region Public Methods
        // *****************************************************************
        // ****                     Public Methods                      ****
        // *****************************************************************
        //
        //
        //***********************************************
        // ****             Start()                 ****
        //***********************************************
        public override void Start()
        {
            //
            // Create needed hubs
            //
            m_DatabaseWriterHub = new DatabaseWriterHub(m_DataBaseInfo);
            m_DatabaseWriterHub.Log.AllowedMessages = LogLevel.ShowAllMessages;
            m_DatabaseWriterHub.Log.IsViewActive    = true;
            m_DatabaseWriterHub.WriteCompleted     += new EventHandler(this.HubEventEnqueue);
            m_DatabaseWriterHub.Start();
            m_QueryBuilderHub = new QueryBuilderHub(this, m_DatabaseWriterHub);



            //
            // Set datetime bars.
            //
            DateTime dt           = Log.GetTime();
            double   totalSeconds = dt.Minute * 60.0 + dt.Second;

            dt            = dt.AddSeconds(-totalSeconds);                                   // rip off minutes and seconds.
            totalSeconds  = Math.Ceiling(totalSeconds / m_BarTimeStep) * m_BarTimeStep;     // rounding off to nearest bar.
            totalSeconds += m_BarTimeStep;                                                  // increment to next bar.
            dt            = dt.AddSeconds(totalSeconds);                                    // set bar time.
            dt            = dt.AddMilliseconds(-dt.Millisecond);
            m_NextBar     = dt;
            base.m_WaitListenUpdatePeriod = 100;                                            // update every n ms

            //
            // Find stop time.
            //
            DateTime today     = DateTime.Today;
            DateTime startTime = DateTime.Now;

            m_EndRecordingDateTime = today.AddMinutes(60 * 16 + 20);                        // we want to stop each day at 4:20 pm
            if (m_StopFrequency == StopFrequency.Daily)
            {
                if (startTime > m_EndRecordingDateTime)                                         // it is already past 4:20, so stop the next day at 4:20
                {
                    m_EndRecordingDateTime = m_EndRecordingDateTime.AddDays(1);
                }
            }
            else if (m_StopFrequency == StopFrequency.Weekly)
            {
                int daysToAdd = ((int)DayOfWeek.Friday - (int)startTime.DayOfWeek + 7) % 7;
                m_EndRecordingDateTime = m_EndRecordingDateTime.AddDays(daysToAdd);
            }
            Log.NewEntry(LogLevel.Major, "DataHub: Scheduled Shutdown for {0} ", m_EndRecordingDateTime);

            //
            List <ProductRequest> startingRequestList;

            ProductRequest.TryCreateFromFile("ProductRequest.txt", out startingRequestList);
            //
            // Split requests into smaller subsets to avoid TT Choking.
            //
            if (startingRequestList.Count > m_MaxProductsPerRequest)
            {                                                                                                // we need to subset.
                int reqCount = 0;                                                                            //dummy counter varialble
                while (reqCount < startingRequestList.Count)
                {                                                                                            // iterate through and subset lists until we are completed.
                    List <ProductRequest> subsettedList = new List <ProductRequest>();
                    int endOfList = Math.Min(m_MaxProductsPerRequest, startingRequestList.Count - reqCount); //this ensures we don't mess up the indexing
                    subsettedList = startingRequestList.GetRange(reqCount, endOfList);
                    m_SplitProdReqs.Add(subsettedList);
                    reqCount += m_MaxProductsPerRequest;
                }
            }
            else
            {
                m_SplitProdReqs.Add(startingRequestList);               // no need to subset, just add them all.
            }
            m_nProductRequested = startingRequestList.Count;            // store for reporting purposes
            //
            // Send email's on startup
            //
            if (m_IsEmailOnStartStop)
            { // we can abuse the DataBaseWrtiter to send start and stop emails
                DatabaseWriterEventArgs emailEvent = new DatabaseWriterEventArgs();
                emailEvent.Request = DatabaseWriterRequests.SendEmail;
                emailEvent.QueryBase.AppendFormat("Data Hub Starting {0}", DateTime.Now);
                emailEvent.QueryValues.AppendFormat("Data Hub requesting {0} products to be recorded to {1}. Scheduled for shutdown at {2}",
                                                    m_nProductRequested,
                                                    m_DataBaseInfo.Location,
                                                    m_EndRecordingDateTime);
                m_DatabaseWriterHub.HubEventEnqueue(emailEvent);
            }

            base.Start();
            m_IsReadyToRequest = true;
        }// Start()