/// <summary>
        /// Looks for white marubozus.
        /// </summary>
        private void LookForWhiteMarubozus(CandlestickAnalyzer candlestick, List<StockDaily> dailies, int index, DateTime date)
        {
            if (candlestick.IsWhiteMarubozu())
            {
                var peekIndex = index + 1;
                var lumens = 0;
                while (peekIndex < dailies.Count)
                {
                    if (dailies[peekIndex].LowPrice > candlestick.Low)
                    {
                        lumens++;
                    }
                    else
                    {
                        break;
                    }

                    if (peekIndex - index >= 20)
                    {
                        break;
                    }

                    peekIndex++;
                }

                this.whiteMarubozuNumOccurences++;
                this.whiteMarubozuTotalLumens += lumens;
                this.whiteMarubozuLumenRating = Convert.ToInt32(this.whiteMarubozuTotalLumens / this.whiteMarubozuNumOccurences);

                Console.WriteLine("White Marubozus -- Symbol=" + candlestick.TickerSymbol + ";  Date=" + date.ToShortDateString() + ";  Lumens=" + lumens + "; Rating=" + this.whiteMarubozuLumenRating);
            }
        }
        public void UpdateStatistics()
        {
            List<string> tickers;
            using (var context = new StockScreenerEntities())
            {
                tickers = context.Stocks.Select(stock => stock.Ticker).ToList();
            }

            foreach (var ticker in tickers)
            {
                using (var context = new StockScreenerEntities())
                {
                    var tickerEntries = context.CandlesticksToStocks.Where(entry => entry.Ticker.Equals(ticker));
                    foreach (var entry in tickerEntries)
                    {
                        context.CandlesticksToStocks.DeleteObject(entry);
                    }

                    context.SaveChanges();
                }

                List<StockDaily> dailies;
                using (var context = new StockScreenerEntities())
                {
                    dailies = context.Stocks.First(stock => stock.Ticker.Equals(ticker)).StockDailies.ToList();
                }

                if (dailies.Count > 0)
                {
                    var averageDailyRange = dailies.Average(daily => Math.Abs(daily.HighPrice - daily.LowPrice));

                    for (var index = 0; index < dailies.Count; index++)
                    {
                        var daily = dailies[index];
                        var candlestick = new CandlestickAnalyzer(
                            daily.Exchange, ticker, daily.OpenPrice, daily.HighPrice, daily.LowPrice, daily.ClosePrice, averageDailyRange);

                        this.LookForWhiteMarubozus(candlestick, dailies, index, daily.Date);
                        this.LookForClosingWhiteMarubozus(candlestick, dailies, index, daily.Date);
                        this.LookForOpeningWhiteMarubozus(candlestick, dailies, index, daily.Date);
                        this.LookForDragonflyDoji(candlestick, dailies, index, daily.Date);
                    }
                }
            }

            using (var context = new StockScreenerEntities())
            {
                var whiteMarubozu = context.Candlesticks.First(candle => candle.ID == PatternIds.WhiteMarubozu);
                var whiteClosingMarubozu = context.Candlesticks.First(candle => candle.ID == PatternIds.WhiteClosingMarubozu);
                var whiteOpeningMarubozu = context.Candlesticks.First(candle => candle.ID == PatternIds.WhiteOpeningMarubozu);
                var dragonflyDoji = context.Candlesticks.First(candle => candle.ID == PatternIds.DragonflyDoji);

                whiteMarubozu.LumenRating = this.whiteMarubozuLumenRating;
                whiteMarubozu.NumOccurrences = this.whiteMarubozuNumOccurences;

                whiteClosingMarubozu.LumenRating = this.closingWhiteMarubozuLumenRating;
                whiteClosingMarubozu.NumOccurrences = this.closingWhiteMarubozuNumOccurences;

                whiteOpeningMarubozu.LumenRating = this.openingWhiteMarubozuLumenRating;
                whiteOpeningMarubozu.NumOccurrences = this.openingWhiteMarubozuNumOccurences;

                dragonflyDoji.LumenRating = this.dragonflyDojiLumenRating;
                dragonflyDoji.NumOccurrences = this.dragonflyDojiNumOccurences;

                context.SaveChanges();
            }
        }
        private void LookForMarubozus()
        {
            List<string> tickers;
            using (var context = new StockScreenerEntities())
            {
                tickers = context.Stocks.Select(stock => stock.Ticker).ToList();
            }

            foreach (var ticker in tickers)
            {
                List<StockDaily> dailies;
                using (var context = new StockScreenerEntities())
                {
                    dailies = context.Stocks.First(stock => stock.Ticker.Equals(ticker)).StockDailies.ToList();
                }

                if (dailies.Count > 0)
                {
                    var averageDailyRange = dailies.Average(daily => Math.Abs(daily.HighPrice - daily.LowPrice));

                    for (var index = 0; index < dailies.Count; index++)
                    {
                        var daily = dailies[index];
                        var candlestick = new CandlestickAnalyzer(
                            daily.Exchange, ticker, daily.OpenPrice, daily.HighPrice, daily.LowPrice, daily.ClosePrice, averageDailyRange);

                        this.LookForWhiteMarubozus(candlestick, dailies, index, daily.Date);
                        this.LookForClosingWhiteMarubozus(candlestick, dailies, index, daily.Date);
                        this.LookForOpeningWhiteMarubozus(candlestick, dailies, index, daily.Date);
                    }
                }
            }
        }
        /// <summary>
        /// Looks for white marubozus.
        /// </summary>
        private void LookForWhiteMarubozus(CandlestickAnalyzer candlestick, List<StockDaily> dailies, int index, DateTime date)
        {
            if (candlestick.IsWhiteMarubozu())
            {
                var peekIndex = index + 1;
                var lumens = 0;
                while (peekIndex < dailies.Count)
                {
                    if (dailies[peekIndex].LowPrice > candlestick.Low)
                    {
                        lumens++;
                    }
                    else
                    {
                        break;
                    }

                    if (peekIndex - index >= 100)
                    {
                        break;
                    }

                    peekIndex++;
                }

                this.whiteMarubozuNumOccurences++;
                this.whiteMarubozuTotalLumens += lumens;
                this.whiteMarubozuLumenRating = Convert.ToInt32(this.whiteMarubozuTotalLumens / this.whiteMarubozuNumOccurences);

                Console.WriteLine("White Marubozus -- Symbol=" + candlestick.TickerSymbol + ";  Date=" + date.ToShortDateString() + ";  Lumens=" + lumens + "; Rating=" + this.whiteMarubozuLumenRating);

                using (var context = new StockScreenerEntities())
                {
                    if (context.CandlesticksToStocks.Count(entry => entry.CandlestickId == PatternIds.WhiteMarubozu && entry.Ticker.Equals(candlestick.TickerSymbol)) > 0)
                    {
                        var candlestickToStock = context.CandlesticksToStocks.First(
                            entry =>
                            entry.CandlestickId == PatternIds.WhiteMarubozu
                            && entry.Ticker.Equals(candlestick.TickerSymbol));

                        var newLumenRating = ((candlestickToStock.LumenRating * candlestickToStock.NumOccurrences)
                                              + lumens) / ++candlestickToStock.NumOccurrences;

                        candlestickToStock.LumenRating = newLumenRating;
                    }
                    else
                    {
                        context.CandlesticksToStocks.AddObject(new CandlesticksToStock
                        {
                            CandlestickId = PatternIds.WhiteMarubozu,
                            Exchange = candlestick.Exchange,
                            Ticker = candlestick.TickerSymbol,
                            LumenRating = lumens,
                            NumOccurrences = 1
                        });
                    }

                    context.SaveChanges();
                }
            }
        }