private void LookForEntrances()
        {
            positionReturns = 0;

            this.DisplayWatchLists();
            Console.Write("Select ID of watch list to analzye. ([Blank] to cancel.) -->  ");
            var input = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(input))
            {
                Console.WriteLine();
                return;
            }

            int id;
            if (!int.TryParse(input, out id))
            {
                Console.WriteLine("Invalid input...no watch list was selected.");
                Console.WriteLine();
                return;
            }

            List<Watchlist> watchLists;
            using (var context = new StockScreenerEntities())
            {
                watchLists = context.Watchlists.ToList();
            }

            if (watchLists.Count(list => list.ID == id) <= 0)
            {
                Console.WriteLine("Invalid input...no watch list was selected.");
                Console.WriteLine();
            }
            else
            {
                List<string> tickers;
                using (var context = new StockScreenerEntities())
                {
                    tickers =
                        context.Watchlists.First(list => list.ID == id).Stocks.Select(stock => stock.Ticker).ToList();
                }

                Console.WriteLine("Working...");

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

                    var history = dailies.Select(daily => new PriceData(daily)).ToList();

                    // Cleanup
                    const float Epsilon = 0.000001f;
                    history.RemoveAll(priceData => priceData.Volume == 0);
                    history.RemoveAll(priceData => Math.Abs(priceData.Open - 0.0f) < Epsilon);
                    history.RemoveAll(priceData => Math.Abs(priceData.High - 0.0f) < Epsilon);
                    history.RemoveAll(priceData => Math.Abs(priceData.Low - 0.0f) < Epsilon);
                    history.RemoveAll(priceData => Math.Abs(priceData.Close - 0.0f) < Epsilon);

                    if (history.Count <= 0)
                    {
                        continue;
                    }

                    positionReturns += RunPositionTest(ticker, history).NetUnrealizedProfitLosses;
                }

                Console.WriteLine("Watch list was analyized.  Net returns {0:C}", positionReturns);
                Console.WriteLine();
            }
        }
        /// <summary>
        /// Updates the tickers in watch list.
        /// </summary>
        private void UpdateTickersInWatchList()
        {
            positionReturns = 0;

            this.DisplayWatchLists();
            Console.Write("Select ID of watch list to update. ([Blank] to cancel.) -->  ");
            var input = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(input))
            {
                Console.WriteLine();
                return;
            }

            int id;
            if (!int.TryParse(input, out id))
            {
                Console.WriteLine("Invalid input...no watch list was updated.");
                Console.WriteLine();
                return;
            }

            List<Watchlist> watchLists;
            using (var context = new StockScreenerEntities())
            {
                watchLists = context.Watchlists.ToList();
            }

            if (watchLists.Count(list => list.ID == id) <= 0)
            {
                Console.WriteLine("Invalid input...no watch list was upated.");
                Console.WriteLine();
            }
            else
            {
                List<string> tickers;
                using (var context = new StockScreenerEntities())
                {
                    tickers = context.Stocks.Select(stock => stock.Ticker).ToList();
                }

                var tickersToAdd = new List<string>();

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

                    var history = dailies.Select(daily => new PriceData(daily)).ToList();

                    // Cleanup
                    const float Epsilon = 0.000001f;
                    history.RemoveAll(priceData => priceData.Volume == 0);
                    history.RemoveAll(priceData => Math.Abs(priceData.Open - 0.0f) < Epsilon);
                    history.RemoveAll(priceData => Math.Abs(priceData.High - 0.0f) < Epsilon);
                    history.RemoveAll(priceData => Math.Abs(priceData.Low - 0.0f) < Epsilon);
                    history.RemoveAll(priceData => Math.Abs(priceData.Close - 0.0f) < Epsilon);

                    if (history.Count <= 0)
                    {
                        continue;
                    }

                    var results = RunPositionTest(ticker, history);

                    Console.WriteLine(ticker + ":  {0:C}", results.NetUnrealizedProfitLosses);

                    positionReturns += results.NetUnrealizedProfitLosses;

                    if (results.NetUnrealizedProfitLosses > 0)
                    {
                        tickersToAdd.Add(ticker);
                    }
                }

                using (var context = new StockScreenerEntities())
                {
                    var listToUpdate = context.Watchlists.First(list => list.ID == id);
                    listToUpdate.Stocks.Clear();

                    foreach (var ticker in tickersToAdd)
                    {
                        var stockToAdd = context.Stocks.First(stock => stock.Ticker.Equals(ticker));
                        listToUpdate.Stocks.Add(stockToAdd);
                    }

                    context.SaveChanges();
                }

                Console.WriteLine("Watch list was updated.  Net Returns:   {0:C}", positionReturns);
                Console.WriteLine();
            }
        }
        private void CreateWorksheet()
        {
            Console.WriteLine();
            Console.Write("Enter the ticker symbol [BLANK to cancel] -->  ");

            var ticker = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(ticker))
            {
                return;
            }

            using (var context = new StockScreenerEntities())
            {
                if (context.Stocks.Count(stock => stock.Ticker.Equals(ticker)) <= 0)
                {
                    Console.WriteLine("Invalid Ticker Symbol");
                    Console.WriteLine();
                    return;
                }

                var history = context.Stocks.First(stock => stock.Ticker.Equals(ticker)).StockDailies.Select(daily => new PriceData(daily)).ToList();

                // Cleanup
                const float Epsilon = 0.000001f;
                history.RemoveAll(priceData => priceData.Volume == 0);
                history.RemoveAll(priceData => Math.Abs(priceData.Open - 0.0f) < Epsilon);
                history.RemoveAll(priceData => Math.Abs(priceData.High - 0.0f) < Epsilon);
                history.RemoveAll(priceData => Math.Abs(priceData.Low - 0.0f) < Epsilon);
                history.RemoveAll(priceData => Math.Abs(priceData.Close - 0.0f) < Epsilon);

                if (history.Count <= 0)
                {
                    Console.WriteLine("Ticker does not have valid price history records.");
                    Console.WriteLine();
                    return;
                }

                var results = RunPositionTest(ticker, history);
                var filename = ticker.Trim() + "_Worksheet.csv";
                new WorksheetWriter().WriteWorksheetToCsv(filename, results.Worksheet);
                System.Diagnostics.Process.Start(filename);
            }
        }
        /// <summary>
        /// Displays a listing of the current watch lists.
        /// </summary>
        private void DisplayWatchLists()
        {
            Console.WriteLine("----------------------------------------");
            Console.WriteLine("Current Watch Lists");
            Console.WriteLine("----------------------------------------");
            Console.WriteLine();

            using (var context = new StockScreenerEntities())
            {
                var watchLists = context.Watchlists.ToList();

                if (watchLists.Count <= 0)
                {
                    Console.WriteLine("No Current Watch Lists");
                }

                foreach (var list in watchLists)
                {
                    Console.WriteLine(list.ID + "\t" + list.Name);
                }
            }

            Console.WriteLine();
        }
        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);
                    }
                }
            }
        }
        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();
            }
        }
        /// <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();
                }
            }
        }
        /// <summary>
        /// Lists the candlestick patterns stored in the database.
        /// </summary>
        private void ListPatterns()
        {
            Console.WriteLine("----------------------------------------");
            Console.WriteLine("Candlestick Patterns");
            Console.WriteLine("----------------------------------------");
            Console.WriteLine();

            using (var context = new StockScreenerEntities())
            {
                var candlesticks = context.Candlesticks.ToList();

                if (candlesticks.Count <= 0)
                {
                    Console.WriteLine("No Candlestick Patterns");
                }

                foreach (var candlestick in candlesticks)
                {
                    Console.WriteLine("{0} - {1}\t\t Frequency: {2}\t\t Lumens: {3}", candlestick.ID, candlestick.Name, candlestick.NumOccurrences, candlestick.LumenRating);
                }
            }

            Console.WriteLine();
        }
        /// <summary>
        /// Adds a new candlestick pattern.
        /// </summary>
        private void AddCandlestickPattern()
        {
            // First, display a list of existing watch lists.
            this.ListPatterns();

            // Prompt the user to enter a name for the new watch list.
            Console.Write("Enter new candlestick name ([Blank] to cancel) -->  ");
            var name = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(name))
            {
                // The user opted to cancel without entering a name.
                Console.WriteLine();
                return;
            }

            // Prompt the user to confirm the inputted name.
            Console.Write("Create candlestick named '" + name + "'?  (Y/N) -->  ");
            var isConfirmed = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(isConfirmed) || !isConfirmed.ToUpper().Equals("Y"))
            {
                // The user did not confirm the name.
                Console.WriteLine("Candlestick not created.");
                Console.WriteLine();
                return;
            }

            // Create a new entry in the database using the inputted name.
            using (var context = new StockScreenerEntities())
            {
                try
                {
                    context.Candlesticks.AddObject(new Candlestick { Name = name });
                    context.SaveChanges();
                    Console.WriteLine("Candlestick was created.");
                    Console.WriteLine();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }