Рисует канал от предпоследнего фрактала, при условии что последний фрактал противоположный (максимум / минимум, минимум / максимум)
Параметры
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;
}
}
}
}
Скачать код индикатора