private bool ParseHarpex(StockSerie stockSerie, string fileName)
        {
            // Read new downloaded values
             if (!File.Exists(fileName))
             {
            return false;
             }
             bool res = false;

             StockDailyValue harpexValue = null;
             DateTime date;
             float harpex = 0;
             string line = string.Empty;
             try
             {
            using (StreamReader sr = new StreamReader(fileName, true))
            {
               // File format
               // "date";"HARPEX";"Class 1";"Class 2";"Class 3";"Class 4";"Class 5";"Class 6";"Class 7";"Class 8"
               // 14/07/07;1296.25;1196.94;1163.11;1207.74;1180.47;1406.11;1404.5;1388.44;1475.32

               sr.ReadLine(); // Skip first line
               while (!sr.EndOfStream)
               {
                  line = sr.ReadLine();
                  string[] row = line.Split(';');
                  date = DateTime.Parse(row[0], StockAnalyzerApp.Global.EnglishCulture);
                  harpex = float.Parse(row[1], StockAnalyzerApp.Global.EnglishCulture);

                  harpexValue = new StockDailyValue(stockSerie.StockName,
                      harpex,
                      harpex,
                      harpex,
                      harpex, 0, date);
                  stockSerie.Add(harpexValue.DATE, harpexValue);
                  harpexValue.Serie = stockSerie;
               }
            }
            res = true;
             }
             catch (System.Exception e)
             {
            StockLog.Write("Failed to parse Harpex file " + e.Message + "\r\r" + line);
             }
             return res;
        }
        private static void ParseIntradayData(StockSerie stockSerie, string folder, string fileName)
        {
            try
             {
            if (File.Exists(folder + "\\" + fileName))
            {
               using (StreamReader sr = new StreamReader(folder + "\\" + fileName))
               {
                  string line = sr.ReadLine();
                  string[] row = line.Replace("\"", "").Replace(" - ", ",").Split(',');
                  if (row.Length == 7)
                  {
                     try
                     {
                        StockDailyValue dailyValue = new StockDailyValue(stockSerie.StockName,
                            float.Parse(row[2], usCulture),
                            float.Parse(row[4], usCulture),
                            float.Parse(row[3], usCulture),
                            float.Parse(row[5], usCulture),
                            long.Parse(row[6]),
                            DateTime.Parse(row[0] + " " + row[1], usCulture));

                        StockDailyValue lastValue = stockSerie.Values.Last();

                        if (lastValue.DATE.Date == dailyValue.DATE.Date)
                        {
                           if (lastValue.DATE.Hour == 0 && lastValue.DATE.Minute == 0) return;

                           stockSerie.Remove(lastValue.DATE);
                        }
                        stockSerie.Add(dailyValue.DATE, dailyValue);
                        stockSerie.ClearBarDurationCache();
                     }
                     catch (System.Exception e)
                     {
                        StockLog.Write("Unable to parse intraday data for " + stockSerie.StockName);
                        StockLog.Write(line);
                        StockLog.Write(e);
                     }
                  }
               }
            }
             }
             catch (System.Exception e)
             {
            StockLog.Write("Unable to parse intraday data for " + stockSerie.StockName);
            StockLog.Write(e);
             }
        }
        private bool GenerateSumSerie(StockSerie stockSerie, StockSerie trinSerie, bool inverse)
        {
            StockDailyValue logValue = null;
             float sum = 0f;
             foreach (StockDailyValue dailyValue in trinSerie.Values)
             {
            sum += dailyValue.CLOSE;

            logValue = new StockDailyValue(stockSerie.StockName,
               sum,
               sum,
               sum,
               sum, 0, dailyValue.DATE);
            stockSerie.Add(logValue.DATE, logValue);
            logValue.Serie = stockSerie;
             }
             return true;
        }
        private static bool ParseIntradayData(StockSerie stockSerie, string fileName)
        {
            bool res = false;
             try
             {
            using (StreamReader sr = new StreamReader(fileName))
            {
               string line;

               while ((line = sr.ReadLine()) != null)
               {
                  if (line.StartsWith("timezone")) break;
               }
               if (sr.EndOfStream) return false;
               string[] row = line.Split(new char[] { ':' });
               string timeZone = row[1];
               double gmtoffset = timeZone == "CEST" ? -32400 : 0;

               while ((line = sr.ReadLine()) != null)
               {
                  if (line.StartsWith("gmtoffset")) break;
               }
               if (sr.EndOfStream) return false;

               row = line.Split(new char[] { ':' });
               gmtoffset += double.Parse(row[1]);

               DateTime now = DateTime.Now;
               DateTime utcNow = now.ToUniversalTime();
               gmtoffset -= (now - utcNow).TotalSeconds;

               while (!(line = sr.ReadLine()).StartsWith("range")) ;

               // First Range, read second offest for date calculation.
               row = line.Split(new char[] { ',', ':' });
               DateTime startDate = new DateTime(int.Parse(row[1].Substring(0, 4)), int.Parse(row[1].Substring(4, 2)), int.Parse(row[1].Substring(6, 2)));

               //  startDate = startDate.AddHours(9);
               long startTimeStamp = long.Parse(row[2]);

               while (!(line = sr.ReadLine()).StartsWith("volume")) ;

               while (!sr.EndOfStream)
               {
                  line = sr.ReadLine();

                  row = line.Split(new char[] { ',' });

                  DateTime openDate = startDate;
                  openDate = startDate.AddSeconds(long.Parse(row[0]) - startTimeStamp);
                  openDate = startDate.AddSeconds(long.Parse(row[0]) - startTimeStamp - gmtoffset);
                  if (!stockSerie.ContainsKey(openDate))
                  {
                     StockDailyValue dailyValue = new StockDailyValue(stockSerie.StockName,
                            float.Parse(row[4], usCulture),
                            float.Parse(row[2], usCulture),
                            float.Parse(row[3], usCulture),
                            float.Parse(row[1], usCulture),
                            long.Parse(row[5]),
                            openDate);
                     stockSerie.Add(dailyValue.DATE, dailyValue);
                  }
               }

               stockSerie.ClearBarDurationCache();

               res = true;
            }
             }
             catch (System.Exception e)
             {
            StockLog.Write("Unable to parse intraday data for " + stockSerie.StockName);
            StockLog.Write(e);
             }
             return res;
        }
        private static bool ParseIntradayData(StockSerie stockSerie, string fileName)
        {
            bool res = false;
             try
             {
            using (StreamReader sr = new StreamReader(fileName))
            {
               while (!sr.EndOfStream)
               {
                  string line = sr.ReadLine();
                  string[] row = line.Split(',');
                  if (row.Length <2) continue;

                  DateTime openDate;
                  if (!DateTime.TryParse(row[0], out openDate)) continue;
                  float value = float.Parse(row[1]);

                  if (!stockSerie.ContainsKey(openDate))
                  {
                     StockDailyValue dailyValue = new StockDailyValue(stockSerie.StockName,
                            value,
                            value,
                            value,
                            value,
                            0,
                            openDate);
                     stockSerie.Add(dailyValue.DATE, dailyValue);
                  }
               }

               stockSerie.ClearBarDurationCache();

               res = true;
            }
             }
             catch (System.Exception e)
             {
            StockLog.Write("Unable to parse intraday data for " + stockSerie.StockName);
            StockLog.Write(e);
             }
             return res;
        }
 public static StockDailyValue ReadPCRFromCSVStream(StreamReader sr, string name)
 {
     StockDailyValue stockValue = null;
      try
      {
     string[] row = sr.ReadLine().Split(',');
     if (row.GetLength(0) == 5)
     {
        stockValue = new StockDailyValue(
            name,
            float.Parse(row[4], usCulture),
            float.Parse(row[4], usCulture),
            float.Parse(row[4], usCulture),
            float.Parse(row[4], usCulture),
            long.Parse(row[3], usCulture),
            DateTime.Parse(row[0], usCulture));
     }
      }
      catch (System.Exception)
      {
     // Assume input is right, Ignore invalid lines
      }
      return stockValue;
 }
        private static bool ParseIntradayData(StockSerie stockSerie, string fileName)
        {
            bool res = false;
             try
             {
            using (StreamReader sr = new StreamReader(fileName))
            {
               string line = sr.ReadLine();

               while (!(line = sr.ReadLine()).StartsWith("INTERVAL")) ;
               int interval;
               interval = int.Parse(line.Split('=')[1]);

               while (!(line = sr.ReadLine()).StartsWith("TIMEZONE_OFFSET")) ;
               int offset;
               offset = int.Parse(line.Split('=')[1]);

               string[] row;
               DateTime startDate = DateTime.Now;
               while (!sr.EndOfStream)
               {
                  line = sr.ReadLine();
                  DateTime openDate = DateTime.Now;
                  row = line.Split(new char[] { ',' });

                  if (line.StartsWith("a"))
                  {
                     // new day detected
                     string startString = row[0].Replace("a", "");
                     double seconds = double.Parse(startString);

                     startDate = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(seconds).AddMinutes(offset);
                     openDate = startDate;
                  }
                  else if (line.StartsWith("TIMEZONE_OFFSET"))
                  {
                     offset = int.Parse(line.Split('=')[1]);
                     continue;
                  }
                  else
                  {
                     // just a new bar
                     openDate = startDate.AddSeconds(long.Parse(row[0]) * interval);
                  }

                  if (!stockSerie.ContainsKey(openDate))
                  {
                     StockDailyValue dailyValue = new StockDailyValue(stockSerie.StockName,
                            float.Parse(row[4], usCulture),
                            float.Parse(row[2], usCulture),
                            float.Parse(row[3], usCulture),
                            float.Parse(row[1], usCulture),
                            long.Parse(row[5]),
                            openDate);
                     stockSerie.Add(dailyValue.DATE, dailyValue);
                  }
               }

               stockSerie.ClearBarDurationCache();

               res = true;
            }
             }
             catch (System.Exception e)
             {
            StockLog.Write("Unable to parse intraday data for " + stockSerie.StockName);
            StockLog.Write(e);
             }
             return res;
        }
        // Private methods
        private bool ParseVIXPCRatioCSV(StockSerie stockSerie, string fileName)
        {
            if (File.Exists(fileName))
             {
            using (StreamReader sr = new StreamReader(fileName))
            {
               try
               {
                  StockDailyValue readValue = null;

                  // Skip 2 first lines
                  string name = "PCR.VIX";
                  sr.ReadLine();
                  sr.ReadLine();
                  while (sr.ReadLine().Contains("\"") && !sr.EndOfStream) ;

                  while (!sr.EndOfStream)
                  {
                     readValue = null;
                     string[] row = sr.ReadLine().Split(',');
                     if (row.GetLength(0) == 5)
                     {
                        readValue = new StockDailyValue(
                            name,
                            float.Parse(row[1], usCulture),
                            float.Parse(row[1], usCulture),
                            float.Parse(row[1], usCulture),
                            float.Parse(row[1], usCulture),
                            long.Parse(row[4], usCulture),
                            DateTime.Parse(row[0], usCulture));
                        stockSerie.Add(readValue.DATE, readValue);
                     }
                  }
               }
               catch (System.Exception e)
               {
                  StockLog.Write(e);
                  return false;
               }
            }
            return true;
             }
             else
             {
            return false;
             }
        }
        private bool ParseABCIntradayFile(StockSerie stockSerie, string fileName)
        {
            StockLog.Write("ParseABCIntradayFile: " + fileName);

            if (!File.Exists(fileName)) return false;
            using (StreamReader sr = new StreamReader(fileName, true))
            {
                string line = sr.ReadLine();
                while (!sr.EndOfStream)
                {
                    string[] row = line.Split(';');
                    if (row[0] == stockSerie.ISIN)
                    {
                        if (DateTime.Parse(row[1]) == stockSerie.Keys.Last())
                        {
                            return false;
                        }
                        StockDailyValue dailyValue = new StockDailyValue(
                            stockSerie.StockName,
                            float.Parse(row[2], usCulture),
                            float.Parse(row[3], usCulture),
                            float.Parse(row[4], usCulture),
                            float.Parse(row[5], usCulture),
                            long.Parse(row[6]),
                            File.GetLastWriteTime(fileName));
                        stockSerie.Add(dailyValue.DATE, dailyValue);

                        stockSerie.ClearBarDurationCache();
                        return true;
                    }
                    line = sr.ReadLine();
                }
            }
            return false;
        }
        public override bool LoadData(string rootFolder, StockSerie stockSerie)
        {
            if (finraSerie == null)
            {
                finraSerie = LoadFINRASerie(rootFolder + FOLDER + "\\FINRA_Bond_Breadth.xml");
            }

            // Convert from StockFINRASerie to StockSerie
            var fields = stockSerie.StockName.Split('.');
            StockDailyValue dailyValue = null;
            switch (fields[0])
            {
                case "BOND_AD":
                    switch (fields[1])
                    {
                        case "ALL":

                            break;
                        case "IG":
                            foreach (var val in finraSerie.InvestGrade)
                            {
                                float open = -1.0f + (float)val.Advances * 2.0f / (float)val.Total;
                                dailyValue = new StockDailyValue(stockSerie.StockName, open, open, open, open, val.Volume, val.Date);
                                stockSerie.Add(val.Date, dailyValue);
                            }
                            break;
                        case "HY":
                            foreach (var val in finraSerie.HighYield)
                            {
                                float open = -1.0f + (float)val.Advances * 2.0f / (float)val.Total;
                                dailyValue = new StockDailyValue(stockSerie.StockName, open, open, open, open, val.Volume, val.Date);
                                stockSerie.Add(val.Date, dailyValue);
                            }
                            break;
                    }
                    break;
                case "McClellan":
                    switch (fields[1])
                    {
                        case "ALL":

                            break;
                        case "IG":
                            {
                                var serie = StockDictionary.StockDictionarySingleton["BOND_AD.IG"];
                                if (!serie.Initialise()) return false;
                                FloatSerie ema19 = serie.GetIndicator("EMA(19)").Series[0];
                                FloatSerie ema39 = serie.GetIndicator("EMA(39)").Series[0];
                                var diff = ema19 - ema39;
                                int i = 0;
                                foreach (var val in serie.Values)
                                {
                                    float open = diff[i++];
                                    dailyValue = new StockDailyValue(stockSerie.StockName, open, open, open, open, val.VOLUME, val.DATE);
                                    stockSerie.Add(val.DATE, dailyValue);
                                }
                            }
                            break;
                        case "HY":
                            {
                                var serie = StockDictionary.StockDictionarySingleton["BOND_AD.HY"];
                                if (!serie.Initialise()) return false;
                                FloatSerie ema19 = serie.GetIndicator("EMA(19)").Series[0];
                                FloatSerie ema39 = serie.GetIndicator("EMA(39)").Series[0];
                                var diff = ema19 - ema39;
                                int i = 0;
                                foreach (var val in serie.Values)
                                {
                                    float open = diff[i++];
                                    dailyValue = new StockDailyValue(stockSerie.StockName, open, open, open, open, val.VOLUME, val.DATE);
                                    stockSerie.Add(val.DATE, dailyValue);
                                }
                            }
                            break;
                    }
                    break;
            }

            return true;
        }
        private bool ParseABCGroupCSVFile(string fileName, StockSerie.Groups group, bool intraday = false)
        {
            //StockLog.Write(fileName);

            if (!File.Exists(fileName)) return false;
            StockSerie stockSerie = null;
            using (StreamReader sr = new StreamReader(fileName, true))
            {
                string line = sr.ReadLine();
                string previousISIN = string.Empty;
                while (!sr.EndOfStream)
                {
                    string[] row = line.Split(';');
                    if (previousISIN != row[0])
                    {
                        stockSerie = stockDictionary.Values.FirstOrDefault(s => s.ISIN == row[0] && s.StockGroup == group);
                        previousISIN = row[0];
                    }
                    if (stockSerie != null)
                    {
                        DateTime date;
                        if (intraday)
                        {
                            date = File.GetLastWriteTime(fileName);
                        }
                        else
                        {
                            date = DateTime.Parse(row[1]);
                        }
                        if (date.Year >= LOAD_START_YEAR)
                        {
                            if (!stockSerie.ContainsKey(date))
                            {
                                StockDailyValue dailyValue = new StockDailyValue(
                                  stockSerie.StockName,
                                  float.Parse(row[2], frenchCulture),
                                  float.Parse(row[3], frenchCulture),
                                  float.Parse(row[4], frenchCulture),
                                  float.Parse(row[5], frenchCulture),
                                  long.Parse(row[6], frenchCulture),
                                  date);
                                stockSerie.Add(dailyValue.DATE, dailyValue);
                            }
                        }
                        else
                        {
                            return false;
                        }
                    }
                    line = sr.ReadLine();
                }
            }
            return true;
        }
 protected StockDailyValue ReadMarketDataFromABCCSVStream(StreamReader sr, string stockName, bool useAdjusted)
 {
     StockDailyValue stockValue = null;
     try
     {
         // File format
         // ISIN,Date,Open,High,Low,Close,Volume
         // FR0000120404;02/01/12;19.735;20.03;19.45;19.94;418165
         string line = sr.ReadLine().Trim();
         if (string.IsNullOrEmpty(line) || line.StartsWith("<") || line.StartsWith("/")) return null;
         string[] row = line.Split(';');
         stockValue = new StockDailyValue(
             stockName,
         float.Parse(row[2], usCulture),
         float.Parse(row[3], usCulture),
         float.Parse(row[4], usCulture),
         float.Parse(row[5], usCulture),
         long.Parse(row[6], usCulture),
         DateTime.Parse(row[1], frenchCulture));
     }
     catch (System.Exception ex)
     {
         StockLog.Write(ex.Message);
     }
     return stockValue;
 }
        protected virtual StockDailyValue ReadMarketDataFromCSVStream(StreamReader sr, string stockName, bool useAdjusted)
        {
            StockDailyValue stockValue = null;
             try
             {
            // File format
            // Date,Open,High,Low,Close,Volume,Adj Close (UpVolume, Tick, Uptick)
            // 2010-06-18,10435.00,10513.75,10379.60,10450.64,4555360000,10450.64
            string[] row = sr.ReadLine().Split(',');
            switch (row.Length)
            {
               case 5: // Date,Open,High,Low,Close
                  {
                     DateTime day = DateTime.Parse(row[0], usCulture);
                     stockValue = new StockDailyValue(
                        stockName,
                        float.Parse(row[1], usCulture),
                        float.Parse(row[2], usCulture),
                        float.Parse(row[3], usCulture),
                        float.Parse(row[4], usCulture),
                        0,
                        day);
                  }
                  break;
               case 6: // Date,Open,High,Low,Close,Volume
                  {
                     string[] dateFields = row[0].Split('/');

                     if (row[1] == "-" || row[2] == "-" || row[3] == "-" || row[4] == "-")
                        return null;

                     if (row[5] == "-") row[5] = "0";

                     DateTime day = DateTime.Parse(row[0]);
                     // new DateTime(int.Parse(dateFields[2]), int.Parse(dateFields[0]), int.Parse(dateFields[1]));
                     int index = row[5].IndexOf('.');
                     if (index > 0)
                     {
                        row[5] = row[5].Remove(index);
                     }
                     stockValue = new StockDailyValue(
                        stockName,
                        float.Parse(row[1], usCulture),
                        float.Parse(row[2], usCulture),
                        float.Parse(row[3], usCulture),
                        float.Parse(row[4], usCulture),
                        long.Parse(row[5], usCulture),
                        day);
                  }
                  break;
               case 7: // Date,Open,High,Low,Close,Volume,Adj Close
                  if (useAdjusted || row[4] != row[6])
                  {
                     float close = float.Parse(row[4], usCulture);
                     float adjClose = float.Parse(row[6], usCulture);
                     float adjRatio = adjClose / close;
                     stockValue = new StockDailyValue(
                         stockName,
                         float.Parse(row[1], usCulture) * adjRatio,
                         float.Parse(row[2], usCulture) * adjRatio,
                         float.Parse(row[3], usCulture) * adjRatio,
                         adjClose,
                         long.Parse(row[5], usCulture),
                         DateTime.Parse(row[0], usCulture));
                  }
                  else
                  {
                     stockValue = new StockDailyValue(
                             stockName,
                             float.Parse(row[1], usCulture),
                             float.Parse(row[2], usCulture),
                             float.Parse(row[3], usCulture),
                             float.Parse(row[4], usCulture),
                             long.Parse(row[5], usCulture),
                             DateTime.Parse(row[0], usCulture));
                  }
                  break;
               case 10: // Date,Open,High,Low,Close,Volume,Adj Close (UpVolume, Tick, Uptick)
                  {
                     stockValue = new StockDailyValue(
                                 stockName,
                                 float.Parse(row[1], usCulture),
                                 float.Parse(row[2], usCulture),
                                 float.Parse(row[3], usCulture),
                                 float.Parse(row[4], usCulture),
                                 long.Parse(row[5], usCulture),
                                 long.Parse(row[7], usCulture),
                                 int.Parse(row[8], usCulture),
                                 int.Parse(row[9], usCulture),
                                 DateTime.Parse(row[0], usCulture));
                  }
                  break;
            }
             }
             catch (System.Exception ex)
             {
            StockLog.Write(ex.Message);
            // Assume input is right, Ignore invalid lines
             }
             return stockValue;
        }
        private bool ParseCBOEIndexCSV(StockSerie stockSerie, string fileName)
        {
            if (File.Exists(fileName))
             {
            using (StreamReader sr = new StreamReader(fileName))
            {
               try
               {
                  StockDailyValue readValue = null;

                  sr.ReadLine();  // Skip the first line
                  sr.ReadLine();  // Skip the second line

                  while (!sr.EndOfStream)
                  {
                     // File format
                     // Date,Close
                     // 10-May-07,27.09
                     string[] row = sr.ReadLine().Split(',');
                     if (row.GetLength(0) == 2 && row[1] != "")
                     {
                        readValue = new StockDailyValue(
                            stockSerie.StockName,
                            float.Parse(row[1], usCulture),
                            float.Parse(row[1], usCulture),
                            float.Parse(row[1], usCulture),
                            float.Parse(row[1], usCulture),
                            100,
                            DateTime.Parse(row[0], usCulture));

                        if (readValue != null)
                        {
                           stockSerie.Add(readValue.DATE, readValue);
                        }
                     }
                  }
               }
               catch (System.Exception e)
               {
                  StockLog.Write(e);
                  return false;
               }
            }
            return true;
             }
             else
             {
            return false;
             }
        }
        private bool ParseBullBearRatio(StockSerie stockSerie, string fileName)
        {
            // Read new downloaded values

             StockDailyValue bearBullRatioValue = null;
             DateTime date;
             float bearish = 0;
             float bullish = 0;
             float neutral = 0;
             float ratio = 0;
             string line = string.Empty;
             bool res = false;
             try
             {
            using (StreamReader sr = new StreamReader(fileName, true))
            {
               // File format
               // Date,Bullish,Neutral,Bearish
               // 9-11-87,50.0,23.0,27.0
               sr.ReadLine(); // Skip first line
               while (!sr.EndOfStream)
               {
                  line = sr.ReadLine();
                  if (string.IsNullOrWhiteSpace(line))
                  {
                     continue;
                  }

                  string[] row = line.Replace(":","").Split(new []{',',':','\t'});
                  date = DateTime.Parse(row[0], usCulture);
                  if (row[1].Contains("%"))
                  {
                     bullish = float.Parse(row[1].TrimEnd(percent), usCulture) / 100f;
                     neutral = float.Parse(row[2].TrimEnd(percent), usCulture) / 100f;
                     bearish = float.Parse(row[3].TrimEnd(percent), usCulture) / 100f;
                  }
                  else
                  {
                     bullish = float.Parse(row[1], usCulture);
                     neutral = float.Parse(row[2], usCulture);
                     bearish = float.Parse(row[3], usCulture);
                  }
                  ratio = bearish / bullish;

                  bearBullRatioValue = new StockDailyValue(bearBullRatioName,
                      ratio,
                      ratio,
                      ratio,
                      ratio, 0, date);
                  stockSerie.Add(bearBullRatioValue.DATE, bearBullRatioValue);
                  bearBullRatioValue.Serie = stockSerie;
               }
            }
            res = true;
             }
             catch (System.Exception e)
             {
            StockLog.Write("Failed to parse Bull/Bear ratio file: " + e.Message + "\r\r" + line);
             }
             return res;
        }
        private bool ParsePCRatioCSV(StockSerie stockSerie, string fileName)
        {
            if (File.Exists(fileName))
             {
            using (StreamReader sr = new StreamReader(fileName))
            {
               StockDailyValue readValue = null;

               while (!sr.ReadLine().EndsWith("P/C Ratio") && !sr.EndOfStream) ;

               while (!sr.EndOfStream)
               {
                  try
                  {
                     string[] row = sr.ReadLine().Split(',');
                     float ratio = float.Parse(row[4], usCulture);

                     //ratio = (float)Math.Log10(ratio);
                     //if (inverse) ratio = -ratio;

                     readValue = new StockDailyValue(
                         stockSerie.StockName,
                         ratio,
                         ratio,
                         ratio,
                         ratio,
                         long.Parse(row[3], usCulture),
                         DateTime.Parse(row[0], usCulture));
                     if (readValue != null && !stockSerie.ContainsKey(readValue.DATE))
                     {
                        stockSerie.Add(readValue.DATE, readValue);
                     }
                  }
                  catch (System.Exception e)
                  {
                     StockLog.Write(e);
                     return false;
                  }
               }
            }
            return true;
             }
             else
             {
            return false;
             }
        }
        private bool GenerateBullBearLogRatio(StockSerie stockSerie, bool inverse)
        {
            StockSerie ratioSerie = AAIIDataProvider.stockDictionary[bearBullRatioName];

             StockDailyValue bearBullLogRatioValue = null;
             float ratio;
             foreach (StockDailyValue dailyValue in ratioSerie.Values)
             {
            ratio = (float) Math.Log10(dailyValue.CLOSE);
            if (inverse) ratio = -ratio;

            bearBullLogRatioValue = new StockDailyValue(bearBullRatioName,
               ratio,
               ratio,
               ratio,
               ratio, 0, dailyValue.DATE);
            stockSerie.Add(bearBullLogRatioValue.DATE, bearBullLogRatioValue);
            bearBullLogRatioValue.Serie = stockSerie;
             }
             return true;
        }
        private bool ParseRydexData(StockSerie stockSerie, string fileName)
        {
            if (File.Exists(fileName))
             {
            using (StreamReader sr = new StreamReader(fileName))
            {
               StockDailyValue readValue = null;
               string line;

               // Skip 2 first lines
               while (!sr.EndOfStream && !(line = sr.ReadLine()).Contains("Date")) ;

               while (!sr.EndOfStream)
               {
                  readValue = null;
                  line = sr.ReadLine();
                  if (string.IsNullOrEmpty(line))
                  {
                     break;
                  }
                  line = line.Replace("\",\"", ";");
                  line = line.Replace("\"", "");
                  string[] row = line.Split(';');
                  if (row[2] == "N/A" || row[3] == "N/A" || row[1] == "AM") continue;
                  float value = float.Parse(row[3], usCulture) / float.Parse(row[2], usCulture);
                  readValue = new StockDailyValue(
                      stockSerie.StockName,
                      value,
                      value,
                      value,
                      value,
                      0,
                      DateTime.Parse(row[0], usCulture));
                  if (!stockSerie.ContainsKey(readValue.DATE))
                  {
                     stockSerie.Add(readValue.DATE, readValue);
                  }
               }
            }
            return true;
             }
             return false;
        }
 private bool GenerateLogSerie(StockSerie stockSerie, StockSerie ratioSerie, bool inverse)
 {
     StockDailyValue logValue = null;
      float ratio = 0;
      foreach (StockDailyValue dailyValue in ratioSerie.Values)
      {
     if (dailyValue.CLOSE > 0f)
     {
        ratio = (float)Math.Log10(dailyValue.CLOSE);
        if (inverse) ratio = -ratio;
     }
     logValue = new StockDailyValue(stockSerie.StockName,
        ratio,
        ratio,
        ratio,
        ratio, 0, dailyValue.DATE);
     stockSerie.Add(logValue.DATE, logValue);
     logValue.Serie = stockSerie;
      }
      return true;
 }
        private bool ParseCOT(StockSerie stockSerie, string fileName)
        {
            StockLog.Write("ParseCOT: " + stockSerie.StockName + " from file: " + fileName);
             string line = string.Empty;
             bool res = false;
             try
             {
            int cotLongIndex = 10;
            int cotShortIndex = 11;
            int cotOpenInterestIndex = 6;
            using (StreamReader sr = new StreamReader(fileName))
            {
               StockDailyValue readValue = null;
               int endOfNameIndex = 0;

               string cotSerieName = string.Empty;
               DateTime cotDate;
               float cotValue = 0.0f;
               string[] row;
               sr.ReadLine();   // Skip header line
               while (!sr.EndOfStream)
               {
                  line = sr.ReadLine().Replace("\"", "");
                  if (line == string.Empty)
                  {
                     continue;
                  }
                  res = true;

                  endOfNameIndex = line.IndexOf(",");
                  cotSerieName = line.Substring(0, endOfNameIndex);
                  if (cotSerieName.Contains(" - "))
                  {
                     cotSerieName = cotSerieName.Substring(0, cotSerieName.IndexOf(" - "));
                  }

                  cotSerieName += "_COT";
                  if (stockSerie.StockName != cotSerieName)
                  {
                     continue;
                  }
                  row = line.Substring(endOfNameIndex + 2).Split(',');

                  cotDate = DateTime.Parse(row[1], usCulture);
                  if (!stockSerie.Keys.Contains(cotDate))
                  {
                     float cotLong = float.Parse(row[cotLongIndex]);
                     float cotShort = float.Parse(row[cotShortIndex]);
                     float cotOpenInterest = float.Parse(row[cotOpenInterestIndex]);
                     if (cotOpenInterest != 0.0f)
                     {
                        cotValue = 100.0f * (cotLong - cotShort) / cotOpenInterest;
                     }
                     else
                     {
                        cotValue = 0.0f;
                     }
                     readValue = new StockDailyValue(cotSerieName, cotValue, cotValue, cotValue, cotValue, 0, cotDate);
                     stockSerie.Add(readValue.DATE, readValue);
                     readValue.Serie = stockSerie;
                  }
                  else
                  {
                     StockLog.Write("COT for " + cotSerieName + " already added, data for" + row[3] + " exchange ignored");
                  }
               }
            }
             }
             catch (System.Exception e)
             {
            StockLog.Write(e.Message + "Failed to parse COT file" + "\r\r" + line);
             }
             return res;
        }
 public static StockDailyValue ReadCBOEIndexDataFromCSVStream(StreamReader sr, string name)
 {
     StockDailyValue stockValue = null;
      try
      {
     // File format
     // Date,Close
     // 10-May-07,27.09
     string[] row = sr.ReadLine().Split(',');
     if (row.GetLength(0) == 2 && row[1] != "")
     {
        stockValue = new StockDailyValue(
            name,
            float.Parse(row[1], usCulture),
            float.Parse(row[1], usCulture),
            float.Parse(row[1], usCulture),
            float.Parse(row[1], usCulture),
            100,
            DateTime.Parse(row[0], usCulture));
     }
      }
      catch (System.Exception)
      {
     // Assume input is right, Ignore invalid lines
      }
      return stockValue;
 }