Exemple #1
0
        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);
        }
Exemple #2
0
        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));
                }
            }
            ;
        }
Exemple #3
0
        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);
        }