Страница 1 из 2

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

Добавлено: 21 мар 2016, 19:59
evge
SixLevels автоматически формирует по локальным экстремумам горизонтальные уровни. Всего формируется 3 уровня по максимумам и 3 уровня по минимумам.

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

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

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

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

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

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

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


Исходный код

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

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 КБ) 1249 скачиваний

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

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

Обновил код и файл.

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

Добавлено: 22 мар 2016, 19:11
evge
Добавил возможность задать толщину линии (новый параметр Width)

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

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

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

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

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



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

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

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

Добавлено: 07 мар 2017, 10:29
Владимир
Добрый день! Есть вариант тестирования но не очень удобный в код добавляешь отчёт в лог файл

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

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

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

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

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

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

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


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

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

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;
}

}

Если вы будете двигать график, то индикатор будет перерисовывать уровни и в логе вы увидите ответ на свой вопрос!
Только есть один нюанс, для просмотра обновлений каждый раз придется закрывать и снова открывать файл лога.

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

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