public ActionResult GetStockShortAll() { var companies = _companyService.GetAll().ToList(); var stocksShort = _stockService.GetStockDailyCurrentAll().Join(companies, stock => stock.StockId, company => company.StockId, (stock, company) => new StockShortViewModel() { StockId = stock.StockId, Symbol = stock.Symbol, Name = company.Name, Image = company.Image, Price = _realTimeStockService.GetPrice(stock.StockId), Open = stock.Open, PrevClose = stock.Close, Low = _realTimeStockService.GetLow(stock.StockId), High = _realTimeStockService.GetHigh(stock.StockId), Change = decimal.Round(((_realTimeStockService.GetPrice(stock.StockId) - stock.Close) / stock.Close), 4, MidpointRounding.AwayFromZero), Date = _realTimeStockService.GetDate(stock.StockId) } ); return(Ok(stocksShort)); }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { using var scope = _serviceProvider.CreateScope(); orderService = scope.ServiceProvider.GetRequiredService <IOrderService>(); //Init(); _logger.LogDebug("Transactions has started"); while (!stoppingToken.IsCancellationRequested) { //Check if market is open if (_realTimeStockService.IsMarketOpen()) { //Check if opening prices are pulled if (_realTimeStockService.Ready) { try { //Retrieve active orders _orderQueueService.AddOrders(orderService.GetActiveOrders()); } catch (Exception ex) { _logger.LogError($"RETRIVAL OF ORDERS ERROR - {ex.Message}"); await Task.Delay(10_000); } while (!_orderQueueService.IsEmpty()) { try { //Take first order from the queue Order order = _orderQueueService.GetOrder(); //Take current price for the stock var price = _realTimeStockService.GetPrice(order.StockId); //Check whether order with limit fulfill a condition if ( ((order.Buy && price <= order.Limit) || (!order.Buy && price >= order.Limit)) || order.Limit == null || order.ExpiryDate <= DateTime.Now) { Transaction transaction = new Transaction { Order = order, Amount = order.Amount, Price = order.Amount * price, Realised = DateTime.Now }; //Realize an order and dequeue if it's finished or cancelled for some reasons var consumedOrder = await orderService.ConsumeTransaction(transaction); if (consumedOrder.StatusEnum != OrderStatusEnum.Partially) { _orderQueueService.FinishOrder(); } } else { _orderQueueService.FinishOrder(); } } catch (Exception ex) { _logger.LogError($"ERROR - {ex.Message}"); } } await Task.Delay(10_000); } else { await Task.Delay(10_000); } } else { _orderQueueService.CleanQueue(); var leftToOpening = _realTimeStockService.GetTimeToOpenMarket(); _logger.LogDebug($"Transactions has been stopped"); await Task.Delay(leftToOpening); } } }