public override TimeSeriesDataOutput GetTimeSeriesData(TimeSeriesDataInput input) { if (input == null || string.IsNullOrEmpty(input.Symbol)) { return(null); } DateTime fromDate = new DateTime(1970, 1, 1); DateTime toDate = DateTime.Now; if (input.OutputCount >= 0) { switch (input.Frequency) { case BarFrequency.Day1: fromDate = toDate.AddDays(-input.OutputCount * 5); break; case BarFrequency.Week1: fromDate = toDate.AddDays(-input.OutputCount * 8); break; case BarFrequency.Month1: fromDate = toDate.AddDays(-input.OutputCount * 31); break; case BarFrequency.Hour1: fromDate = toDate.AddDays(-(input.OutputCount / 6.5) * 5); break; case BarFrequency.Hour4: fromDate = toDate.AddDays(-(input.OutputCount / (6.5 / 4) * 5)); break; case BarFrequency.Minute1: fromDate = toDate.AddDays(-(input.OutputCount / 390 >= 1.0 ? input.OutputCount / 390 : 1) * 5); break; case BarFrequency.Minute15: fromDate = toDate.AddDays(-(input.OutputCount / (390 / 15) > 1.0 ? input.OutputCount / (390 / 15) : 1) * 5); break; case BarFrequency.Minute30: fromDate = toDate.AddDays(-(input.OutputCount / (390 / 30) > 1.0 ? input.OutputCount / (390 / 30) : 1) * 5); break; case BarFrequency.Minute5: fromDate = toDate.AddDays(-(input.OutputCount / (390 / 5) > 1.0 ? input.OutputCount / (390 / 5) : 1) * 5); break; } } TVCHistoryResponse tvchistory = GetHistoricalPrices(input.Symbol, input.Frequency, fromDate, toDate); if (tvchistory != null && tvchistory.s == "ok") { TimeSeriesDataOutput output = new TimeSeriesDataOutput(); output.Symbol = input.Symbol; output.TimeZone = "UTC"; List <StockBar> stockBars = new List <StockBar>(); if (tvchistory.t != null && tvchistory.t.Length > 0) { for (int i = 0; i < tvchistory.t.Length; i++) { StockBar bar = new StockBar(); bar.AsOfDate = new DateTime(1970, 1, 1).AddSeconds(tvchistory.t[i]); bar.Close = tvchistory.c[i]; bar.High = tvchistory.h[i]; bar.Low = tvchistory.l[i]; bar.Open = tvchistory.o[i]; bar.SplitCoefficient = 1.0; bar.Volume = Convert.ToDecimal(tvchistory.v[i]); bar.TS = DateTime.UtcNow; stockBars.Add(bar); } } if (stockBars.Count > 0) { if (input.OutputCount >= 0 && stockBars.Count > input.OutputCount) { output.Data = stockBars.Skip(stockBars.Count - (int)input.OutputCount).ToArray(); } else { output.Data = stockBars.ToArray(); } } return(output); } return(null); }
public void Update(int iStartFrom = 0) { //var o = RetrieveStockTimeSeriesPrices("HAE", BarFrequency.Day1, true, -1); //StoreHistoryPrices(200004253, BarFrequency.Day1, true, o.Data); _logger.LogInfo(string.Format("Update historical prices for {0} from Alpha Vantage.", _period)); PricingRule[] pricingRules = GetPricingRules(); _logger.LogInfo(string.Format("Total {0} symbols.", pricingRules.Count())); string[] keys = GetAPIKeys(); _logger.LogInfo(string.Format("Total {0} active keys.", keys.Count())); long totalSymbols = pricingRules.Count(); int keyCount = keys.Count(); _logger.LogInfo("Get latest prices."); IDictionary <string, StockBar> stockBars = GetLatestStockHistoryPrices(pricingRules.Select(p => p.Ticker).ToArray(), _period, _isAdjustedValue); object countObj = new object(); int handleCount = 0; _logger.LogInfo("Start retriving prices from Alpha Vantage."); foreach (var pricingRule in pricingRules) { int idx; lock (countObj) { idx = handleCount + 1; handleCount++; } if (idx < iStartFrom) { continue; } try { StockBar bar = null; if (stockBars != null && stockBars.Count > 0) { if (stockBars.ContainsKey(pricingRule.Ticker)) { bar = stockBars[pricingRule.Ticker]; } } TimeSeriesDataOutput output = null; if (bar != null) { output = RetrieveStockTimeSeriesPrices(pricingRule.Ticker, _period, _isAdjustedValue, 0); if (output != null && output.Data != null && output.Data.Count() > 0) { if (output.Data.Select(p => p.AsOfDate).Min() <= bar.AsOfDate) { if (_isAdjustedValue) { StockBar sameBar = (from p in output.Data where p.AsOfDate == bar.AsOfDate select p).FirstOrDefault() as StockBar; if (sameBar != null && sameBar.AdjClose.Value != bar.AdjClose.Value) { output = null; } } } else { output = null; } } else { output = null; } } if (output == null) { output = RetrieveStockTimeSeriesPrices(pricingRule.Ticker, _period, _isAdjustedValue, -1); } if (output != null && output.Data != null && output.Data.Count() > 0) { if (StoreHistoryPrices(pricingRule.SID, _period, _isAdjustedValue, output.Data)) { _logger.LogInfo(string.Format("({3}/{4}) Symbol:{0}, SID:{1}, P:{5}, Stored {2} bars", pricingRule.Ticker, pricingRule.SID, output.Data.Count(), idx, totalSymbols, pricingRule.Priority)); } else { _logger.LogInfo(string.Format("({3}/{4}) Symbol:{0}, SID:{1}, P:{5}, Failed stored {2} bars", pricingRule.Ticker, pricingRule.SID, output.Data.Count(), idx, totalSymbols, pricingRule.Priority)); } } else { _logger.LogInfo(string.Format("({2}/{3}) Symbol:{0}, SID:{1}, P:{4}, Can't retrive data", pricingRule.Ticker, pricingRule.SID, idx, totalSymbols, pricingRule.Priority)); } } catch (Exception ex) { _logger.LogError(string.Format("({3}/{4}) Symbol:{0}, SID:{1}, Error:{2}", pricingRule.Ticker, pricingRule.SID, ex.Message, idx, totalSymbols)); } } ; }
protected TimeSeriesDataOutput ConvertDataToTimeSeriesDataOutput(TimeSeriesDataInput input, DataTable dtTimeSeries) { if (input == null || string.IsNullOrEmpty(input.Symbol) || dtTimeSeries == null || dtTimeSeries.Rows.Count == 0) { return(null); } if (dtTimeSeries != null && dtTimeSeries.Columns.Count > 0) { foreach (DataColumn col in dtTimeSeries.Columns) { if (col.ColumnName.Trim().Contains(" ")) { col.ColumnName = col.ColumnName.Trim().Replace(" ", "_"); } } } TimeSeriesDataOutput result = null; if (input is CryptoTimeSeriesDataInput) { CryptoTimeSeriesDataInput cryptoInput = input as CryptoTimeSeriesDataInput; CryptoTimeSeriesDataOutput output = new CryptoTimeSeriesDataOutput(); output.Symbol = cryptoInput.Symbol; output.Market = cryptoInput.Market; output.TimeZone = "UTC"; List <CryptoBar> cryptoBars = new List <CryptoBar>(); List <string> fieldList = new List <string>(); foreach (DataColumn col in dtTimeSeries.Columns) { if (col.ColumnName.Contains(output.Market)) { fieldList.Add(col.ColumnName); } else if (AV_FIELD_LIST.Contains(col.ColumnName)) { fieldList.Add(col.ColumnName); } } foreach (DataRow row in dtTimeSeries.AsEnumerable()) { CryptoBar cryptoBar = new CryptoBar(); foreach (string field in fieldList) { if (field == AV_FIELD_TIMESTAMP) { cryptoBar.AsOfDate = Convert.ToDateTime(row[field]); } else if (field == AV_FIELD_VOLUME) { cryptoBar.Volume = row[field].ToDecimal(); } else if (field.StartsWith(AV_FIELD_MARKET_CAP)) { cryptoBar.MarketCap = row[field].ToDecimal(); } else if (field.StartsWith(AV_FIELD_OPEN)) { cryptoBar.Open = row[field].ToDouble(); } else if (field.StartsWith(AV_FIELD_HIGH)) { cryptoBar.High = row[field].ToDouble(); } else if (field.StartsWith(AV_FIELD_LOW)) { cryptoBar.Low = row[field].ToDouble(); } else if (field.StartsWith(AV_FIELD_CLOSE) || field.StartsWith(AV_FIELD_PRICE)) { cryptoBar.Close = row[field].ToDouble(); } } cryptoBars.Add(cryptoBar); } output.Data = cryptoBars.ToArray(); result = output; } else { TimeSeriesDataOutput output = new TimeSeriesDataOutput(); output.Symbol = input.Symbol; output.TimeZone = "US/Eastern"; List <StockBar> stockBars = new List <StockBar>(); List <string> fields = new List <string>(); foreach (string field in AV_FIELD_LIST) { if (dtTimeSeries.Columns.Contains(field)) { fields.Add(field); } } foreach (DataRow row in dtTimeSeries.AsEnumerable()) { StockBar bar = new StockBar(); foreach (string field in fields) { switch (field) { case AV_FIELD_TIMESTAMP: bar.AsOfDate = DateTime.Parse(row.Field <string>(field)); break; case AV_FIELD_OPEN: bar.Open = row[AV_FIELD_OPEN].ToDouble(); break; case AV_FIELD_HIGH: bar.High = row[AV_FIELD_HIGH].ToDouble(); break; case AV_FIELD_LOW: bar.Low = row[AV_FIELD_LOW].ToDouble(); break; case AV_FIELD_PRICE: case AV_FIELD_CLOSE: bar.Close = row[AV_FIELD_CLOSE].ToDouble(); break; case AV_FIELD_VOLUME: bar.Volume = row[AV_FIELD_VOLUME].ToDecimal(); break; case AV_FIELD_SPLIT_COEFFICIENT: bar.SplitCoefficient = row[AV_FIELD_SPLIT_COEFFICIENT].ToDouble(); break; case AV_FIELD_DIVIDEND_AMOUNT: bar.DividendAmount = row[AV_FIELD_DIVIDEND_AMOUNT].ToDouble(); break; case AV_FIELD_ADJUSTED_CLOSE: bar.AdjClose = row[AV_FIELD_ADJUSTED_CLOSE].ToDouble(); break; } } stockBars.Add(bar); } output.Data = stockBars.ToArray(); result = output; } return(result); }