public async Task InsertToDatabase(IStockQuoteFromDataSource stockData) { // get previous close price , if none, it's the first record and then insert to db IReadOnlyList <IStockPriceHistory> previousPrices = await _database.GetStockPriceHistoryAsync(stockData.Country.ConvertToTT2Country(), stockData.StockId, stockData.TradeDateTime, 1).ConfigureAwait(false); IStockPriceHistory previousStockPriceHistory = previousPrices?.FirstOrDefault(); if (previousStockPriceHistory == null) { //string msg = $"The stock data {GetStockFullID(todayPriceFromDataSource.StockId)} from data sourceKind doesn't have the previous closed price, so it will NOT be added to database"; //WriteToErrorLog(msg); IStockPriceHistory priceHist = new StockPriceHistory(stockData.Country.ConvertToTT2Country(), stockData.StockId, stockData.TradeDateTime) { OpenPrice = stockData.OpenPrice, ClosePrice = stockData.ClosePrice, HighPrice = stockData.HighPrice, LowPrice = stockData.LowPrice, Volume = stockData.Volume }; await _database.AddOrUpdateStockPriceHistoryAsync(priceHist).ConfigureAwait(false); return; } // get the max days of SystemN IReadOnlyList <IStockPriceHistory> recentStockPriceHistory = await _database.GetStockPriceHistoryAsync(stockData.Country.ConvertToTT2Country(), stockData.StockId, stockData.TradeDateTime, _maxCalculationDay - 1).ConfigureAwait(false); // if there exists previous closed price, then calculate today's ATR decimal todayATR = _baseData.CalculateTodayATR(stockData.HighPrice, stockData.LowPrice, previousStockPriceHistory.ClosePrice); (decimal? N20, decimal? HighIn20, decimal? LowIn10) = DailyPriceCalculationSystem(BuySellStrategyType.N20, recentStockPriceHistory, todayATR, stockData); (decimal? N40, decimal? HighIn40, decimal? LowIn15) = DailyPriceCalculationSystem(BuySellStrategyType.N40, recentStockPriceHistory, todayATR, stockData); (decimal? N60, decimal? HighIn60, decimal? LowIn20) = DailyPriceCalculationSystem(BuySellStrategyType.N60, recentStockPriceHistory, todayATR, stockData); decimal?MA20 = CalculateMovingAverage(20, recentStockPriceHistory, stockData); decimal?MA40 = CalculateMovingAverage(40, recentStockPriceHistory, stockData); decimal?MA60 = CalculateMovingAverage(60, recentStockPriceHistory, stockData); decimal?MA120 = CalculateMovingAverage(120, recentStockPriceHistory, stockData); decimal?MA240 = CalculateMovingAverage(240, recentStockPriceHistory, stockData); IStockPriceHistory priceHistory = new StockPriceHistory(stockData.Country.ConvertToTT2Country(), stockData.StockId, stockData.TradeDateTime) { OpenPrice = stockData.OpenPrice, ClosePrice = stockData.ClosePrice, HighPrice = stockData.HighPrice, LowPrice = stockData.LowPrice, Volume = stockData.Volume, ATR = todayATR, N20 = N20, N40 = N40, N60 = N60, HighIn20 = HighIn20, LowIn10 = LowIn10, HighIn40 = HighIn40, LowIn15 = LowIn15, HighIn60 = HighIn60, LowIn20 = LowIn20, MA20 = MA20, MA40 = MA40, MA60 = MA60, MA120 = MA120, MA240 = MA240 }; await _database.AddOrUpdateStockPriceHistoryAsync(priceHistory).ConfigureAwait(false); }