private static void ProcessUnzippedFile(string path) { //L,EUR,GBP,CHF,JPY,EURGBP,EURCHF,EURJPY,GBPCHF,GBPJPY,CHFJPY,CAD,EURCAD,AUD,AUDJPY,NZD,NZDJPY,XAU,XAG //S,EUR //D,41275 //1,1.3184,1.3184,1.3184,1.3184 using (var sr = new StreamReader(path, Encoding.ASCII)) { var firstLine = sr.ReadLine(); var tickers = firstLine.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Skip(1).Select( GetTickerFullName).ToList(); var streams = tickers.ToDictionary(t => t, t => new StreamWriter( path + "." + t, false, Encoding.ASCII)); try { StreamWriter currentStream = null; var curDay = new DateTime(); DateTime? lastSavedDate = null; while (!sr.EndOfStream) { var line = sr.ReadLine(); if (string.IsNullOrEmpty(line)) continue; if (line.StartsWith("S,")) { var currentTicker = GetTickerFullName(line.Substring("S,".Length)); currentStream = streams[currentTicker]; continue; } if (line.StartsWith("D,")) { var dayPart = line.Substring("D,".Length).ToInt(); curDay = new DateTime(1900, 1, 1).AddDays(dayPart); lastSavedDate = null; continue; } if (currentStream == null) continue; var lineParts = line.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries); var time = curDay.AddMinutes(lineParts[0].ToInt()); var open = lineParts[1].ToFloatUniform(); var high = lineParts[2].ToFloatUniform(); var low = lineParts[3].ToFloatUniform(); var close = lineParts[4].ToFloatUniform(); var candle = new CandleData(open, high, low, close, time, time.AddMinutes(1)); var pointCost = open < 20 ? 10000 : open < 70 ? 1000 : 100; if (lastSavedDate == null || lastSavedDate.Value != curDay) { lastSavedDate = curDay; currentStream.WriteLine(lastSavedDate.Value.ToString("ddMMyyyy"), curDay); } currentStream.WriteLine("{0} {1} {2}", candle.timeOpen.ToString("HHmm"), candle.open.ToStringUniformPriceFormat(true), candle.GetHlcOffsetHEX16(pointCost)); } } finally { foreach (var stream in streams) stream.Value.Close(); } } }
public void TestHlcFormat() { var candleData = new CandleData { open = (float) 1.2345, high = (float) 1.2355, low = (float) 1.2335, close = (float) 1.2344 }; var offset = candleData.GetHlcOffset(VersePointValue); Assert.AreEqual(0x7E7589, offset, "TestHlcFormat: GetHlcOffset error"); var line = candleData.GetHlcOffsetHEX(VersePointValue); Assert.AreEqual("7E7589", line, "TestHlcFormat: GetHlcOffsetHEX error"); var offset16 = candleData.GetHlcOffset16(VersePointValue); Assert.AreEqual(0x7F9B8063, offset16, "TestHlcFormat: GetHlcOffset16 error"); var line16 = candleData.GetHlcOffsetHEX16(VersePointValue); Assert.AreEqual("7F9B8063", line16, "TestHlcFormat: GetHlcOffsetHEX16 error"); var candle = new CandleData {open = candleData.open}; candle.MakeHlcFromOffset(offset, VersePointValue); Assert.AreEqual(candleData.high, candle.high, 0.00001, "TestHlcFormat: MakeHlcFromOffset error (high)"); Assert.AreEqual(candleData.low, candle.low, 0.00001, "TestHlcFormat: MakeHlcFromOffset error (low)"); Assert.AreEqual(candleData.close, candle.close, 0.00001, "TestHlcFormat: MakeHlcFromOffset error (close)"); candle.MakeHlcFromOffsetHEX(line, VersePointValue); Assert.AreEqual(candleData.high, candle.high, 0.00001, "TestHlcFormat: MakeHlcFromOffsetHEX error (high)"); Assert.AreEqual(candleData.low, candle.low, 0.00001, "TestHlcFormat: MakeHlcFromOffsetHEX error (low)"); Assert.AreEqual(candleData.close, candle.close, 0.00001, "TestHlcFormat: MakeHlcFromOffsetHEX error (close)"); candle.MakeHlcFromOffset16(offset16, VersePointValue); Assert.AreEqual(candleData.high, candle.high, 0.00001, "TestHlcFormat: MakeHlcFromOffset16 error (high)"); Assert.AreEqual(candleData.low, candle.low, 0.00001, "TestHlcFormat: MakeHlcFromOffset16 error (low)"); candle.MakeHlcFromOffsetHEX16(line16, VersePointValue); Assert.AreEqual(candleData.high, candle.high, 0.00001, "TestHlcFormat: MakeHlcFromOffset16 error (high)"); Assert.AreEqual(candleData.low, candle.low, 0.00001, "TestHlcFormat: MakeHlcFromOffset16 error (low)"); }