示例#1
0
        public static List <StockValue> Read(string path, CsvFormat fmt)
        {
            var lines = File.ReadAllLines(path);

            var result = new List <StockValue>();

            int startlineCount = fmt.ContainsHeader ? 1 : 0;

            for (int i = startlineCount; i < lines.Length; i++)
            {
                string[] cuts = lines[i].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

                if (cuts.Length == 0)
                {
                    throw new FormatException("Check csv files format.");
                }

                var value = new StockValue(
                    symbol: path,
                    dateTime: DateTime.ParseExact(cuts[fmt.DateTimeIndex], fmt.DateTimeFormat, CultureInfo.InvariantCulture),
                    price: decimal.Parse(cuts[fmt.PriceIndex], CultureInfo.InvariantCulture),
                    volume: 1);

                result.Add(value);
            }

            return(result);
        }
示例#2
0
            public bool TryGetStocks(int page, StockValue searchParameter, out StockData data)
            {
                try
                {
                    var query = GetQuery(page, searchParameter);
                    var url   = $"https://jsonmock.hackerrank.com/api/stocks/search/?{query}";

                    var json = _client.GetStringAsync(url).Result; //make it synchronious

                    data = JsonConvert.DeserializeObject <StockData>(json.Replace("_", ""));

                    return(data.Data.Length > 0);
                }
                catch
                {
                    data = new StockData
                    {
                        Data       = new StockValue[0],
                        Page       = 1,
                        PerPage    = 0,
                        Total      = 0,
                        TotalPages = 0
                    };

                    return(false);
                }
            }
示例#3
0
        public StatusMessage InsertStockValue(StockValue data)
        {
            StatusMessage result = new StatusMessage();

            if (_stockContext != null)
            {
                try
                {
                    if (!_stockContext.Stocks.Any(x => x.Code.Equals(data.Code, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        _stockContext.Stocks.Add(data);
                        _stockContext.SaveChanges();

                        result = new StatusMessage(MSG_TYPE.SUCCESS, "Datos insertados correctamente");
                    }
                }
                catch (Exception error)
                {
                    LoggerHelper.LogException(true, error);
                    result = GetErrorMessage(error);
                }
            }

            return(result);
        }
示例#4
0
        public async Task <Response <IEnumerable <StockValue> > > GetStockDataAsync(string ids)
        {
            var fnResult = new Response <IEnumerable <StockValue> >
            {
                StatusCode = (int)HttpStatusCode.BadRequest
            };

            try
            {
                var stockTickers = ids.Split(",");

                var uri = _yahooFinanceApiSettings.BaseClient + string.Format(_yahooFinanceApiSettings.GetQuotesUri, ids);

                var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, uri));

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    return(fnResult);
                }

                var content = await response.Content.ReadAsStringAsync();

                var stockProfiles = new List <StockValue>();

                var requestBody = JObject.Parse(content);

                var count = 0;

                foreach (var stock in stockTickers)
                {
                    if (stock != "")
                    {
                        if (requestBody.SelectToken($"quoteResponse.result[{count}].regularMarketPrice") != null)
                        {
                            var stockProfile = new StockValue
                            {
                                CurrentPrice = (double)requestBody.SelectToken($"quoteResponse.result[{count}].regularMarketPrice"),
                                Name         = stock
                            };

                            stockProfiles.Add(stockProfile);
                        }
                        count++;
                    }
                }
                fnResult.Data       = stockProfiles;
                fnResult.StatusCode = (int)HttpStatusCode.OK;
                return(fnResult);
            }
            catch (Exception e)
            {
                fnResult.StatusCode = (int)HttpStatusCode.InternalServerError;
                fnResult.Message    = e.Message;
                return(fnResult);
            }
        }
示例#5
0
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (cmbFilter.SelectedItem == null)
            {
                return;
            }

            SelectedStockValue = cmbFilter.SelectedItem as StockValue;
            DialogResult       = DialogResult.OK;

            Close();
        }
示例#6
0
        private StockValue GetStockForCodeAndValue(string stockCode, int unit, decimal price)
        {
            StockValue stockValue = _db.StockValue
                                    .AsNoTracking()
                                    .Where(
                x => x.Unit == unit &&
                x.Price == price &&
                x.Stock.Code.ToLower().Equals(stockCode.ToLower()))
                                    .OrderByDescending(x => x.PublicationDate)
                                    .FirstOrDefault();

            return(stockValue);
        }
示例#7
0
        public bool AddStockValueIfNewer(int stockId, int unit, decimal price, DateTime publicationDate)
        {
            bool       saveResult          = false;
            StockValue latestValueForStock = GetLatestValueForStock(stockId);

            if (latestValueForStock == null)
            {
                return(saveResult);
            }

            // compare d1 to d2
            // d1 - publication date of the latest stock value for specified stock in Database
            // d2 - publication date of specified stock fetched from external server
            int dateComparisonResult = DateTime.Compare(latestValueForStock.PublicationDate, publicationDate);

            // Less than zero => d1 is earlier than d2.
            // Zero => d1 is the same as d2.
            // Greater than zero => d1 is later than d2.
            if (dateComparisonResult >= 0)
            {
                return(saveResult);
            }

            //_logger.Info("Date comparison result: " + dateComparisonResult + ", latest in db: "
            //    + latestValueForStock.PublicationDate + ", current: " + publicationDate);

            try
            {
                var newStockValue = new StockValue
                {
                    StockID         = stockId,
                    Unit            = unit,
                    Price           = price,
                    PublicationDate = publicationDate
                };
                _db.StockValue.Add(newStockValue);
                //_db.Entry(newStockValue).State = System.Data.Entity.EntityState.Added;
                saveResult = _db.SaveChanges() > 0;
            }
            catch (Exception e)
            {
                _logger.Error("Exception during adding new stock VALUE: " + e.Message);
                if (e.InnerException != null)
                {
                    _logger.Error(e.InnerException.Message);
                }
            }

            return(saveResult);
        }
示例#8
0
        public StockValue GetStockValueByCode(string stockCode)
        {
            StockValue result = null;

            try
            {
                result = _stockContext.Stocks.FirstOrDefault(x => x.Code.Equals(stockCode, StringComparison.InvariantCultureIgnoreCase));
            }
            catch (Exception error)
            {
                LoggerHelper.LogException(true, error);
            }

            return(result);
        }
        private void DrawStockCard(SKCanvas canvas)
        {
            var firstRect  = MainGraphics !.GetActualRectangle(3, 10, 70, 20);
            var secondRect = MainGraphics.GetActualRectangle(3, 31, 70, 20);
            var thirdRect  = MainGraphics.GetActualRectangle(3, 51, 70, 20);
            var fourthRect = MainGraphics.GetActualRectangle(3, 76, 70, 20);
            var fontSize   = firstRect.Height * 0.75f; // trial and error
            var otherSize  = firstRect.Height * 1.2f;
            var otherText  = MiscHelpers.GetTextPaint(SKColors.Purple, otherSize);
            var blackText  = MiscHelpers.GetTextPaint(SKColors.Black, fontSize);

            blackText.FakeBoldText = true;
            otherText.FakeBoldText = true;
            canvas.DrawCustomText(StockValue.ToString(), TextExtensions.EnumLayoutOptions.Center, TextExtensions.EnumLayoutOptions.Center, otherText, firstRect, out _);
            canvas.DrawCustomText("Stock", TextExtensions.EnumLayoutOptions.Center, TextExtensions.EnumLayoutOptions.Center, blackText, secondRect, out _);
            canvas.DrawCustomText("Certificate", TextExtensions.EnumLayoutOptions.Center, TextExtensions.EnumLayoutOptions.Center, blackText, thirdRect, out _);
            canvas.DrawCustomText("$50,000", TextExtensions.EnumLayoutOptions.Center, TextExtensions.EnumLayoutOptions.Center, blackText, fourthRect, out _); // its okay to do manually
        }
示例#10
0
        public StockValue GetLatestValueForStock(int stockId)
        {
            StockValue latestStockValue = null;

            try
            {
                latestStockValue = _db.StockValue
                                   .AsNoTracking()
                                   .Where(x => x.StockID == stockId)
                                   .OrderByDescending(x => x.PublicationDate)
                                   .Take(1)
                                   .FirstOrDefault();
            }
            catch (Exception e)
            {
                _logger.Error("Exception during fetching latest value for stock: " + e.Message);
            }

            return(latestStockValue);
        }
示例#11
0
            private string GetQuery(int page, StockValue data)
            {
                var query = "";

                if (page >= 1)
                {
                    query += ("page=" + page);
                }

                if (data != null)
                {
                    if (data.Close != null)
                    {
                        query += ((query.Length > 0 ? "&" : "") + "close=" + data.Close);
                    }

                    if (data.Open != null)
                    {
                        query += ((query.Length > 0 ? "&" : "") + "open=" + data.Open);
                    }

                    if (data.High != null)
                    {
                        query += ((query.Length > 0 ? "&" : "") + "high=" + data.High);
                    }

                    if (data.Low != null)
                    {
                        query += ((query.Length > 0 ? "&" : "") + "low=" + data.Low);
                    }

                    if (data.Date != null)
                    {
                        query += ((query.Length > 0 ? "&" : "") + "date=" + Helper.ToStockDate(data.Date));
                    }
                }

                return(query.ToString());
            }
        public StocksManager(IDependenciesManager _dependencies)
        {
            stocksValues = new List <StockValue>();
            Task.Run(() =>
            {
                using (var client = new WebsocketClient(new Uri(_dependencies.stocksendpoint)))
                {
                    client.ReconnectTimeout = TimeSpan.FromSeconds(30);
                    //client.ReconnectionHappened.Subscribe(info =>
                    //    Log.Information($"Reconnection happened, type: {info.Type}"));

                    client.MessageReceived.Subscribe(msg =>
                    {
                        try
                        {
                            var value        = JsonConvert.DeserializeObject <Dictionary <string, double> >(msg.ToString());
                            StockValue stock = stocksValues.FirstOrDefault(s => s.StockCode.Equals(value.Keys.ElementAt(0))) ?? new StockValue {
                                StockCode = value.Keys.ElementAt(0)
                            };
                            if (stock.Timestamp < value["timestamp"])
                            {
                                stock.Value     = value[stock.StockCode];
                                stock.Timestamp = value["timestamp"];
                                if (!stocksValues.Any(s => s.StockCode.Equals(value.Keys.ElementAt(0))))
                                {
                                    stocksValues.Add(stock);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                    });
                    client.Start();
                    new ManualResetEvent(false).WaitOne();
                }
            });
        }
示例#13
0
 private bool Equals(StockValue other)
 {
     return(Stock.Equals(other.Stock) && Price.Equals(other.Price) && StockTotalPrice.Equals(other.StockTotalPrice) && StockGain.Equals(other.StockGain));
 }
 public static StockValueDTO FromModel(StockValue m)
 {
     return(new StockValueDTO(m.Id, m.StockId, m.ValueTypeId, m.Value));
 }
 public static StockValue ToModel(StockValueDTO d)
 {
     return(StockValue.New(d.Id, d.StockId, d.ValueTypeId, d.Value));
 }
示例#16
0
        public StockBuyStatus BuyStock(string userId, BuyStockViewModel buyStockModel)
        {
            // check if user change the form data, provided stock value has to exists in database
            StockValue purchasingStockValue = GetStockForCodeAndValue(buyStockModel.Code, buyStockModel.Unit, buyStockModel.Price);

            if (purchasingStockValue == null)
            {
                return(StockBuyStatus.Unknown);
            }
            decimal totalCost = buyStockModel.AmountToBuy / purchasingStockValue.Unit * purchasingStockValue.Price;

            // case 1: User does not have enough money
            User buyer = _db.UserApp.Where(x => x.Id.Equals(userId) && x.Money >= totalCost)
                         .FirstOrDefault();

            if (buyer == null)
            {
                return(StockBuyStatus.UserHasNotEnoughMoney);
            }
            // case 2: Stock Exchange does not have enough stock
            if (purchasingStockValue.Stock.AvailableAmount < buyStockModel.AmountToBuy)
            {
                return(StockBuyStatus.AmountNotAvailable);
            }

            // case 3: Stock value data have changed - there was an update
            StockDetails latestStockDetails = GetLatestStockDetails(buyStockModel.Code);
            bool         isBuyerBuyingStockByLatestPrice = AreDatesTheSameComparisonLikeHuman(
                latestStockDetails.PublicationDate, purchasingStockValue.PublicationDate);

            if (isBuyerBuyingStockByLatestPrice == false)
            {
                return(StockBuyStatus.StockValueDataHaveChanged);
            }

            using (var dbContextTransaction = _db.Database.BeginTransaction())
            {
                try
                {
                    // then 1: Subtract money from User wallet
                    buyer.Money -= totalCost;

                    // then 2: Add specified amount of stock to UserStocks
                    UserStocks stockOwnedByBuyer = buyer.Stocks.FirstOrDefault(
                        x => x.StockID == purchasingStockValue.StockID);
                    if (stockOwnedByBuyer != null)
                    {
                        stockOwnedByBuyer.Amount          += buyStockModel.AmountToBuy;
                        _db.Entry(stockOwnedByBuyer).State = System.Data.Entity.EntityState.Modified;
                    }
                    else
                    {
                        stockOwnedByBuyer = new UserStocks
                        {
                            UserID  = userId,
                            StockID = purchasingStockValue.StockID,
                            Amount  = buyStockModel.AmountToBuy
                        };
                        _db.UserStocks.Add(stockOwnedByBuyer);
                    }

                    // then 3: Decrease available stock amount
                    _db.Stock.Attach(purchasingStockValue.Stock);
                    _db.Entry(purchasingStockValue.Stock).Reload();
                    if (purchasingStockValue.Stock.AvailableAmount < buyStockModel.AmountToBuy)
                    {
                        _logger.Info("Rollback");
                        dbContextTransaction.Rollback();
                        return(StockBuyStatus.AmountNotAvailable);
                    }
                    purchasingStockValue.Stock.AvailableAmount -= buyStockModel.AmountToBuy;
                    _db.Entry(purchasingStockValue.Stock).State = System.Data.Entity.EntityState.Modified;

                    // save and commit
                    _db.SaveChanges();
                    dbContextTransaction.Commit();
                    return(StockBuyStatus.Success); // everything went well, so finally success
                }
                catch (Exception e)
                {
                    _logger.Error("Transaction error during buying stock. Error:" + e.Message);
                    _logger.Error("Rollback...");
                    dbContextTransaction.Rollback();
                }
            }

            return(StockBuyStatus.Unknown);
        }
示例#17
0
 private void ProcessStockValue(StockValue stock)
 {
 }
示例#18
0
 public StockValue UpdateStockValue(StockValue stockValue)
 {
     return(_stockValues.Update(stockValue));
 }
示例#19
0
 public StockValue AddStockValue(StockValue stockValue)
 {
     return(_stockValues.Add(stockValue));
 }
        public async Task <StockSymbol> UpdateStockSymbolDataAsync(StockSymbol Symbol)
        {
            //String baseUrl = null;
            String apiKey = null;

            try
            {
                //baseUrl = _config.Configuration["AlphavantageBaseUrl"];
                apiKey = _config.Configuration["AlphavantageApiKey"];
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                throw;
            }
            if (String.IsNullOrWhiteSpace(apiKey))
            {
                throw new Exception("AlphavantageApiKey null or empty!");
            }

            AlphaVantageCoreClient      client = new AlphaVantageCoreClient();
            Dictionary <string, string> query  = new Dictionary <string, string>()
            {
                { "symbol", Symbol.Symbol },
                { "interval", "5min" },
                { "outputsize", "full" }
            };

            JObject result = await client.RequestApiAsync(apiKey, ApiFunction.TIME_SERIES_INTRADAY, query);

            DateTime lastRefresh    = Symbol.LastRefresh ?? DateTime.MinValue;
            string   timeZoneString = (string)result["Meta Data"]["6. Time Zone"];

            //TODO: Move elsewhere
            if ("US/Eastern".Equals(timeZoneString))
            {
                timeZoneString = "US Eastern Standard Time";
            }
            TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneString);

            Symbol.Values = new List <StockValue>();
            List <Task> waitingTasks = new List <Task>();

            foreach (JObject timeSerie in result["Time Series (5min)"].Values())
            {
                JProperty prop           = (JProperty)timeSerie.Parent;
                String    timestampProp  = prop.Name;
                DateTime  localTimeStamp = DateTime.ParseExact(timestampProp, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
                DateTime  utcTimeStamp   = TimeZoneInfo.ConvertTimeToUtc(localTimeStamp, timeZone);

                if (utcTimeStamp < lastRefresh)
                {
                    continue;
                }

                StockValue value = new StockValue()
                {
                    TimeStamp = utcTimeStamp,
                    Open      = Decimal.Parse(timeSerie.Value <string>("1. open")),
                    High      = Decimal.Parse(timeSerie.Value <string>("2. high")),
                    Low       = Decimal.Parse(timeSerie.Value <string>("3. low")),
                    Close     = Decimal.Parse(timeSerie.Value <string>("4. close")),
                    Volume    = Decimal.Parse(timeSerie.Value <string>("5. volume")),
                    ParentId  = Symbol.Id
                };

                Symbol.Values.Add(value);

                waitingTasks.Add(_repository.AddStockSymbolDataAsync(value));
                if (waitingTasks.Count > 4)
                {
                    int i = Task.WaitAny(waitingTasks.ToArray());
                    waitingTasks.RemoveAt(i);
                }
            }
            Task.WaitAll(waitingTasks.ToArray());
            waitingTasks.Clear();

            DateTime localRefresh = DateTime.ParseExact((string)result["Meta Data"]["3. Last Refreshed"], "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

            Symbol.LastRefresh = TimeZoneInfo.ConvertTimeToUtc(localRefresh, timeZone);

            return(Symbol);
        }
示例#21
0
        public StockSellStatus SellStock(string userId, SellStockViewModel sellStockModel)
        {
            // check if user change the form data, provided stock value has to exists in database
            StockValue sellingStockValue = GetStockForCodeAndValue(
                sellStockModel.Code, sellStockModel.Unit, sellStockModel.Price);

            if (sellingStockValue == null)
            {
                return(StockSellStatus.Unknown);
            }
            decimal totalCost = sellStockModel.AmountToSell / sellingStockValue.Unit * sellingStockValue.Price;

            // case 1: User does not have enough stock
            User       seller             = _db.UserApp.Where(x => x.Id.Equals(userId)).FirstOrDefault();
            UserStocks stockOwnedBySeller = seller.Stocks
                                            .Where(x => x.StockID == sellingStockValue.StockID)
                                            .FirstOrDefault();

            if (stockOwnedBySeller == null || stockOwnedBySeller.Amount < sellStockModel.AmountToSell)
            {
                return(StockSellStatus.UserHasNotEnoughStocks);
            }

            // case 2: Stock value data have changed - there was an update
            StockDetails latestStockDetails = GetLatestStockDetails(sellStockModel.Code);
            bool         isSellerSellingStockByLatestPrice = AreDatesTheSameComparisonLikeHuman(
                latestStockDetails.PublicationDate, sellingStockValue.PublicationDate);

            if (isSellerSellingStockByLatestPrice == false)
            {
                return(StockSellStatus.StockValueDataHaveChanged);
            }

            using (var dbContextTransaction = _db.Database.BeginTransaction())
            {
                try
                {
                    // then 1: Add money to User wallet
                    seller.Money += totalCost;

                    // then 2: Subtract specified amount of stock from UserStocks
                    stockOwnedBySeller.Amount -= sellStockModel.AmountToSell;
                    if (stockOwnedBySeller.Amount == 0)
                    {
                        _db.UserStocks.Remove(stockOwnedBySeller);
                    }

                    //then 3: Increase available stock amount
                    _db.Stock.Attach(sellingStockValue.Stock);
                    _db.Entry(sellingStockValue.Stock).Reload();
                    sellingStockValue.Stock.AvailableAmount += sellStockModel.AmountToSell;
                    _db.Entry(sellingStockValue.Stock).State = System.Data.Entity.EntityState.Modified;

                    // save and commit
                    _db.SaveChanges();
                    dbContextTransaction.Commit();
                    return(StockSellStatus.Success); // everything went well, so finally success
                }
                catch (Exception e)
                {
                    _logger.Error("Transaction error during selling stock. Error " + e.Message);
                    _logger.Error("Rollback...");
                    dbContextTransaction.Rollback();
                }
            }

            return(StockSellStatus.Unknown);
        }
示例#22
0
        public Task AddStockSymbolDataAsync(StockValue DataPoint)
        {
            IMongoCollection <StockValue> collection = _database.GetCollection <StockValue>(_stockDataCollectionName);

            return(collection.InsertOneAsync(DataPoint));
        }