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