Каталог файлов форума

Список вложений в сообщениях, оставленных на этой конференции.

Все файлы форума: 1270

Добавлено: evge » 15 фев 2017, 13:04

Тема: Re: Как протестировать канал линейной регрессии??

Текст сообщения:

Вот, изменил код, чтоб индикатор сохранял свои значения на истории. Чтобы можно было провести тестирование.
Если его вывести на график, то на каждой точке истории он рисует свое значение уже не в виде прямолинейного канала, а то значение которое было в тот момент истории.

Можете проверить:

Выведите неизмененный LinRegChannel и LinRegChannelST и сравните значения в разных точках истории, обязательно проверяя только на последней точке смещая график, т.к. LinRegChannel перерисует значения в истории.

LineRegChannelST-01.png
На рисунке ломаные линии - LineRegChannelST, прямые линии - LineRegChannel, значения их совпадают в последней точке всегда на истории. Отличия на последнем участке, где LineRegChannel рисует задним числом прямые.
LineRegChannelST-01.png (34.32 КБ) 26369 просмотров


В истории они совпадают, можно делать тесты на этом индикаторе.

Код: Выделить всё

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