예제 #1
0
        public async Task <string> SelectRandomGoodFirms()
        {
            _logger.LogInformation("Starting to select firms for the requester");
            List <PiotroskiScoreMd> selectedFirms;

            try
            {
                selectedFirms = _connectionHandlerCF.Get(r => r.Rating >= 7 && r.FYear == DateTime.Now.Year)
                                .ToList();
                if (selectedFirms == null || !selectedFirms.Any())
                {
                    selectedFirms = _connectionHandlerCF.Get(r => r.Rating >= 7 && r.FYear == DateTime.Now.Year - 1)
                                    .ToList();
                }
                if (!selectedFirms.Any())
                {
                    return("");
                }
            }
            catch (Exception ex)
            {
                _logger.LogCritical("Error while getting data from MongoDb from Collection PiotroskiScore");
                _logger.LogCritical(ex.Message);
                return("");
            }
            selectedFirms.Shuffle();
            selectedFirms = selectedFirms.Take(4)
                            .OrderByDescending(r => r.Rating)
                            .ThenByDescending(r => r.Revenue)
                            .ToList();
            var messageString = new StringBuilder();

            messageString.Append("Here are a few recommendations for you.\n");
            foreach (var selectedFirm in selectedFirms)
            {
                var companyName = await _resolveCompanyName.ResolveTicker(selectedFirm.Ticker);

                var symbol = Regex.Replace(selectedFirm.Ticker, ".{1}", "$0 ");
                messageString.Append($"{companyName} with ticker {symbol} has Piotrosk-F Score of {selectedFirm.Rating}\n");
                QuotesFromWorldTrading quotes = await _obtainStockQuote.GetStockQuotes(selectedFirm.Ticker);

                var companyStats = await ObtainCompanyStats(selectedFirm.Ticker);

                if (quotes != null && quotes.Data.Any())
                {
                    var currentPrice = (float)quotes.Data[0].Price;
                    messageString.Append($"It last traded at ${Math.Round(currentPrice,2)}. ");
                }
                if (companyStats != null && companyStats.week52high != 0)
                {
                    var week52Low  = Math.Round(companyStats.week52low, 2);
                    var week52High = Math.Round(companyStats.week52high, 2);
                    var peRatio    = companyStats.peRatio == null ? 0 : companyStats.peRatio;
                    messageString.Append($"52 week range is between ${week52Low} and {week52High} and P E Ratio is {peRatio}. ");
                }
                messageString.Append("\n\n");
            }
            return(messageString.ToString());
        }
예제 #2
0
        private WebhookResponse BuildOutputMessage(QuotesFromWorldTrading indexData)
        {
            StringBuilder tmpStr = new StringBuilder();

            if (indexData.Data.Length >= 1)
            {
                var dateToUse = indexData.Data[0].Last_trade_time == null?DateTime.Parse("01-01-2000") :
                                    (DateTime)indexData.Data[0].Last_trade_time;

                tmpStr.Append("As of ");
                tmpStr.Append($"{dateToUse.ToString("MMMM dd, hh:mm tt")} EST ");
            }
            foreach (var idxData in indexData.Data)
            {
                float price     = idxData.Price != null ? (float)idxData.Price : 0;
                float dayChange = idxData.Day_change == null ? 0 : (float)idxData.Day_change;
                tmpStr.Append($"{idxData.Name}  is at  {Math.Round(price, 0)}. ");
                tmpStr.Append(idxData.Day_change > 0 ? " Up by " : "Down by ");
                tmpStr.Append($"{Math.Abs(Math.Round(dayChange, 0))} points.\n\n ");
            }

            //var xml = await new Ssml().Say("As of ")
            //	.Say(indexData.Data[0].Last_trade_time).As(DateFormat.MonthDayYear)
            //	.Say(indexData.Data[0].Last_trade_time.TimeOfDay).In(TimeFormat.TwelveHour)
            //	.Say(indexData.Data[0].Name + " is at ")
            //	.Say(Convert.ToInt32(indexData.Data[0].Price)).AsCardinalNumber()
            //	.Say(indexData.Data[0].Day_change > 0 ? " Up by " : " Down by ")
            //	.Say(Convert.ToInt32(Math.Abs(Math.Round(indexData.Data[0].Day_change)))).AsCardinalNumber()
            //	.Say(indexData.Data[1].Name + " is at ")
            //	.Say(Convert.ToInt32(indexData.Data[1].Price)).AsCardinalNumber()
            //	.Say(indexData.Data[1].Day_change > 0 ? " Up by " : " Down by ")
            //	.Say(Convert.ToInt32(Math.Abs(Math.Round(indexData.Data[1].Day_change)))).AsCardinalNumber()
            //	.Say(indexData.Data[2].Name + " is at ")
            //	.Say(Convert.ToInt32(indexData.Data[2].Price)).AsCardinalNumber()
            //	.Say(indexData.Data[2].Day_change > 0 ? " Up by " : " Down by ")
            //	.Say(Convert.ToInt32(Math.Abs(Math.Round(indexData.Data[2].Day_change)))).AsCardinalNumber()
            //	.ToStringAsync();

            var returnValue = new WebhookResponse
            {
                FulfillmentText = tmpStr.ToString()
            };

            return(returnValue);
        }
예제 #3
0
        public async Task <WebhookResponse> GetIndicesValuesAsync()
        {
            var tickers = new List <string>
            {
                "^DJI",
                "^IXIC",
                "^INX"
            };
            var tmpStr = new StringBuilder();

            tmpStr.AppendJoin(',', tickers);

            QuotesFromWorldTrading indexData = await _envHandler.ObtainFromWorldTrading(tmpStr.ToString());

            WebhookResponse returnValue = BuildOutputMessage(indexData);

            return(returnValue);
        }
예제 #4
0
        private string BuildOutputMsg(QuotesFromWorldTrading quotes)
        {
            if (quotes.Data.Length == 0)
            {
                return("Could not resolve requested firm or ticker");
            }
            var      tmpStr    = new StringBuilder();
            DateTime dateToUse = quotes.Data[0].Last_trade_time != null ? (DateTime)quotes.Data[0].Last_trade_time : DateTime.Parse("01-01-2000");

            tmpStr.Append($"As of {dateToUse.ToString("MMMM dd, hh:mm tt")} EST ");
            foreach (var quote in quotes.Data)
            {
                float price = quote.Price != null ? (float)quote.Price : 0;
                quote.Day_change = quote.Day_change == null ? 0 : quote.Day_change;
                var symbol = Regex.Replace(quote.Symbol, ".{1}", "$0 ");
                tmpStr.Append($"{quote.Name} with ticker {symbol} was traded at {price.ToString("c2")}.");
                tmpStr.Append(quote.Day_change > 0 ? " Up by " : " Down by ");
                tmpStr.Append($"{((float)quote.Day_change).ToString("n2")} points.\n\n ");
            }
            return(tmpStr.ToString());
        }
예제 #5
0
        /// <summary>
        /// Builds the output MSG.
        /// </summary>
        /// <param name="quotes">The quotes.</param>
        /// <returns></returns>
        private string BuildOutputMsg(QuotesFromWorldTrading quotes)
        {
            if (quotes.Data.Length == 0)
            {
                return("Could not resolve requested firm or ticker");
            }
            var tmpStr     = new StringBuilder();
            var datumToUse = quotes.Data.ToList().OrderByDescending(x => x.Last_trade_time);

            var dateToUse = (DateTime)datumToUse.First().Last_trade_time != null ?
                            (DateTime)datumToUse.First().Last_trade_time : DateTime.Parse("01-01-2000");

            if (DateTime.Now.AddDays(-4) > dateToUse)
            {
                var symbol  = Regex.Replace(datumToUse.First().Symbol, ".{1}", "$0 ");
                var company = datumToUse.First().Name;
                return($"Believe {company} with symbol {symbol} was last traded more " +
                       "than 4 days ago; nothing to report now\n");
            }
            tmpStr.Append($"As of {dateToUse.ToString("MMMM dd, hh:mm tt")} EST ");
            foreach (var quote in quotes.Data)
            {
                var a = quote.Last_trade_time != null ?
                        (DateTime)quote.Last_trade_time : DateTime.Parse("01-01-2000");
                if (DateTime.Now.AddDays(-4) > a)
                {
                    //if the quote is older than 4 days the most probably it is not an actively traded security.
                    continue;
                }
                float price = quote.Price != null ? (float)quote.Price : 0;
                quote.Day_change = quote.Day_change == null ? 0 : quote.Day_change;
                var symbol = Regex.Replace(quote.Symbol, ".{1}", "$0 ");
                tmpStr.Append($"{quote.Name} with ticker {symbol} was traded at {price.ToString("c2")}.");
                tmpStr.Append(quote.Day_change > 0 ? " Up by " : " Down by ");
                tmpStr.Append($"{(Math.Abs((float)quote.Day_change)).ToString("n2")} points.\n\n ");
            }
            return(tmpStr.ToString());
        }
예제 #6
0
        /// <summary>
        /// Builds the index MSG.
        /// </summary>
        /// <param name="indexData">The index data.</param>
        /// <returns></returns>
        private string BuildIndexMsg(QuotesFromWorldTrading indexData)
        {
            StringBuilder tmpStr = new StringBuilder();

            if (indexData.Data.Length >= 1)
            {
                var dateToUse = indexData.Data[0].Last_trade_time == null?DateTime.Parse("01-01-2000") :
                                    (DateTime)indexData.Data[0].Last_trade_time;

                tmpStr.Append("As of ");
                tmpStr.Append($"{dateToUse.ToString("MMMM dd, hh:mm tt")} EST ");
            }
            foreach (var idxData in indexData.Data)
            {
                float price     = idxData.Price != null ? (float)idxData.Price : 0;
                float dayChange = idxData.Day_change == null ? 0 : (float)idxData.Day_change;
                tmpStr.Append($"{idxData.Name}  was at  {Math.Round(price, 0)}. ");
                tmpStr.Append(idxData.Day_change > 0 ? " Up by " : "Down by ");
                tmpStr.Append($"{Math.Abs(Math.Round(dayChange, 0))} points.\n\n ");
            }

            return(tmpStr.ToString());
        }