public virtual async Task HandleMinuteAgg(StockInput newValue)
        {
            var result = await ShouldBuyStock(newValue);

            if (result.HasValue && result.Value)
            {
                var cost = await _alpacaClient.EnsurePositionExists(newValue.StockSymbol, newValue.ClosingPrice);

                MoneyTracker.CostOfLastPosition += cost;

                Console.WriteLine($"{GetType().Name} is having a position in {newValue.StockSymbol}");
            }
            else if (result.HasValue && !result.Value)
            {
                var saleAmount = await _alpacaClient.EnsurePostionCleared(newValue.StockSymbol);

                if (saleAmount > 0 && MoneyTracker.CostOfLastPosition > 0)
                {
                    MoneyTracker.MoneyMade += (saleAmount - MoneyTracker.CostOfLastPosition) / MoneyTracker.CostOfLastPosition;
                }
                MoneyTracker.CostOfLastPosition = 0;

                Console.WriteLine($"{GetType().Name} is not having a position in {newValue.StockSymbol}. Percentage made so far {MoneyTracker.MoneyMade}");
            }
            else
            {
                Console.WriteLine($"{GetType().Name} is not buying or selling {newValue.StockSymbol}");
            }
        }
        public async Task HandleNewData(StockInput newValue)
        {
            if (!string.Equals(newValue.StockSymbol, _stockSymbol, StringComparison.InvariantCultureIgnoreCase))
            {
                throw new InvalidOperationException($"Cannot handle {newValue.StockSymbol} stock with {_stockSymbol} handler.");
            }

            HistoricalData.Add(newValue);
            await RunStrategy(HistoricalData);
        }
        public override Task <bool?> ShouldBuyStock(StockInput newData)
        {
            HistoricalData.Add(newData);
            var modelBuilder = new ModelBuilder(_config);
            var model        = modelBuilder.BuildModel(HistoricalData.Select(x => new ModelInput
            {
                PriceDiffrence = (float)((x.ClosingPrice - HistoricalData.Last().ClosingPrice) / HistoricalData.Last().ClosingPrice),
                Time           = x.Time
            }).ToList());
            var result = model.Predict();

            return(Task.FromResult((bool?)(result.ForecastedPriceDiffrence[0] > 0)));
        }
        public override async Task <bool?> ShouldBuyStock(StockInput newData)
        {
            if (!_lastCallTime.HasValue || _lastCallTime < DateTime.Now.AddDays(-1))
            {
                var client = new NewsSearchClient(new ApiKeyServiceClientCredentials(_config.News_Search_Api_Key))
                {
                    Endpoint = _config.News_Search_Endpoint
                };

                var result = await client.News.SearchAsync(query : newData.StockSymbol, market : "en-US", freshness : "Day", count : 100);

                return(false);
            }
            else
            {
                return(_lastReturn);
            }
        }
        public override Task <bool?> ShouldBuyStock(StockInput newData)
        {
            HistoricalData.Add(newData);
            if (HistoricalData.Count > 20)
            {
                HistoricalData = HistoricalData.OrderByDescending(x => x.Time).Take(20).ToList();

                var avg  = HistoricalData.Select(x => x.ClosingPrice).Average();
                var diff = avg - newData.ClosingPrice;

                return(Task.FromResult <bool?>(diff >= 0));
            }
            else
            {
                Console.WriteLine($"Waiting on more data for {GetType().Name}.");
                return(Task.FromResult <bool?>(null));
            }
        }
        public override Task <bool?> ShouldBuyStock(StockInput newData)
        {
            HistoricalData.Add(newData);
            HistoricalData = HistoricalData.OrderByDescending(x => x.Time).Take(3).ToList();

            var last3Values = HistoricalData.Select(x => x.ClosingPrice).ToList();

            //Default to hold
            var result = (bool?)null;

            if (last3Values.Count >= 3 && last3Values[0] > last3Values[1] && last3Values[1] > last3Values[2])
            {
                //Buy if we have 2 mins of increase
                result = true;
            }
            else if (last3Values.Count >= 3 && (last3Values[0] < last3Values[1] || last3Values[1] < last3Values[2]))
            {
                //Sell if any decrease in price
                result = false;
            }

            return(Task.FromResult(result));
        }
 public abstract Task <bool?> ShouldBuyStock(StockInput newData);
        public ActionResult EditStockInput(StockInputViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    // get current stock input
                    var stockInput = db.StockInputs.Where(r => r.Id == model.Id).FirstOrDefault();
                    if (stockInput != null)
                    {
                        // remove current stock input
                        db.StockInputs.Remove(stockInput);

                        // rollback stock input product quantity
                        var productInStock = db.ProductInStocks.Where(r => r.ProductId == stockInput.ProductId && r.StockId == stockInput.StockId).FirstOrDefault();
                        if (productInStock != null)
                        {
                            productInStock.Quantity -= stockInput.Quantity;
                        }
                        db.SaveChanges();

                        // add new stock input
                        var quantity   = int.Parse(model.Quantity.Replace(",", ""));
                        var importDate = DateTime.ParseExact(model.Date, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None) +
                                         new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
                        var stockInput2 = new StockInput();
                        stockInput2.Date      = importDate;
                        stockInput2.ProductId = model.ProductId;
                        stockInput2.StockId   = model.StockId;
                        stockInput2.Quantity  = quantity;
                        stockInput2.Note      = model.Note;
                        stockInput2.UserName  = User.Identity.Name;
                        db.StockInputs.Add(stockInput2);

                        // update new stock input product quantity
                        var productInStock2 = db.ProductInStocks.Where(r => r.ProductId == model.ProductId && r.StockId == model.StockId).FirstOrDefault();
                        if (productInStock2 != null)
                        {
                            productInStock2.Quantity += quantity;
                        }
                        else
                        {
                            productInStock2           = new ProductInStock();
                            productInStock2.ProductId = model.ProductId;
                            productInStock2.StockId   = model.StockId;
                            productInStock2.Quantity  = quantity;
                            db.ProductInStocks.Add(productInStock2);
                        }
                        db.SaveChanges();

                        return(RedirectToAction("StockInputHistory"));
                    }
                    else
                    {
                        ModelState.AddModelError("", "Không tìm thấy thông tin nhập kho sản phẩm!!!");
                    }

                    // initialize viewbag
                    var product3   = db.Products.Where(r => r.ProductId == model.ProductId).FirstOrDefault();
                    var categoryId = product3 != null ? product3.CategoryId : 0;
                    var categories = db.Categories.OrderBy(r => r.CategoryName)
                                     .AsEnumerable()
                                     .Select(r => new SelectListItem
                    {
                        Text     = r.CategoryName,
                        Value    = r.CategoryId.ToString(),
                        Selected = r.CategoryId == categoryId
                    })
                                     .ToList();
                    ViewBag.Categories = categories;

                    int productId = product3 != null ? product3.ProductId : 0;
                    var products  = db.Products.Where(r => r.CategoryId == categoryId)
                                    .OrderBy(r => r.ProductName)
                                    .AsEnumerable()
                                    .Select(r => new SelectListItem
                    {
                        Text     = r.ProductName,
                        Value    = r.ProductId.ToString(),
                        Selected = r.ProductId == productId
                    })
                                    .ToList();
                    ViewBag.Products = products;

                    var stocks = db.Stocks.OrderBy(r => r.StockName)
                                 .AsEnumerable()
                                 .Select(r => new SelectListItem
                    {
                        Text     = r.StockName,
                        Value    = r.StockId.ToString(),
                        Selected = r.StockId == model.StockId
                    })
                                 .ToList();
                    ViewBag.Stocks = stocks;
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex);
            }
            if (ViewBag.Products == null)
            {
                ViewBag.Products = new List <SelectListItem>();
            }
            if (ViewBag.Categories == null)
            {
                ViewBag.Categories = new List <SelectListItem>();
            }
            if (ViewBag.Stocks == null)
            {
                ViewBag.Stocks = new List <SelectListItem>();
            }
            return(View(model));
        }
        public ActionResult AddStockInput(StockInputViewModel model)
        {
            try
            {
                var product = db.Products.Where(r => r.ProductId == model.ProductId).FirstOrDefault();
                var stock   = db.Stocks.Where(r => r.StockId == model.StockId).FirstOrDefault();

                if (ModelState.IsValid)
                {
                    // validate date product, stock
                    if (product != null && stock != null)
                    {
                        var quantity   = int.Parse(model.Quantity.Replace(",", ""));
                        var importDate = DateTime.ParseExact(model.Date, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None) +
                                         new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);

                        // update quantity
                        var productInStock = db.ProductInStocks.Where(r => r.ProductId == model.ProductId && r.StockId == model.StockId).FirstOrDefault();
                        if (productInStock != null)
                        {
                            productInStock.Quantity += quantity;
                        }
                        else
                        {
                            productInStock           = new ProductInStock();
                            productInStock.ProductId = model.ProductId;
                            productInStock.StockId   = model.StockId;
                            productInStock.Quantity += quantity;
                            db.ProductInStocks.Add(productInStock);
                        }

                        // add product stock input
                        var stockInput = new StockInput();
                        stockInput.Date      = importDate;
                        stockInput.ProductId = model.ProductId;
                        stockInput.StockId   = model.StockId;
                        stockInput.Quantity  = quantity;
                        stockInput.Note      = model.Note;
                        stockInput.UserName  = User.Identity.Name;
                        db.StockInputs.Add(stockInput);

                        db.SaveChanges();

                        return(RedirectToAction("StockInputHistory"));
                    }
                    else
                    {
                        ModelState.AddModelError("", "Sản phẩm hoặc kho không tồn tại!!!");
                    }
                }

                // initialize viewbag
                var productId  = product != null ? product.ProductId : 0;
                var categoryId = product != null ? product.CategoryId : 0;
                var stockId    = stock != null ? stock.StockId : 0;

                var categories = db.Categories.OrderBy(r => r.CategoryName)
                                 .AsEnumerable()
                                 .Select(r => new SelectListItem
                {
                    Text     = r.CategoryName,
                    Value    = r.CategoryId.ToString(),
                    Selected = r.CategoryId == categoryId
                })
                                 .ToList();
                ViewBag.Categories = categories;

                var products = db.Products.Where(r => r.CategoryId == categoryId)
                               .OrderBy(r => r.ProductName)
                               .AsEnumerable()
                               .Select(r => new SelectListItem
                {
                    Text     = r.ProductName,
                    Value    = r.ProductId.ToString(),
                    Selected = r.ProductId == productId
                })
                               .ToList();
                ViewBag.Products = products;

                var stocks = db.Stocks.OrderBy(r => r.StockName)
                             .AsEnumerable()
                             .Select(r => new SelectListItem
                {
                    Text     = r.StockName,
                    Value    = r.StockId.ToString(),
                    Selected = r.StockId == stockId
                })
                             .ToList();
                ViewBag.Stocks = stocks;
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex);
            }
            if (ViewBag.Products == null)
            {
                ViewBag.Products = new List <SelectListItem>();
            }
            if (ViewBag.Categories == null)
            {
                ViewBag.Categories = new List <SelectListItem>();
            }
            if (ViewBag.Stocks == null)
            {
                ViewBag.Stocks = new List <SelectListItem>();
            }
            return(View(model));
        }