Пользовательские индикаторы > LinRegChannel - канал линейной регрессии

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

LinRegChannel - канал линейной регрессии

Непрочитанное сообщение evge » 18 май 2016, 17:00

Канал линейной регрессии LinRegChannel за период (Period) с запаздыванием (Delay)
Отклонение считается как максимальное разница цен и базовой регрессии, строится по ценам закрытия.

Параметры

Period - период
Delay - период запаздывания

Автор

AlfaDirect 2016. OX

Пример

LineRegChannel-01.png
LineRegChannel-01.png (41.94 КБ) 24753 просмотра


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

function Initialize()
{
IndicatorName = "LinRegChannel";   
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[-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;
}
}
}
}


Скачать исходный текст

LineRegChannel.zip
(1.16 КБ) 1315 скачиваний
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

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

Непрочитанное сообщение evge » 19 май 2016, 12:20

LineRegChannel-02.png
Разрушение канала
LineRegChannel-02.png (40.1 КБ) 24731 просмотр
никогда такого не было и вот опять

Julkanic
Сообщения: 2
Зарегистрирован: 28 мар 2017, 22:12

LinRegChannel канал линейной регрессии

Непрочитанное сообщение Julkanic » 02 апр 2017, 15:04

на картинке показан канал линейной регрессии
У него есть как видим, средняя линия и две линии,так называемого стандартного отклонения,проведенные параллельно средней через максимальную и минимальную цену Close
Вложения
1105.gif
1105.gif (3.39 КБ) 24197 просмотров

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

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

Непрочитанное сообщение evge » 02 окт 2017, 10:12

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

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

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


Параметры

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.zip
(43.25 КБ) 1138 скачиваний
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

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

Непрочитанное сообщение evge » 03 окт 2017, 08:38

Небольшое дополнение. Отрисовка средней линии.

LineRegChannelFractal-01.png
LineRegChannelFractal-01.png (39.92 КБ) 23704 просмотра


Скачать код

LineRegChannelFractal.zip
(40.05 КБ) 1277 скачиваний
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

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

Непрочитанное сообщение evge » 28 дек 2017, 19:07

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

function Initialize()
{
IndicatorName = "LinRegChannelATR";   
PriceStudy = true;   
AddInput("Input", Inputs.Candle);   
AddSeries("LineUp", DrawAs.Line, Color.Red);   
AddSeries("LineDn", DrawAs.Line, Color.Red);   
AddSeries("LineU2", DrawAs.Line, Color.Gray);   
AddSeries("LineD2", DrawAs.Line, Color.Gray);   
AddSeries("LineM2", DrawAs.Line, Color.Gray);   
AddParameter("Period ", 100, 1);
AddParameter("Delay", 5);
AddParameter("PeriodATR", 5);
AddParameter("K", 5.0);
}

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

// Evgeny_TK реализация от ATR + коэф. K

if (CurrentIndex == MaxIndex)
{

var A = ATR(Input, PeriodATR);

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.Close[-(int)N + 1 + i -Delay];
a2 = a2 + i;
a3 = a3 + Input.Close[-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.Close[-Period+i+1 -Delay]);
if ( a > Sigma1 )
Sigma1 = a;
// Расчет отклонения 2
a = -((alfa * (i) + beta) - Input.Close[-Period+i+1 -Delay]);
if ( a > Sigma2 )
Sigma2 = a;
}
for (var i = 0; i < N+Delay; i++)
{
LineUp[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma1;
LineU2[-Period+i+1 -Delay] = alfa * (i) + beta + A[0]*K;
LineDn[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma1;
LineD2[-Period+i+1 -Delay] = alfa * (i) + beta - A[0]*K;
LineM2[-Period+i+1 -Delay] = alfa * (i) + beta;
}
}
}
}
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

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

Непрочитанное сообщение evge » 28 дек 2017, 19:09

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

function Initialize()
{
IndicatorName = "LinRegChannelATR";   
PriceStudy = true;   
AddInput("Input", Inputs.Candle);   
AddSeries("LineUp", DrawAs.Line, Color.Red);   
AddSeries("LineDn", DrawAs.Line, Color.Red);   
AddSeries("LineU2", DrawAs.Line, Color.Gray);   
AddSeries("LineD2", DrawAs.Line, Color.Gray);   
AddSeries("LineM2", DrawAs.Line, Color.Gray);   
AddParameter("Period ", 100, 1);
AddParameter("Delay", 5);
AddParameter("PeriodATR", 5);
AddParameter("K", 5.0);
}

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

// 28.12.2017 Evgeny_TK реализация от ATR + коэф. K

if (CurrentIndex == MaxIndex)
{

var A = ATR(Input, PeriodATR);

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.Close[-(int)N + 1 + i -Delay];
a2 = a2 + i;
a3 = a3 + Input.Close[-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.Close[-Period+i+1 -Delay]);
if ( a > Sigma1 )
Sigma1 = a;
// Расчет отклонения 2
a = -((alfa * (i) + beta) - Input.Close[-Period+i+1 -Delay]);
if ( a > Sigma2 )
Sigma2 = a;
}
for (var i = 0; i < N+Delay; i++)
{
LineUp[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma1;
LineU2[-Period+i+1 -Delay] = alfa * (i) + beta + A[0]*K;
LineDn[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma1;
LineD2[-Period+i+1 -Delay] = alfa * (i) + beta - A[0]*K;
LineM2[-Period+i+1 -Delay] = alfa * (i) + beta;
}
}
}
}
никогда такого не было и вот опять


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей