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