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();
                }
            }
        }
Beispiel #2
0
        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)");
        }