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

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

SixLevels - автоматическое формирование уровней

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

SixLevels автоматически формирует по локальным экстремумам горизонтальные уровни. Всего формируется 3 уровня по максимумам и 3 уровня по минимумам.

Входящие параметры

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

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

SixLevels-04.png
Пример с 2 индикаторами SixLevels. Разные параметры и толщина линии уровня.
SixLevels-04.png (33.34 КБ) 10089 просмотров

SixLevels-03.png
SixLevels-03.png (39.91 КБ) 10116 просмотров

SixLevels-01.png
SixLevels-01.png (32.51 КБ) 10134 просмотра

SixLevels-02.png
SixLevels-02.png (31.94 КБ) 10134 просмотра


Исходный код

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

function Initialize()
{
   IndicatorName = "SixLevels";   
   PriceStudy = true;
   AddInput("Input", Inputs.Candle);   
   AddSeries("H", DrawAs.Custom, Color.Green);   
   AddSeries("L", DrawAs.Custom, Color.Red);

   AddSeries("H1", DrawAs.Custom, Color.Green);     
   AddSeries("L1", DrawAs.Custom, Color.Red);     
   AddSeries("H2", DrawAs.Custom, Color.Green);     
   AddSeries("L2", DrawAs.Custom, Color.Red);     
   AddSeries("H3", DrawAs.Custom, Color.Green);     
   AddSeries("L3", DrawAs.Custom, Color.Red);     

    AddLevel(0, Color.Red, LineStyles.DashSmall, 1, "L1");
    AddLevel(0, Color.Red, LineStyles.DashSmall, 1, "L2");
    AddLevel(0, Color.Red, LineStyles.DashSmall, 1, "L3");
    AddLevel(0, Color.Green, LineStyles.DashSmall, 1, "H1");
    AddLevel(0, Color.Green, LineStyles.DashSmall, 1, "H2");
    AddLevel(0, Color.Green, LineStyles.DashSmall, 1, "H3");

   AddParameter("Width", 1);
   AddParameter("Period", 15);
   AddParameter("Scan", 300, 1);
   AddParameter("SkipBars", 30);
}

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

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

var HC = true;
var LC = true;

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

if (HC) if (Input.High[Period * 2 - x] > High || Input.High[x] > High) HC = false;
if (LC) if (Input.Low[Period * 2 - x] < Low || Input.Low[x] < Low) LC = false;

if (!LC && !HC) break;

} //x

if (HC) H[Period] = Input.High[Period];
if (LC) L[Period] = Input.Low[Period];

H.DrawCircle();
L.DrawCircle();

if (CurrentIndex < 1) {
Levels[0].Level = 0; Levels[1].Level = 0; Levels[2].Level = 0;
Levels[3].Level = 0; Levels[4].Level = 0; Levels[5].Level = 0;
Levels[0].Width = (int)Width; Levels[1].Width = (int)Width;
Levels[2].Width = (int)Width; Levels[3].Width = (int)Width;
Levels[4].Width = (int)Width; Levels[5].Width = (int)Width;
}

if (CurrentIndex == MaxIndex)

for (var x = 0 + SkipBars; x < Scan; x++) {
   if (L[x] > 0 && L1[0] == 0) { L1[0]= L[x]; Levels[0].Level = L[x]; } else
   if (L[x] > 0 && L2[0] == 0) { L2[0]= L[x]; Levels[1].Level = L[x]; } else
   if (L[x] > 0 && L3[0] == 0) { L3[0]= L[x]; Levels[2].Level = L[x]; }

   if (H[x] > 0 && H1[0] == 0) { H1[0]= H[x]; Levels[3].Level = H[x]; } else
   if (H[x] > 0 && H2[0] == 0) { H2[0]= H[x]; Levels[4].Level = H[x]; } else
   if (H[x] > 0 && H3[0] == 0) { H3[0]= H[x]; Levels[5].Level = H[x]; }

   if (L3[0] > 0 && H3[0] > 0) break;
}

}


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

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

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

Re: SixLevels - автоматическое формирование уровней

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

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

Обновил код и файл.
никогда такого не было и вот опять

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

Re: SixLevels - автоматическое формирование уровней

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

Добавил возможность задать толщину линии (новый параметр Width)

Добавил ещё один скриншот, обновил код и файл.
никогда такого не было и вот опять

A.Lemzhin
Сообщения: 9
Зарегистрирован: 31 янв 2017, 12:07

Re: SixLevels - автоматическое формирование уровней

Непрочитанное сообщение A.Lemzhin » 07 мар 2017, 09:32

Добрый день.
При встраивании этого индикатора в стратегию, робот работает в режиме реального времени, но не тестится на прошедшем временном интервале. Есть дополнительные условия или решение этого момента?

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

Re: SixLevels - автоматическое формирование уровней

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

A.Lemzhin писал(а):Добрый день.
При встраивании этого индикатора в стратегию, робот работает в режиме реального времени, но не тестится на прошедшем временном интервале. Есть дополнительные условия или решение этого момента?



Индикатор рисует задним числом экстремумы.
Такие индикаторы некорректно тестируются.
Вообщем-то и робот не должен вообще работать в таким индикаторе.

(см. обсуждение далее, там есть пример кода индикатора для работы в стратегиях \ роботах)
никогда такого не было и вот опять

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: SixLevels - автоматическое формирование уровней

Непрочитанное сообщение Владимир » 07 мар 2017, 10:29

Добрый день! Есть вариант тестирования но не очень удобный в код добавляешь отчёт в лог файл

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

LogData (" Точка входа в лонг"  + Convert.ToString(Имя переменной для определения цены откарытия позиции), IndicatorName);

эти параметры пишите кикие вас интересуют.
Отматываете на графике на то число с которого хотите видеть историю по данному инструменту и передвигая график на одну свечку листаете.
В файле лога появятся записи по сигналам так можно посмотреть, я так же тестирывал и смотрел ошибки с точки входа метод мутарный но помогает.
Расположение файла C:\Users\Имя пользовалеля\AppData\Local\Alfa-Direct
имя файла название индикатора
или пуск/\все программы\Альфа-Директ™\Файлы Альфа-Директ™ далее папка лог

A.Lemzhin
Сообщения: 9
Зарегистрирован: 31 янв 2017, 12:07

Re: SixLevels - автоматическое формирование уровней

Непрочитанное сообщение A.Lemzhin » 01 апр 2017, 09:22

Добрый день. Можно выложить версию, где поиск уровней проходит для каждого бара?

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

Re: SixLevels - автоматическое формирование уровней

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

A.Lemzhin писал(а):Добрый день. Можно выложить версию, где поиск уровней проходит для каждого бара?


Приветствую!
Поясните, что Вы имеете ввиду под фразой "для каждого бара"?!

(см. обсуждение далее, там есть пример кода индикатора для работы в стратегиях \ роботах)
никогда такого не было и вот опять

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: SixLevels - автоматическое формирование уровней

Непрочитанное сообщение Владимир » 02 апр 2017, 21:40

Добрый день!
A.Lemzhin писал(а):
Добрый день. Можно выложить версию, где поиск уровней проходит для каждого бара?

Добавил вывод данных в лог в коде

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

function Initialize()
{
   IndicatorName = "SixLevels";   
   PriceStudy = true;
   AddInput("Input", Inputs.Candle);   
   AddSeries("H", DrawAs.Custom, Color.Green);   
   AddSeries("L", DrawAs.Custom, Color.Red);

   AddSeries("H1", DrawAs.Custom, Color.Green);     
   AddSeries("L1", DrawAs.Custom, Color.Red);     
   AddSeries("H2", DrawAs.Custom, Color.Green);     
   AddSeries("L2", DrawAs.Custom, Color.Red);     
   AddSeries("H3", DrawAs.Custom, Color.Green);     
   AddSeries("L3", DrawAs.Custom, Color.Red);     

    AddLevel(0, Color.Red, LineStyles.DashSmall, 1, "L1");
    AddLevel(0, Color.Red, LineStyles.DashSmall, 1, "L2");
    AddLevel(0, Color.Red, LineStyles.DashSmall, 1, "L3");
    AddLevel(0, Color.Green, LineStyles.DashSmall, 1, "H1");
    AddLevel(0, Color.Green, LineStyles.DashSmall, 1, "H2");
    AddLevel(0, Color.Green, LineStyles.DashSmall, 1, "H3");

   AddParameter("Width", 1);
   AddParameter("Period", 15);
   AddParameter("Scan", 300, 1);
   AddParameter("SkipBars", 30);
}

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

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

var HC = true;
var LC = true;

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

if (HC) if (Input.High[Period * 2 - x] > High || Input.High[x] > High) HC = false;
if (LC) if (Input.Low[Period * 2 - x] < Low || Input.Low[x] < Low) LC = false;

if (!LC && !HC) break;

} //x

if (HC) H[Period] = Input.High[Period];
if (LC) L[Period] = Input.Low[Period];

H.DrawCircle();
L.DrawCircle();

if (CurrentIndex < 1) {
Levels[0].Level = 0; Levels[1].Level = 0; Levels[2].Level = 0;
Levels[3].Level = 0; Levels[4].Level = 0; Levels[5].Level = 0;
Levels[0].Width = (int)Width; Levels[1].Width = (int)Width;
Levels[2].Width = (int)Width; Levels[3].Width = (int)Width;
Levels[4].Width = (int)Width; Levels[5].Width = (int)Width;
}

if (CurrentIndex == MaxIndex)

for (var x = 0 + SkipBars; x < Scan; x++) {
   if (L[x] > 0 && L1[0] == 0) { L1[0]= L[x]; Levels[0].Level = L[x];
   LogData ("L1 - "  + Convert.ToString(L[x]) , IndicatorName); } else
   if (L[x] > 0 && L2[0] == 0) { L2[0]= L[x]; Levels[1].Level = L[x];
   LogData ("L2 - "  + Convert.ToString(L[x]) , IndicatorName); } else
   if (L[x] > 0 && L3[0] == 0) { L3[0]= L[x]; Levels[2].Level = L[x];
   LogData ("L3 - "  + Convert.ToString(L[x]) , IndicatorName);}

   if (H[x] > 0 && H1[0] == 0) { H1[0]= H[x]; Levels[3].Level = H[x];
   LogData ("H1 - "  + Convert.ToString(H[x]) , IndicatorName); } else
   if (H[x] > 0 && H2[0] == 0) { H2[0]= H[x]; Levels[4].Level = H[x];
   LogData ("H2 - "  + Convert.ToString(H[x]) , IndicatorName); } else
   if (H[x] > 0 && H3[0] == 0) { H3[0]= H[x]; Levels[5].Level = H[x];
   LogData ("H3 - "  + Convert.ToString(H[x]) , IndicatorName); }

   if (L3[0] > 0 && H3[0] > 0) break;
}

}

Если вы будете двигать график, то индикатор будет перерисовывать уровни и в логе вы увидите ответ на свой вопрос!
Только есть один нюанс, для просмотра обновлений каждый раз придется закрывать и снова открывать файл лога.
Вложения
SixLevels.log
(888 байт) 755 скачиваний
SixLevels.jpg

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

Re: SixLevels - автоматическое формирование уровней

Непрочитанное сообщение evge » 03 апр 2017, 06:20

"для каждого бара", где я описывал выше про увеличение скорости работы, означает только одно - увеличение скорости работы индикатора. Результат на графике от этого не менялся.
никогда такого не было и вот опять


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

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

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