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(); } } }
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(); } }
/// <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(); }
/// <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()); }