// // // ********************************************************* // **** 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
}//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()