public override bool CreateIndicator()
        {
            Error = "Ok";
            bool res        = true;
            var  count      = Rates.Count;
            var  ROC_Period = Subtotals.ROC_Period;
            //Начало расчета
            //настраиваем первые {ROC_Period + 1} значений, т.е 0..ROC_Period
            var rsiClose = new RSI(Rates.GetRange(0, ROC_Period + 1), RSI_ClosePeriod);

            Subtotals.RsiClose = rsiClose.Subtotals;
            var streak = new List <double>(count)
            {
                0
            };

            Subtotals.Streak = streak[0];
            Values.Add(0);
            //rocVal.Add(0);  ///  !!!!!!!!!!!!!   Для отладки
            for (int i = 1; i < ROC_Period + 1; i++)
            {
                Subtotals.Price         = Rates[i];
                Subtotals.PreviousPrice = Rates[i - 1];
                //Настройка Streak
                var diffPrices = Subtotals.Price - Subtotals.PreviousPrice;
                Subtotals.Streak = getStreak(diffPrices, Subtotals.Streak);
                streak.Add(Subtotals.Streak);
                Subtotals.PutDailyReturnValue(diffPrices / Subtotals.PreviousPrice);
                Values.Add(0);
                //rocVal.Add(0);  ///  !!!!!!!!!!!!!   Для отладки
            }
            var rsiStreak = new RSI(streak, RSI_StreakPeriod);

            Subtotals.RsiStreak = rsiStreak.Subtotals;

            //отладка
            //rsiPriceVal = new List<double>(rsiClose.Values);
            //rsiStreakVal = new List<double>(rsiStreak.Values);

            Subtotals.UpdatePreviousPrice();
            AddPoints();

            //для отладки
            //var str3 = ListToString(rsiPriceVal);
            //var str2 = ListToString(rsiStreakVal);
            //var roc = ListToString(rocVal);

            return(res);
        }
        public bool CreateIndicator1()
        {
            Error = "Ok";
            bool res        = true;
            var  count      = Rates.Count;
            var  ROC_Period = Subtotals.ROC_Period;
            //начало расчета
            var rsi3 = new RSI(Rates, RSI_ClosePeriod);
            //var str3 = ListToString(rsi3.Values); //для отладки

            var streak = new List <double>(count)
            {
                0
            };
            var dailyReturn = new List <double>(count)
            {
                0
            };
            var relative = new List <double>(count)
            {
                0
            };

            for (int i = 1; i < count; i++)
            {
                //AK3: =ЕСЛИ(И(AK2>=0;$B3>$B2);AK2+1;
                //           ЕСЛИ(И(AK2>=0;$B3<$B2);-1;
                //                ЕСЛИ(И(AK2<=0;$B3<$B2);AK2-1;
                //                     ЕСЛИ(И(AK2<=0;$B3>$B2);1;0))))
                var s  = streak[i - 1];
                var si = s;
                var b1 = Rates[i - 1];
                var b2 = Rates[i];
                if (s >= 0 && b2 > b1)
                {
                    si += 1;
                }
                else
                if (s >= 0 && b2 < b1)
                {
                    si = -1;
                }
                else
                if (s <= 0 && b2 < b1)
                {
                    si -= 1;
                }
                else
                if (s <= 0 && b2 > b1)
                {
                    si = 1;
                }
                else
                {
                    si = 0;
                }
                streak.Add(si);
                dailyReturn.Add((b2 - b1) / b1);
                if (i < ROC_Period + 1)  //если i>=ROC_Period+1, т.е считать его начинаем с PR+1
                {
                    relative.Add(0);
                }
                else
                {
                    var di = dailyReturn[i];
                    var ri = dailyReturn.GetRange(i - ROC_Period, ROC_Period).Where(x => x < di).Count();
                    relative.Add(ri);
                }
            }
            //var strs = ListToString(streak);
            var rsi2 = new RSI(streak, RSI_StreakPeriod);
            //var str2 = ListToString(rsi2.Values);
            //var strd = ListToString(dailyReturn);
            //var str_rel = ListToString(relative);

            var crsi = new List <double>(count);

            for (int i = 0; i < ROC_Period + 1; i++)
            {
                crsi.Add(0);
            }
            for (int i = ROC_Period + 1; i < count; i++)
            {
                crsi.Add((rsi3.Values[i] + rsi2.Values[i] + relative[i]) / 3);
            }
            //var str_crsi = ListToString(crsi);
            Values = crsi;

            return(res);
        }