public IEnumerable <ITradeData> ReadTradeData(TextReader textReader)
        {
            string line  = textReader.ReadLine();
            var    cIdx  = ColumnIndexes.GeFromHeaderLine(line, Separator);
            int    rowNo = 2;

            while ((line = textReader.ReadLine()) != null)
            {
                ITradeData tradeData = null;
                try
                {
                    string[] values = line.Split(new char[] { Separator });
                    if (values.Length > 6)
                    {
                        throw new FormatException("Too many columns in a row.");
                    }
                    tradeData = new TradeData(values[cIdx.DateIndex], values[cIdx.OpenIndex], values[cIdx.HighIndex], values[cIdx.LowIndex], values[cIdx.CloseIndex], values[cIdx.VolumeIndex]).CheckDataBusinessCorrectness();
                }
                catch (Exception e)
                {
                    e.Data["rowNo"] = rowNo;
                    Trace.TraceError("Exception when processing row number: " + rowNo + " (" + e.Message + ")");
                    throw e;
                }
                rowNo++;
                yield return(tradeData);
            }
        }
        public IEnumerable <ITradeData> ReadTradeData(TextReader textReader)
        {
            string line;
            int    rowNo = 1;

            while ((line = textReader.ReadLine()) != null)
            {
                ITradeData tradeData = null;
                try
                {
                    string[] values = line.Split(new char[] { Separator });
                    if (values.Length > 6)
                    {
                        throw new FormatException("Too many columns in a row.");
                    }
                    tradeData = new TradeData(values[0], values[1], values[2], values[3], values[4], values[5]).CheckDataBusinessCorrectness();
                }
                catch (Exception e)
                {
                    e.Data["rowNo"] = rowNo;
                    Trace.TraceError("Exception when processing row number: " + rowNo + " (" + e.Message + ")");
                    throw e;
                }
                rowNo++;
                yield return(tradeData);
            }
        }
        public IEnumerable <ITradeData> ReadTradeData(TextReader textReader)
        {
            XmlReader reader = XmlReader.Create(textReader);

            reader.MoveToContent();
            reader.ReadToDescendant("value");
            int rowNo = 1;

            do
            {
                ITradeData tradeData = null;
                try
                {
                    var date   = reader.GetAttribute("date");
                    var open   = reader.GetAttribute("open");
                    var high   = reader.GetAttribute("high");
                    var low    = reader.GetAttribute("low");
                    var close  = reader.GetAttribute("close");
                    var volume = reader.GetAttribute("volume");
                    tradeData = new TradeData(date, open, high, low, close, volume).CheckDataBusinessCorrectness();
                }
                catch (Exception e)
                {
                    e.Data["rowNo"] = rowNo;
                    Trace.TraceError("Exception when processing row number: " + rowNo + " (" + e.Message + ")");
                    throw e;
                }
                rowNo++;
                yield return(tradeData);
            } while (reader.ReadToNextSibling("value"));
        }