示例#1
0
        private void btnFormQuote_Click(object sender, EventArgs e)
        {
            var ciEur = new CurrencyIndexInfo(tbEur.Text);
            var ciUsd = new CurrencyIndexInfo(tbUsd.Text);

            var currencyStream = new Dictionary <string, CurrencyStream>();
            // открыть потоки чтения
            var allPairs = ciEur.pairs.Union(ciUsd.pairs).ToList();

            if (!allPairs.Contains("eur"))
            {
                allPairs.Add("eur");
            }
            foreach (var curName in allPairs)
            {
                currencyStream.Add(curName, new CurrencyStream(curName, quotePath));
            }

            // сессия (разрешенные часы)
            int startDay = 1, endDay = 6;
            int startHr = 1, endHr = 1;
            var sessParts = tbSession.Text.Split(new[] { ' ', ':', '-', ',', '.' }, StringSplitOptions.RemoveEmptyEntries);

            if (sessParts.Length == 4)
            {
                startDay = int.Parse(sessParts[0]);
                startHr  = int.Parse(sessParts[1]);
                endDay   = int.Parse(sessParts[2]);
                endHr    = int.Parse(sessParts[3]);
            }
            var k = tbMultiplier.Text.ToDecimalArrayUniform();

            // считать индекс
            try
            {
                if (!startDate.HasValue)
                {
                    startDate = IndexFFT.GetFirstDateFromCurStreams(currencyStream, false);
                }
                DateTime date = startDate.Value;

                using (var swEur = new StreamWriter(tbFolder.Text + ".i1.quote"))
                    using (var swUsd = new StreamWriter(tbFolder.Text + ".i2.quote"))
                        using (var swEurUsd = new StreamWriter(tbFolder.Text + ".fr.quote"))
                        {// eur0.3349# jpy0.1652 gbp0.082# cad0.2887 sek0.0189 chf0.027
                            double?prevEur = null, prevUsd = null;
                            for (var i = 0; i < maxDataLen; i++)
                            {
                                var eur = ciEur.CalculateIndexMultiplicative(date, currencyStream);
                                var usd = ciUsd.CalculateIndexMultiplicative(date, currencyStream);
                                if (ciEur.EndOfStream || ciUsd.EndOfStream)
                                {
                                    break;
                                }
                                eur = eur * (double)k[0];
                                usd = usd * (double)k[1];

                                var duplicates = false;
                                if (prevEur.HasValue)
                                {
                                    if (prevEur.Value == eur && prevUsd.Value == usd)
                                    {
                                        duplicates = true;
                                    }
                                }

                                if (!duplicates)
                                {
                                    prevEur = eur;
                                    prevUsd = usd;

                                    // 11.370;11.350;03.01.2009 23:04:00
                                    var dateStr = date.ToString("dd.MM.yyyy HH:mm:ss");
                                    var line    = string.Format(CultureInfo.InvariantCulture,
                                                                "{0:f4};{0:f4};{1}", eur, dateStr);
                                    swEur.WriteLine(line);
                                    line = string.Format(CultureInfo.InvariantCulture,
                                                         "{0:f4};{0:f4};{1}", usd, dateStr);
                                    swUsd.WriteLine(line);
                                    if (eur > 0 && usd > 0)
                                    {
                                        var fract = (double)k[2] * eur / usd;
                                        line = string.Format(CultureInfo.InvariantCulture,
                                                             "{0:f4};{0:f4};{1}", fract, dateStr);
                                        swEurUsd.WriteLine(line);
                                    }
                                }

                                date = date.AddMinutes(intervalMinutes);
                                // пропуск выходных
                                var weekDay = (int)date.DayOfWeek;
                                if (weekDay == 0)
                                {
                                    weekDay = 7;
                                }

                                if ((weekDay > endDay || (weekDay == endDay && date.Hour >= endHr))
                                    ||
                                    (weekDay < startDay || (weekDay == startDay && date.Hour < startHr)))
                                {
                                    var newWeekDay = date.Date.AddDays(7 - weekDay + startDay);
                                    date = newWeekDay.AddHours(startHr);
                                }
                            }
                        }
            }
            finally
            {   // закрыть потоки чтения
                foreach (var cs in currencyStream)
                {
                    cs.Value.CloseStream();
                }
            }
        }
示例#2
0
        private void btnFormQuote_Click(object sender, EventArgs e)
        {
            var ciEur = new CurrencyIndexInfo(tbEur.Text);
            var ciUsd = new CurrencyIndexInfo(tbUsd.Text);

            var currencyStream = new Dictionary<string, CurrencyStream>();
            // открыть потоки чтения
            var allPairs = ciEur.pairs.Union(ciUsd.pairs).ToList();
            if (!allPairs.Contains("eur")) allPairs.Add("eur");
            foreach (var curName in allPairs)
            {
                currencyStream.Add(curName, new CurrencyStream(curName, quotePath));
            }

            // сессия (разрешенные часы)
            int startDay = 1, endDay = 6;
            int startHr = 1, endHr = 1;
            var sessParts = tbSession.Text.Split(new[] {' ', ':', '-', ',', '.'}, StringSplitOptions.RemoveEmptyEntries);
            if (sessParts.Length == 4)
            {
                startDay = int.Parse(sessParts[0]);
                startHr = int.Parse(sessParts[1]);
                endDay = int.Parse(sessParts[2]);
                endHr = int.Parse(sessParts[3]);
            }
            var k = tbMultiplier.Text.ToDecimalArrayUniform();
            // считать индекс
            try
            {
                if (!startDate.HasValue)
                    startDate = IndexFFT.GetFirstDateFromCurStreams(currencyStream, false);
                DateTime date = startDate.Value;

                using (var swEur = new StreamWriter(tbFolder.Text + ".i1.quote"))
                using (var swUsd = new StreamWriter(tbFolder.Text + ".i2.quote"))
                using (var swEurUsd = new StreamWriter(tbFolder.Text + ".fr.quote"))
                {// eur0.3349# jpy0.1652 gbp0.082# cad0.2887 sek0.0189 chf0.027
                    double? prevEur = null, prevUsd = null;
                    for (var i = 0; i < maxDataLen; i++)
                    {
                        var eur = ciEur.CalculateIndexMultiplicative(date, currencyStream);
                        var usd = ciUsd.CalculateIndexMultiplicative(date, currencyStream);
                        if (ciEur.EndOfStream || ciUsd.EndOfStream) break;
                        eur = eur * (double)k[0];
                        usd = usd * (double)k[1];

                        var duplicates = false;
                        if (prevEur.HasValue)
                            if (prevEur.Value == eur && prevUsd.Value == usd)
                                duplicates = true;

                        if (!duplicates)
                        {
                            prevEur = eur;
                            prevUsd = usd;

                            // 11.370;11.350;03.01.2009 23:04:00
                            var dateStr = date.ToString("dd.MM.yyyy HH:mm:ss");
                            var line = string.Format(CultureInfo.InvariantCulture,
                                                     "{0:f4};{0:f4};{1}", eur, dateStr);
                            swEur.WriteLine(line);
                            line = string.Format(CultureInfo.InvariantCulture,
                                                 "{0:f4};{0:f4};{1}", usd, dateStr);
                            swUsd.WriteLine(line);
                            if (eur > 0 && usd > 0)
                            {
                                var fract = (double) k[2]*eur/usd;
                                line = string.Format(CultureInfo.InvariantCulture,
                                                     "{0:f4};{0:f4};{1}", fract, dateStr);
                                swEurUsd.WriteLine(line);
                            }
                        }

                        date = date.AddMinutes(intervalMinutes);
                        // пропуск выходных
                        var weekDay = (int) date.DayOfWeek;
                        if (weekDay == 0) weekDay = 7;

                        if ((weekDay > endDay || (weekDay == endDay && date.Hour >= endHr))
                            ||
                            (weekDay < startDay || (weekDay == startDay && date.Hour < startHr)))
                        {
                            var newWeekDay = date.Date.AddDays(7 - weekDay + startDay);
                            date = newWeekDay.AddHours(startHr);
                        }
                    }
                }
            }
            finally
            {   // закрыть потоки чтения
                foreach (var cs in currencyStream) cs.Value.CloseStream();
            }
        }
示例#3
0
        /// <param name="indexStr">формула индекса</param>
        /// <param name="path">каталог с котировками</param>
        /// <param name="intervalMinutes">период дискретизации</param>
        /// <param name="dataLength">количество отсчетов для выведения характеристик</param>
        /// <param name="trendReducion">тип удаления тренда</param>
        /// <param name="trendMAPeriod">период СС для удаления тренда</param>
        /// <returns></returns>
        public static double[] GetIndexData(string indexStr, string path, int intervalMinutes, int dataLength,
            TrendReducion trendReducion, int trendMAPeriod, DateTime? startDate, CurrencyIndexType curIndexType)
        {
            var ci = new CurrencyIndexInfo(indexStr) {MomentumPeriod = 1};
            // аддитивный индекс без приращений,
            // веса уравнивают слагаемые в точке отсчета
            if (curIndexType == CurrencyIndexType.AdditiveWeightedToOne)
            {
                for (var i = 0; i < ci.weights.Length; i++)
                    ci.weights[i] = 0; // вес посчитается автоматически
            }
            var currencyStream = new Dictionary<string, CurrencyStream>();
            // открыть потоки чтения
            foreach (var curName in ci.pairs)
            {
                currencyStream.Add(curName, new CurrencyStream(curName,
                    path));
            }

            // посчитать данные индекса (ряд)
            var indexData = new List<double>();
            decimal index = 0;
            try
            {
                if (!startDate.HasValue)
                    startDate = GetFirstDateFromCurStreams(currencyStream, false);
                if (!startDate.HasValue) return new double[0];
                DateTime date = startDate.Value;

                int dataCountMax = dataLength + (trendReducion == TrendReducion.MovingAverage ? trendMAPeriod : 0);
                for (var i = 0; i < dataCountMax; i++)
                {
                    index = (decimal)ci.CalculateIndexMultiplicative(date, currencyStream);
                    indexData.Add((double)index);
                    date = date.AddMinutes(intervalMinutes);
                }

            }
            finally
            {
                // закрыть потоки чтения
                foreach (var cs in currencyStream)
                    cs.Value.CloseStream();
            }

            if (indexData.Count < 10) return new double[0];
            return indexData.ToArray();
        }
示例#4
0
        /// <param name="indexStr">формула индекса</param>
        /// <param name="path">каталог с котировками</param>
        /// <param name="intervalMinutes">период дискретизации</param>
        /// <param name="dataLength">количество отсчетов для выведения характеристик</param>
        /// <param name="trendReducion">тип удаления тренда</param>
        /// <param name="trendMAPeriod">период СС для удаления тренда</param>
        /// <returns></returns>
        public static double[] GetIndexData(string indexStr, string path, int intervalMinutes, int dataLength,
                                            TrendReducion trendReducion, int trendMAPeriod, DateTime?startDate, CurrencyIndexType curIndexType)
        {
            var ci = new CurrencyIndexInfo(indexStr)
            {
                MomentumPeriod = 1
            };

            // аддитивный индекс без приращений,
            // веса уравнивают слагаемые в точке отсчета
            if (curIndexType == CurrencyIndexType.AdditiveWeightedToOne)
            {
                for (var i = 0; i < ci.weights.Length; i++)
                {
                    ci.weights[i] = 0; // вес посчитается автоматически
                }
            }
            var currencyStream = new Dictionary <string, CurrencyStream>();

            // открыть потоки чтения
            foreach (var curName in ci.pairs)
            {
                currencyStream.Add(curName, new CurrencyStream(curName,
                                                               path));
            }

            // посчитать данные индекса (ряд)
            var     indexData = new List <double>();
            decimal index     = 0;

            try
            {
                if (!startDate.HasValue)
                {
                    startDate = GetFirstDateFromCurStreams(currencyStream, false);
                }
                if (!startDate.HasValue)
                {
                    return(new double[0]);
                }
                DateTime date = startDate.Value;

                int dataCountMax = dataLength + (trendReducion == TrendReducion.MovingAverage ? trendMAPeriod : 0);
                for (var i = 0; i < dataCountMax; i++)
                {
                    index = (decimal)ci.CalculateIndexMultiplicative(date, currencyStream);
                    indexData.Add((double)index);
                    date = date.AddMinutes(intervalMinutes);
                }
            }
            finally
            {
                // закрыть потоки чтения
                foreach (var cs in currencyStream)
                {
                    cs.Value.CloseStream();
                }
            }

            if (indexData.Count < 10)
            {
                return(new double[0]);
            }
            return(indexData.ToArray());
        }