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()); } } }