Добрый вечер, Evge.
Ваша мысль была правильной!
Немного дополнил и в принципе счастье...
Сам график практически идеален, а получаемые цифровые данные не полностью соответствуют. Так понимаю, что вопрос в периодах, поскольку на 2 часовом RSI рассчитывается 1 раз, а на 1 часовом 2 раза.
Код: Выделить всё
function Initialize()
{
IndicatorName = "RSI_H2pr";
PriceStudy = false;
AddInput("Input", Inputs.Price);
AddParameter("Period", 28, 32);
AddSeries("RSI", DrawAs.Line, Color.LightBlue);
AddSeries("PosBuffer", DrawAs.Line, Color.Red, false);
AddSeries("NegBuffer", DrawAs.Line, Color.Red, false);
AddLevel(30, Color.Gray, "RSI");
AddLevel(70, Color.Gray, "RSI");
AddGlobalVariable("IO", Types.Double, 0);
}
function Evaluate()
{
// evge 06.09.2016 http://alfadirect4.ru
// RSI 2 часового ТФ на M15 или выше таймфрейме. На ТФ ниже возможен некорректный расчет.
//
// RSI (Relative Strength Index) - индекс относительной силы
// Автор - Уэллс Уайлдер (Welles Wilder).
var t = BarTime(0).Hours;
if (CurrentIndex < 1)
{
RSI = 0.0;
PosBuffer = 0.0;
NegBuffer = 0.0;
IO = Input[0];
}
else
if (t % 2 == 0 && t != 18)
{
var sump = 0.0;
var sumn = 0.0;
var rel = Input[0]-IO;
if (rel > 0)
sump = rel;
else
sumn =-rel;
var positive = (PosBuffer[1]*(Period - 1.0) + sump)/Period;
var negative = (NegBuffer[1]*(Period - 1.0) + sumn)/Period;
PosBuffer = positive;
NegBuffer = negative;
if (negative == 0.0)
RSI = 0.0;
else
RSI = 100.0 - 100.0 / (1.0 + positive/negative);
} else {
var sump = 0.0;
var sumn = 0.0;
var rel = Input[0]-IO;
IO = Input[0];
if (rel > 0)
sump = rel;
else
sumn =-rel;
var positive = (PosBuffer[-1]*(Period - 1.0) + sump)/Period;
var negative = (NegBuffer[-1]*(Period - 1.0) + sumn)/Period;
PosBuffer = positive;
NegBuffer = negative;
if (negative == 0.0)
RSI = 0.0;
else
RSI = 100.0 - 100.0 / (1.0 + positive/negative);
}
}
Хотел еще по одному вопросу побеспокоить...
Сам не знаю, как подступиться.
Направление тоже (на часовом графике данные с 2 часового), только с индикатором LinReg.
Код: Выделить всё
function Initialize()
{
IndicatorName = "LinReg_1";
PriceStudy = false;
AddInput("Input", Inputs.Price);
AddSeries("LinReg", DrawAs.Line, Color.Red);
AddParameter("Period", 20);
AddParameter("Extr", 10);
AddGlobalVariable("ZN", Types.Double, 0.0);
AddGlobalVariable("t2", Types.Double, 0.0);
AddGlobalVariable("t4", Types.Double, 0.0);
}
function Evaluate()
{
// AlfaDirect. 2015. OX
// LinReg (Linear Regression) - Линейная регрессия
if (CurrentIndex == 0 )
{
// Расчет неизменных коэффициентов по времени
for (int i = 0; i < Period; i++)
{
t2 = t2 + i;
t4 = t4 + i * i;
}
ZN = ((double)Period * t4 - t2 * t2);
}
if (CurrentIndex < Period + Extr )
LinReg = Input[0];
else
{
// Вариант t = [0...N-1]
double a1 = 0.0;
double a3 = 0.0;
for (int i = 0; i < Period; i++)
{
a1 = a1 + i * Input[-(int)Period + 1 + i];
a3 = a3 + Input[-i];
}
var alfa = (Period * a1 - t2 * a3) / ZN;
var beta = (a3 - alfa * t2) / Period;
LinReg = alfa * ((double)Period-1.0 + Extr) + beta ;
}
}
Заранее спасибо!