Если его вывести на график, то на каждой точке истории он рисует свое значение уже не в виде прямолинейного канала, а то значение которое было в тот момент истории.
Можете проверить:
Выведите неизмененный LinRegChannel и LinRegChannelST и сравните значения в разных точках истории, обязательно проверяя только на последней точке смещая график, т.к. LinRegChannel перерисует значения в истории.
В истории они совпадают, можно делать тесты на этом индикаторе.
Код: Выделить всё
function Initialize()
{
IndicatorName = "LinRegChannelST";
PriceStudy = true;
AddInput("Input", Inputs.Price);
AddSeries("LineUp", DrawAs.Line, Color.Red);
AddSeries("LineDn", DrawAs.Line, Color.Red);
AddSeries("LineU2", DrawAs.Line, Color.Gray);
AddSeries("LineD2", DrawAs.Line, Color.Gray);
AddParameter("Period", 100, 1);
AddParameter("Delay", 5);
}
function Evaluate()
{
// AlfaDirect 2016. OX
// Канал линейной регрессии за период (Period) с запаздыванием (Delay)
// Отклоенение считается как максимальное разница цен и базовой регрессии, строится по ценам закрытия.
//if (CurrentIndex == MaxIndex)
{
double a1 = 0.0;
double a2 = 0.0;
double a3 = 0.0;
double a4 = 0.0;
if (CurrentIndex >= Period+Delay )
{
double N = Period;
for (var i = 0; i < N; i++)
{
a1 = a1 + i * Input[-(int)N + 1 + i -Delay];
a2 = a2 + i;
a3 = a3 + Input[-i -Delay];
a4 = a4 + i * i;
}
var alfa = (Period * a1 - a2 * a3) / (N * a4 - a2 * a2);
var beta = (a3 - alfa * a2) / N;
double Sigma1 = 0.0;
double Sigma2 = 0.0;
for (var i = 0; i < N; i++)
{
// Расчет отклонения 1
double a = ((alfa * (i) + beta) - Input[-Period+i+1 -Delay]);
if ( a > Sigma1 )
Sigma1 = a;
// Расчет отклонения 2
a = -((alfa * (i) + beta) - Input[-Period+i+1 -Delay]);
if ( a > Sigma2 )
Sigma2 = a;
}
//for (var i = 0; i < N+Delay; i++)
{
LineUp[0] = alfa * (N+Delay-1) + beta + Sigma1;
LineU2[0] = alfa * (N+Delay-1) + beta + Sigma2;
LineDn[0] = alfa * (N+Delay-1) + beta - Sigma1;
LineD2[0] = alfa * (N+Delay-1) + beta - Sigma2;
//LineUp[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma1;
//LineU2[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma2;
//LineDn[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma1;
//LineD2[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma2;
}
}
}
}