예제 #1
0
        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);
        }