public HistoricalQuote ProvideQuote(string ticker, string quoteType, DateTime date)
        {
            HistoricalQuote quote = new HistoricalQuote()
            {
                Ticker = ticker,
                Date   = date
            };
            TWSQuoteObject quoteObject = null;

            try
            {
                if (!Connect())
                {
                    quote.ErrorMessage = "Unable to connect to TWS";
                }
                else
                {
                    lock (m_quoteMapLock)
                    {
                        QuoteType quoteTypeEnum = (QuoteType)Enum.Parse(typeof(QuoteType), quoteType);
                        int       requestId     = m_twsUtilities.GetHistoricalData(ticker, quoteTypeEnum, null, date);
                        if (requestId < 0)
                        {
                            quote.ErrorMessage = "Unable to get historical quote";
                        }
                        else
                        {
                            quoteObject = new TWSQuoteObject(requestId);
                            m_quoteMap.Add(requestId, quoteObject);
                        }
                    }
                }

                if (quoteObject != null)
                {
                    if (!WaitAny(null, quoteObject.WaitHandle))
                    {
                        quote.ErrorMessage = "Request timed out";
                    }
                    else
                    {
                        quoteObject.FillQuote(quote);
                    }
                }
            }
            catch (Exception ex)
            {
                quote.ErrorMessage = ex.Message;
            }

            return(quote);
        }
 public void FillQuote(HistoricalQuote quote)
 {
     if (Quote == null)
     {
         quote.ErrorMessage = "Internal error: HistoricalDataEventArgs is missing from TWSQuoteObject";
     }
     else
     {
         quote.Open         = Quote.Open;
         quote.Close        = Quote.Close;
         quote.High         = Quote.High;
         quote.Low          = Quote.Low;
         quote.Wap          = Quote.WAP;
         quote.Volume       = Quote.Volume;
         quote.ErrorMessage = Quote.ErrorMessage;
     }
 }