Антон Ш
Антон Ш личный блог
13 ноября 2016, 18:36

ABC Easy/power language Урок 6.

Урок 1.
Урок 2.
Урок 3.
Урок 4.
Урок 5.

Урок 6. Создание индикатора.

  Теперь, когда мы знаем, как форматировать линии и текст на графике, мы можем вернуться к созданию индикатора, который показывает дневные экстремумы. В соответствии с логикой описанной выше, нам нужно найти самый высокий максимум и самый низкий минимум на графике. Самый лучший способ сделать это – взять две переменные, которые будут обновляться по мере того, как график будет рисовать новые вершины и новые минимумы. Трудность заключается в том, чтобы по декларации сбросить и установить значение переменной “High” и “Low” из бара. Для того чтобы сбросить мы используем простую конструкцию “if…then begin…end”. Истинно это выражение будет, если дата в этом баре отличается от даты предыдущего бара. В этом случае это будет каждый первый бар, каждого дня.
ABC Easy/power language Урок 6.

  Когда максимум нового бара будет выше значения “DayHigh”, переменной “DayHigh” будет дано новое значение. Таким образом, мы сможем легко отслеживать самый высокий максимум и самый высокий минимум, в течение дня. Добавление двух линий для значений двух переменных покажет, работает ли код.
ABC Easy/power language Урок 6.

  Как мы видим на картинке, отслеживание дневных экстремумов работает хорошо. Теперь давайте удалим эти линии и вместо них создадим две новые, которые показывают максимум и минимум предыдущего дня на сегодняшних данных. Кроме того нам нужно создать два текстовых объекта и выровнять их должным образом на графике. Это достаточно легко сделать, и вам не всегда нужно писать новый код. Мы можем просто внести изменения в код, в котором мы создавали линии и текст. Помимо переменных, которые мы использовали до этого, я добавлю еще четыре переменных, для ID текста и линий. Две переменные под названиями “PrevDayHigh” и “PrevDayLow”,  в которые будут записываться значения дневных экстремумов предыдущего дня, перед тем как обновиться. Имена, которые я использую, выбраны произвольно, вы можете дать переменным свои названия. Я назвал их так, потому что такие названия говорят о назначении той или иной переменной, и это делает код более понятным. Логическая переменная  “HaveTextAndLines” нужна для проверки наличия текста и линий на графике. Она примет значение true, при изменении первой даты, и это будет начальной  точкой для создания текста и линии.
ABC Easy/power language Урок 6.
ABC Easy/power language Урок 6.

  После объявления вводных и переменных, мы можем начать с описания условия для сброса. Когда условие сброса станет истинным, на первом баре каждого дня, нам необходимо переместить значения переменных вчерашнего дня в переменные “PrevDayHigh” и “PrevDayLow”, чтобы потом использовать эти значения для построения линий. Код должен установить значение true, логической переменной “HaveTextAndLines” и создать две линии и два текстовых объекта. У каждого текстового объекта и линии есть свой собственный ID, который можно использовать в коде для изменения значений точек и расположения относительно текущего бара.
ABC Easy/power language Урок 6.

ABC Easy/power language Урок 6.

  Финальная часть кода отслеживает, дневные экстремумы и обновляет расположение текста и линий. Изменение крайних точек линий выполняется с помощью “TL_SetEnd”.  Это зарезервированное слово имеет четыре параметра: первый параметр – ID, линии которую вы хотите изменить, дальше идут дата, время и цена точки.
ABC Easy/power language Урок 6.
  Новая точка для текста устанавливается с помощью  “Text_SetLocation”. У этого зарезервированного слова так же четыре параметра. Первый параметр это индивидуальный ID текстового объекта. Остальные три это дата, время бара на которым вы хотите разместить текст и цена на которой текст должен быть расположен.
ABC Easy/power language Урок 6.

  Мы будем использовать логическую переменную “HaveTextAndLines” для того, чтобы быть уверенными в том, что обновление может произойти, только когда уже есть один текстовый блок и линия. Попытка обновить несуществующие линии и текст могут создать проблемы, так что лучше обезопасится от этого.

ABC Easy/power language Урок 6.

  Давайте проверим, работает ли код так, как мы хотели. Загрузите индикатор и проверьте. Вы должны видеть две линии на каждом дне (кроме первого дня), которые должны отображать данные предыдущего дня.
ABC Easy/power language Урок 6.

Заключение и домашнее задание.

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

  В конце этого урока посвященного линиям и тексту, я надеюсь, что вам понравилось, и вы нашили для себя что-нибудь полезное. В дополнении к этому уроку, в качестве упражнения вы можете изменить этот код так, чтобы текущие дневные экстремумы отображались вместе с текстом и линиями. Для этого можно использовать зарезервированное слово “TL_SetBegin”. Это работает так же как и “TL_SetEnd”, но только для начальной точки линии. Еще один совет который может вам пригодиться для того чтобы сохранить дату и время начала линии, текущего дня в переменные. Вы так же можете немного поменять код, для того чтобы значения для крайних точек линий и текстовых блоков, не задерживались на один бар. Результат изменений может выглядеть примерно так:
ABC Easy/power language Урок 6.



Итоговый код.

Inputs:
HighTLColor(darkgreen),
LowTLColor(red),
TLSize(1),  
TLStyle(1),
HighTextColor(darkgreen),
LowTextColor(red),
TextSize(10);

Variables:

VertTxtP1(1),
//0-below the specified price value
//1-above the specified price value
//2-centered on the specified price value

HorizTxtP1(1),
//0-to the right of the specified bar
//1-to the left of the specified bar
//2-centered on the specified bar  

HaveTextAndLines(false),
DayHigh(High),
DayLow(Low),
PrevDayHigh(0),
PrevDayLow(0),
HiTxt(-1),
Lotxt(-1),
HiTL(-1),
LoTL(-1);

//reset on a date change
if Date <> Date[1] then
begin
//save previous day`s extremes before resetting them
PrevDayHigh = DayHigh;
PrevDayLow  = DayLow;

//set the tracking variables to
//the high and low of the first bar
//of the day

DayHigh = High;
DayLow = Low;

//this boolean variable is used to make sure that the trenlines 
//drawing the trendline with the values for the current bar and
//update them with everynew bar later in the code

HaveTextAndLines = true;

//create new trendlines to display previous extremes we will start
//drawing the trendline with te values for current bar and
//update them with every new bar later in the code

HiTL = TL_New(Date,Time, PrevDayHigh, Date, Time, PrevDayHigh);
       TL_SetColor(HiTL, HighTLColor);
       TL_SetSize(HiTL,TLSize);
       TL_SetStyle(HiTL, TLStyle);
           
LoTL = TL_New(Date,Time, PrevDayLow, Date, Time, PrevDayLow);
       TL_SetColor(LoTL, LowTLColor);
       TL_SetSize(LoTL,TLSize);
       TL_SetStyle(LoTL, TLStyle);

HiTxt = Text_New(Date, Time, PrevDayHigh, "PrevHi");
        Text_SetColor(HiTxt, HighTextColor);
        Text_SetSize (HiTxt, TextSize);
        Text_SetStyle(HiTxt, HorizTxtP1, VertTxtP1);
        
LoTxt = Text_New (Date, Time, PrevDayLow, "PrevLo");
         Text_SetColor(LoTxt, LowTextColor);
         Text_SetSize(LOTxt, TextSize);
         Text_SetStyle(LoTxt, HorizTxtP1, VertTxtP1);
         
end;     

//to prevent errors we only update trendlines when we are sure that
//at least one set of trend lines exist
If HaveTextAndLines = true then
begin

//update the trendline endpoints
TL_SetEnd(HiTL, Date, Time, PrevDayHigh);
TL_SetEnd(LoTL, Date, Time, PrevDayLow);

//update text to new location
Text_setLocation(HiTxt, Date, Time, PrevDayHigh);
Text_SetLocation(LoTxt, Date, Time, PrevDayLow);

end;

//update the variable tracking the lowest low
if low < DayLow then
DayLow = Low;

if high > DayHigh then
DayHigh = High;
3 Комментария
  • ezomm
    13 ноября 2016, 22:22
    Спасибо за труд.Мне бы такое лет 15 назад, а сейчас мои глаза все видят, а мозг перестал искать новое.Это предел.А друг у меня цели и время на лог-фм линейке считает.Вот это уже беспредел.
  • Сергей Тюленин
    30 июля 2017, 17:11
    Добрый день. Антон!
    У меня в PowerLanguage Editor-е не компилируется код.
    Скрин прилагаю.
    У меня win 10,
    multicharts.5.0.1781.202_beta2
    Вы с этим не сталкивались?
    Спасибо заранее.



Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн