public ICFTCParserResult Parse(ICFTCParserParams parserParams)
        {
            ICFTCParserResult result = new CFTCParserResult();

            // preparing list of files to be downloaded and parsed
            List <string> files = new List <string>();

            files.Add(parserParams.RecentDataPath);
            if (!parserParams.OnlyLast)
            {
                files.AddRange(parserParams.HistorticalDataPaths);
            }

            foreach (var path in files)
            {
                try
                {
                    string url = string.Format("https://www.cftc.gov{0}", path);

                    // downloading
                    byte[] data = ServiceCall(url);
                    if (data != null)
                    {
                        Stream dataStream = Decompress(data);
                        data = null;
                        System.GC.Collect();
                        if (dataStream != null)
                        {
                            StreamReader sr  = new StreamReader(dataStream);
                            string       txt = sr.ReadToEnd();

                            ParseCSV(txt, true, parserParams, result);

                            dataStream.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    // suppressing errors in case if one of the files was not parsed
                }
            }

            return(result);
        }
        public IQuotesSourceGetQuotesResult GetQuotes(IQuotesSourceGetQuotesParams getQuotesParams)
        {
            // For COT reports we don't extract selected items only because it will be too expensive
            // Rather we're loading the whole report with all items there
            // For this purposes we only identifying the types of items we need to extract based on indicator prefixes

            IQuotesSourceGetQuotesResult result = new CFTCSourceGetQuotesResult();

            CFTCParser cftcParser = new CFTCParser();

            // checking which types we need and preparing parameters
            List <ICFTCParserParams> parserParams = new List <ICFTCParserParams>();

            foreach (var pt in s_paramTypes)
            {
                ICFTCParserParams cotTypeParams = null;

                // at least one ticker has a prefix of given type - adding corresponding params object to parse proper report
                // if no tickers are specified - importing all
                if ((getQuotesParams.Tickers == null || getQuotesParams.Tickers.Count() == 0) || getQuotesParams.Tickers.Count(x => x.Contains(pt.TickerPrefix)) > 0)
                {
                    cotTypeParams          = pt.Clone();
                    cotTypeParams.OnlyLast = getQuotesParams.PeriodStart.Year == DateTime.Now.Year ? true : false;
                    parserParams.Add(cotTypeParams);
                }
            }

            // for the list of parameters - calling parser to load proper report
            foreach (var parserParam in parserParams)
            {
                ICFTCParserResult parserResult = cftcParser.Parse(parserParam);

                foreach (CFTCInstrumentQuotes i in parserResult.Instruments.Values)
                {
                    IQuotesData qd = new BaseQuotesData();
                    qd.Country   = getQuotesParams.Country;
                    qd.Ticker    = i.Ticker;
                    qd.Name      = i.Description;
                    qd.Unit      = TickerUnit(i.Ticker);
                    qd.Type      = TickerType(i.Ticker);
                    qd.TimeFrame = ETimeFrame.Weekly;

                    foreach (var q in i.Quotes)
                    {
                        ITimeSeriesRecord tsr = new CustomTimeseriesRecord(i.Timeseries, q.ReportDate, q.Values);
                        qd.AddRecord(tsr);
                    }

                    qd.AgencyCode = s_agencyCode;

                    result.QuotesData.Add(qd);
                }
            }

            result.Success = result.QuotesData.Count > 0;
            if (result.Success && result.QuotesData.Count < getQuotesParams.Tickers.Count)
            {
                result.AddError(Interfaces.EErrorCodes.QuotesNotFound, Interfaces.EErrorType.Warning, "Not all quotes were found");
            }
            else if (!result.Success)
            {
                result.AddError(Interfaces.EErrorCodes.QuotesNotFound, Interfaces.EErrorType.Error, "Requested tickers are not supported or quotes for them not found");
            }

            return(result);
        }
        private void ParseCSV(string text, bool header, ICFTCParserParams parserParams, ICFTCParserResult result)
        {
            CFTCInstrumentQuotes curInstrument = null;

            int colName           = 0;
            int colReportDate     = 2;
            int colCFTCMarketCode = 3;

            StringReader sr = new StringReader(text);

            string line          = null;
            bool   headerSkipped = false;

            do
            {
                line = sr.ReadLine();
                if (line != null && header && !headerSkipped)
                {
                    headerSkipped = true;
                }
                else if (line != null)
                {
                    string[] vals = parserParams.SplitLine(line.Trim());
                    if (vals.Count() >= parserParams.ColumnsToTimeseriesMapping.Keys.Max() + 1)
                    {
                        // reading common values
                        CultureInfo enUS = new CultureInfo("en-US");
                        DateTime    repDate;
                        // WARNING! There can be different time formats in the files
                        if (!DateTime.TryParse(vals[colReportDate], out repDate) &&
                            !DateTime.TryParseExact(vals[colReportDate], "M/dd/yyyy hh:mm:ss tt", enUS, DateTimeStyles.None, out repDate))
                        {
                            // fixing line with bad comma in description
                            int           badComma = line.IndexOf(',');
                            StringBuilder sb       = new StringBuilder(line);
                            sb[badComma] = ':';
                            vals         = parserParams.SplitLine(sb.ToString().Trim());

                            DateTime.TryParse(vals[colReportDate], out repDate);
                        }

                        string name       = vals[colName].Trim(new char[] { '"' });
                        string marketCode = vals[colCFTCMarketCode];

                        // checking - if its new instrument
                        if (curInstrument == null || !curInstrument.Ticker.Equals(parserParams.TickerPrefix + marketCode))
                        {
                            curInstrument = new CFTCInstrumentQuotes()
                            {
                                Ticker      = parserParams.TickerPrefix + marketCode,
                                Description = name
                            };
                            curInstrument.Timeseries.AddRange(parserParams.ColumnsToTimeseriesMapping.Values);

                            CFTCInstrumentQuotes instrument = null;
                            if (!result.Instruments.TryGetValue(curInstrument.Ticker, out instrument))
                            {
                                result.Instruments.Add(curInstrument.Ticker, curInstrument);
                            }
                            else
                            {
                                curInstrument = instrument;
                            }
                        }

                        // creating new record
                        CFTCRecord rec = new CFTCRecord(parserParams.ColumnsToTimeseriesMapping.Count);
                        rec.ReportDate = repDate;
                        int i = 0;
                        foreach (int col in parserParams.ColumnsToTimeseriesMapping.Keys)
                        {
                            rec[i] = Decimal.Parse(vals[col]);
                            ++i;
                        }

                        curInstrument.Quotes.Add(rec);
                    }
                }
            }while (line != null);
        }