private static void LoadInfoFile(string infoPathName, Dictionary <DataSourceParam, string> infos) { string[] lines = File.ReadAllLines(infoPathName); foreach (string line in lines) { int idx = line.IndexOf('='); try { DataSourceParam key = (DataSourceParam) Enum.Parse(typeof(DataSourceParam), line.Substring(0, idx), true); string value = line.Substring(idx + 1); infos[key] = value; } catch (Exception) { throw new Exception(string.Format("error parsing data source info {0}: line '{1}", infoPathName, line)); } } }
private void WriteCsv(string sourceName, IEnumerable <Bar> updateBars) { string updateFilePath = Path.Combine(Info[DataSourceParam.dataPath], string.Format("{0:yyyy-MM-dd}-{1}.csv", updateBars.Select(b => b.Time).Max(), sourceName.ToLower())); DirectoryInfo d = new DirectoryInfo(Info[DataSourceParam.dataPath]); FileInfo[] files = d.GetFiles("*.*"); if (files.Count() > 0 && files.Select(i => i.Name).OrderByDescending(n => n).FirstOrDefault().CompareTo(updateFilePath) > 0) { // try filename at end of the alphabet updateFilePath = Path.Combine(Info[DataSourceParam.dataPath], string.Format("zzz-{0:yyyy-MM-dd}-{1}.csv", updateBars.Select(b => b.Time).Max(), sourceName.ToLower())); } if (Directory.Exists(Info[DataSourceParam.dataPath]) && !File.Exists(updateFilePath)) { using (StreamWriter writer = new StreamWriter(updateFilePath)) { #if true //--- find mapping Dictionary <int, DataSourceParam> mapping = new Dictionary <int, DataSourceParam>(); for (int column = 1; column < 20; column++) { string map1 = string.Format("{{{0}}}", column); string map2 = string.Format("{{{0}:", column); DataSourceParam value = Info .Where(i => i.Value.Contains(map1) || i.Value.Contains(map2)) .Select(i => i.Key) .FirstOrDefault(); if (value != default(DataSourceParam)) { mapping[column] = value; } } //--- write header row int highestColumn = mapping.Keys.Max(i => i); for (int column = 1; column <= highestColumn; column++) { if (mapping.ContainsKey(column)) { writer.Write("{0},", mapping[column]); } else { writer.Write(","); } } writer.WriteLine(); //--- write bars foreach (Bar bar in updateBars) { for (int column = 1; column <= highestColumn; column++) { if (mapping.ContainsKey(column)) { DataSourceParam prop = mapping[column]; object value = null; switch (prop) { case DataSourceParam.date: value = bar.Time.Date; break; case DataSourceParam.time: value = bar.Time.TimeOfDay; break; case DataSourceParam.open: value = bar.Open; break; case DataSourceParam.high: value = bar.High; break; case DataSourceParam.low: value = bar.Low; break; case DataSourceParam.close: value = bar.Close; break; case DataSourceParam.volume: value = bar.Volume; break; case DataSourceParam.bid: value = bar.Bid; break; case DataSourceParam.ask: value = bar.Ask; break; case DataSourceParam.bidSize: value = bar.BidVolume; break; case DataSourceParam.askSize: value = bar.AskVolume; break; case DataSourceParam.optionExpiration: value = bar.OptionExpiry; break; case DataSourceParam.optionStrike: value = bar.OptionStrike; break; case DataSourceParam.optionRight: value = bar.OptionIsPut ? "P" : "C"; break; } writer.Write(Info[prop], Enumerable.Range(1, 20).Select(i => value).ToArray()); } writer.Write(","); } writer.WriteLine(); } #else writer.WriteLine("Date,Open,High,Low,Close,Volume"); foreach (Bar bar in updateBars) { writer.WriteLine("{0:MM/dd/yyyy},{1},{2},{3},{4},{5}", bar.Time, bar.Open, bar.High, bar.Low, bar.Close, bar.Volume); } #endif } } }