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

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

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

Добавлено: evge » 02 окт 2017, 10:29

Тема: Re: LinRegChannel - канал линейной регрессии

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

Канал линейной регрессии от предпоследнего фрактала

Рисует канал от предпоследнего фрактала, при условии что последний фрактал противоположный (максимум / минимум, минимум / максимум)

LineRegChannelFractal.zip
(43.25 КБ) 1156 скачиваний


Параметры

Bars - количество баров (слева / справа) для поиска фрактала.
History - поиск на истории 2х последних фракталов в пределах данной истории (баров) + отступ (Skip)
Skip - отступ начала поиска в барах (от конца графика)

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

function Initialize()
{
IndicatorName = "LinRegChannelFractal";   
PriceStudy = true;   
AddInput("Input", Inputs.Candle);   
// Extremums
AddSeries("EH", DrawAs.Custom, Color.Green, true, Axes.Parent);   
AddSeries("EL", DrawAs.Custom, Color.Red, true, Axes.Parent);
// LinReg
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("Bars", 50, 1); // баров слева / справа для поиска фрактала
AddParameter("History", 2000, 1); // поиск на истории 2х последних фракталов в пределах данной истории (баров) + отступ (Skip)
AddParameter("Skip", 250, 1); // отступ начала поиска в барах (от конца графика)
}

function Evaluate()
{
// AlfaDirect 2016. OX
// Канал линейной регрессии за период (Period) с запаздыванием (Delay)
// Отклоенение считается как максимальное разница цен и базовой регрессии, строится по ценам закрытия.

// evge 02.10.2017 http://alfadirect4.ru
// Отсчет от предпоследнего фрактала

var Period = 0;

//Extremums

double High = Input.High[Bars];
double Low = Input.Low[Bars];

bool HC = false, LC = false;

for (var x = 0; x < Bars * 2; x++) {
   if (Input.High[x] > High) HC = true;
   if (Input.Low[x] < Low) LC = true;
   if (LC && HC) break;
} //x

if (!HC) EH[Bars] = Input.High[Bars];
if (!LC) EL[Bars] = Input.Low[Bars];

EH.DrawCircle();
EL.DrawCircle();

var L = 0;

for (var x = 0 + Skip; x < 0 + History + Skip; x++)
{
   if (EH[x] > 0) { if (L >= 0) L = 1; else { Period = x + 1; break; } }
   if (EL[x] > 0) { if (L <= 0) L =-1; else { Period = x + 1; break; } }
}

if (CurrentIndex == MaxIndex)
{
double a1 = 0.0;
double a2 = 0.0;
double a3 = 0.0;
double a4 = 0.0;
if (CurrentIndex >= Period )
{
double N = Period;
for (var i = 0; i < N; i++)
{
a1 = a1 + i * Input.Close[-(int)N + 1 + i];
a2 = a2 + i;
a3 = a3 + Input.Close[-i];
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.Close[-Period+i+1]);
if ( a > Sigma1 )
Sigma1 = a;
// Расчет отклонения 2
a = -((alfa * (i) + beta) - Input.Close[-Period+i+1]);
if ( a > Sigma2 )
Sigma2 = a;
}
for (var i = 0; i < N; i++)
{
LineUp[-Period+i+1] = alfa * (i) + beta + Sigma1;
LineU2[-Period+i+1] = alfa * (i) + beta + Sigma2;
LineDn[-Period+i+1] = alfa * (i) + beta - Sigma1;
LineD2[-Period+i+1] = alfa * (i) + beta - Sigma2;
}
}
}
}


Скачать код индикатора

LineRegChannelFractal-01.png
LineRegChannelFractal с параметрами Bars = 50, History = 2000, Skip = 250
LineRegChannelFractal-01.png (43.93 КБ) 24076 просмотров