Пользовательские индикаторы > TrendLines - автоматическое формирование трендовых линий

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

TrendLines - автоматическое формирование трендовых линий

Непрочитанное сообщение evge » 04 фев 2016, 16:13

Описание:

Индикатор производит поиск по истории экстремумов и отмечает их кружками.
Между двумя последними понижающимися максимумами и двумя последними повышающимися минимумами, если таковые имеются, рисуется трендовая линия до текущего бара.

Входные параметры:

Period - количество баров (слева и справа) для поиска экстремумов
Scan - количество баров сканируемой истории

Примеры работы:

AD4-TrendLines-00.png

AD4-TrendLines-01.png

AD4-TrendLines-02.png


Исходный текст индикатора:

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

function Initialize()
{
   IndicatorName = "TrendLines";   
   PriceStudy = true;
   AddInput("Input", Inputs.Candle);   
    AddSeries("EH", DrawAs.Custom, Color.Green, true, Axes.Parent);   
   AddSeries("EL", DrawAs.Custom, Color.Red, true, Axes.Parent);
    AddSeries("Up", DrawAs.Custom, Color.Green, true, Axes.Parent);   
   AddSeries("Down", DrawAs.Custom, Color.Red, true, Axes.Parent);

   AddParameter("Period", 15);   
   AddParameter("Scan", 200, 1);

}

function Evaluate()
{
//evge 04.02.2016, http://alfadirect4.ru

//Extremums

var High = Input.High[Period];
var Low = Input.Low[Period];

var HC = 1;
var LC = 1;

for (var x = 0; x < Period * 2; x++) {

if (Input.High[x] > High) HC = 0;
if (Input.Low[x] < Low) LC = 0;

if (LC == 0 && HC == 0) break;

} //x

if (HC > 0) EH[Period] = Input.High[Period];
if (LC > 0) EL[Period] = Input.Low[Period];

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

//TrendLines

if (MaxIndex == CurrentIndex) {

var x1 = 0;
var x2 = 0;
var y1 = 0.0;
var y2 = 0.0;

for (var x = 0 + Period; x < Scan; x++) {
   if (EH[x] > 0 && y2 == 0) { y2 = EH[x]; x2 = x; x+=Period-1; }
   if (EH[x] > 0 && y2 != 0 && y1 == 0 && y2 > EH[x]) break;
   if (EH[x] > 0 && y2 != 0 && y1 == 0) { y1 = EH[x]; x1 = x; break; }
}

if (x1 > 0 && x2 > 0) {   
   Down[x1] = y1;
   Down[0] = (double)(0 - x1) / (x2 - x1) * (y2 - y1) + y1;
}

x1 = 0;
x2 = 0;
y1 = 0.0;
y2 = 0.0;

for (var x = 0 + Period; x < Scan; x++) {
   if (EL[x] > 0 && y2 == 0) { y2 = EL[x]; x2 = x; x+=Period-1; }
   if (EL[x] > 0 && y2 != 0 && y1 == 0 && y2 < EL[x]) break;
   if (EL[x] > 0 && y2 != 0 && y1 == 0) { y1 = EL[x]; x1 = x; break; }
}

if (x1 > 0 && x2 > 0) {   
   Up[x1] = y1;
   Up[0] = (double)(0 - x1) / (x2 - x1) * (y2 - y1) + y1;
}

} //m=c

Down.DrawLine();
Up.DrawLine();

}


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

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

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

Re: TrendLines

Непрочитанное сообщение evge » 04 фев 2016, 17:14

На последнем скриншоте видно, что последнее значение индикатора отображается (зеленый маркер на поле цены), а линии нет. Это демонстрация бага АД4. Отрисовка линий, выходящих за пределы видимой части графика, в некоторых ситуациях некорректна.
никогда такого не было и вот опять

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

Re: TrendLines - автоматическое формирование трендовых линий

Непрочитанное сообщение evge » 15 сен 2017, 09:43

TrandLines 2

Добавлено:

  • Отображение лучей для восходящих максимумов и нисходящих минимумов фракталов
  • Возможность задать отступ для сканирования, параметр "Skip";

Пример. Несколько индикаторов TrendLines2 с разными параметрами:

TrendLines2-01.png
TrendLines2-01.png (36.98 КБ) 14688 просмотров


Набросок не оптимальный по обходу истории, но работающий:

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

function Initialize()
{
   IndicatorName = "TrendLines2";   
   PriceStudy = true;
   AddInput("Input", Inputs.Candle);   
   AddSeries("EH", DrawAs.Custom, Color.Green, true, Axes.Parent);   
   AddSeries("EL", DrawAs.Custom, Color.Red, true, Axes.Parent);
   AddSeries("Up", DrawAs.Custom, Color.Green, true, Axes.Parent);   
   AddSeries("Down", DrawAs.Custom, Color.Red, true, Axes.Parent);
   AddSeries("Up2", DrawAs.Custom, Color.Green, true, Axes.Parent);   
   AddSeries("Down2", DrawAs.Custom, Color.Red, true, Axes.Parent);

   AddParameter("Period", 15);   
   AddParameter("Scan", 200, 3);
   AddParameter("Skip", 20, 3);

}

function Evaluate()
{
//evge 04.02.2016, http://alfadirect4.ru
//evge 15.09.2017
// + добавлено отображение лучей для восходящих максимумов и нисходящих минимумов фракталов
// + добавлена возможность задать отступ для сканирования, параметр "Skip";
//Extremums

var High = Input.High[Period];
var Low = Input.Low[Period];

var HC = 1;
var LC = 1;

for (var x = 0; x < Period * 2; x++) {

if (Input.High[x] > High) HC = 0;
if (Input.Low[x] < Low) LC = 0;

if (LC == 0 && HC == 0) break;

} //x

if (HC > 0) EH[Period] = Input.High[Period];
if (LC > 0) EL[Period] = Input.Low[Period];

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

//TrendLines

if (MaxIndex == CurrentIndex) {

var x1 = 0;
var x2 = 0;
var y1 = 0.0;
var y2 = 0.0;

for (var x = 0 + Period + Skip; x < Scan + Skip; x++) {
   if (EH[x] > 0 && y2 == 0) { y2 = EH[x]; x2 = x; x+=Period-1; }
   if (EH[x] > 0 && y2 != 0 && y1 == 0 && y2 > EH[x]) break;
   if (EH[x] > 0 && y2 != 0 && y1 == 0) { y1 = EH[x]; x1 = x; break; }
}

if (x1 > 0 && x2 > 0) {   
   Down[x1] = y1;
   Down[0] = (double)(0 - x1) / (x2 - x1) * (y2 - y1) + y1;
}

x1 = 0;
x2 = 0;
y1 = 0.0;
y2 = 0.0;

for (var x = 0 + Period + Skip; x < Scan + Skip; x++) {
   if (EL[x] > 0 && y2 == 0) { y2 = EL[x]; x2 = x; x+=Period-1; }
   if (EL[x] > 0 && y2 != 0 && y1 == 0 && y2 < EL[x]) break;
   if (EL[x] > 0 && y2 != 0 && y1 == 0) { y1 = EL[x]; x1 = x; break; }
}

if (x1 > 0 && x2 > 0) {   
   Up[x1] = y1;
   Up[0] = (double)(0 - x1) / (x2 - x1) * (y2 - y1) + y1;
}

x1 = 0;
x2 = 0;
y1 = 0.0;
y2 = 0.0;

for (var x = 0 + Period + Skip; x < Scan + Skip; x++) {
   if (EL[x] > 0 && y2 == 0) { y2 = EL[x]; x2 = x; x+=Period-1; }
   if (EL[x] > 0 && y2 != 0 && y1 == 0 && y2 > EL[x]) break;
   if (EL[x] > 0 && y2 != 0 && y1 == 0) { y1 = EL[x]; x1 = x; break; }
}

if (x1 > 0 && x2 > 0) {   
   Down2[x1] = y1;
   Down2[0] = (double)(0 - x1) / (x2 - x1) * (y2 - y1) + y1;
}

x1 = 0;
x2 = 0;
y1 = 0.0;
y2 = 0.0;

for (var x = 0 + Period + Skip; x < Scan + Skip; x++) {
   if (EH[x] > 0 && y2 == 0) { y2 = EH[x]; x2 = x; x+=Period-1; }
   if (EH[x] > 0 && y2 != 0 && y1 == 0 && y2 < EH[x]) break;
   if (EH[x] > 0 && y2 != 0 && y1 == 0) { y1 = EH[x]; x1 = x; break; }
}

if (x1 > 0 && x2 > 0) {   
   Up2[x1] = y1;
   Up2[0] = (double)(0 - x1) / (x2 - x1) * (y2 - y1) + y1;
}

} //m=c

Down.DrawLine();
Up.DrawLine();

Down2.DrawLine();
Up2.DrawLine();

}
никогда такого не было и вот опять


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

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

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