Блог им. Hummel
Урок 1.
Урок 2.
Урок 3.
Урок 4.
Урок 5.
Урок 6. Создание индикатора.
Теперь, когда мы знаем, как форматировать линии и текст на графике, мы можем вернуться к созданию индикатора, который показывает дневные экстремумы. В соответствии с логикой описанной выше, нам нужно найти самый высокий максимум и самый низкий минимум на графике. Самый лучший способ сделать это – взять две переменные, которые будут обновляться по мере того, как график будет рисовать новые вершины и новые минимумы. Трудность заключается в том, чтобы по декларации сбросить и установить значение переменной “High” и “Low” из бара. Для того чтобы сбросить мы используем простую конструкцию “if…then begin…end”. Истинно это выражение будет, если дата в этом баре отличается от даты предыдущего бара. В этом случае это будет каждый первый бар, каждого дня.
Когда максимум нового бара будет выше значения “DayHigh”, переменной “DayHigh” будет дано новое значение. Таким образом, мы сможем легко отслеживать самый высокий максимум и самый высокий минимум, в течение дня. Добавление двух линий для значений двух переменных покажет, работает ли код.
Как мы видим на картинке, отслеживание дневных экстремумов работает хорошо. Теперь давайте удалим эти линии и вместо них создадим две новые, которые показывают максимум и минимум предыдущего дня на сегодняшних данных. Кроме того нам нужно создать два текстовых объекта и выровнять их должным образом на графике. Это достаточно легко сделать, и вам не всегда нужно писать новый код. Мы можем просто внести изменения в код, в котором мы создавали линии и текст. Помимо переменных, которые мы использовали до этого, я добавлю еще четыре переменных, для ID текста и линий. Две переменные под названиями “PrevDayHigh” и “PrevDayLow”, в которые будут записываться значения дневных экстремумов предыдущего дня, перед тем как обновиться. Имена, которые я использую, выбраны произвольно, вы можете дать переменным свои названия. Я назвал их так, потому что такие названия говорят о назначении той или иной переменной, и это делает код более понятным. Логическая переменная “HaveTextAndLines” нужна для проверки наличия текста и линий на графике. Она примет значение true, при изменении первой даты, и это будет начальной точкой для создания текста и линии.
После объявления вводных и переменных, мы можем начать с описания условия для сброса. Когда условие сброса станет истинным, на первом баре каждого дня, нам необходимо переместить значения переменных вчерашнего дня в переменные “PrevDayHigh” и “PrevDayLow”, чтобы потом использовать эти значения для построения линий. Код должен установить значение true, логической переменной “HaveTextAndLines” и создать две линии и два текстовых объекта. У каждого текстового объекта и линии есть свой собственный ID, который можно использовать в коде для изменения значений точек и расположения относительно текущего бара.
Финальная часть кода отслеживает, дневные экстремумы и обновляет расположение текста и линий. Изменение крайних точек линий выполняется с помощью “TL_SetEnd”. Это зарезервированное слово имеет четыре параметра: первый параметр – ID, линии которую вы хотите изменить, дальше идут дата, время и цена точки.
Новая точка для текста устанавливается с помощью “Text_SetLocation”. У этого зарезервированного слова так же четыре параметра. Первый параметр это индивидуальный ID текстового объекта. Остальные три это дата, время бара на которым вы хотите разместить текст и цена на которой текст должен быть расположен.
Мы будем использовать логическую переменную “HaveTextAndLines” для того, чтобы быть уверенными в том, что обновление может произойти, только когда уже есть один текстовый блок и линия. Попытка обновить несуществующие линии и текст могут создать проблемы, так что лучше обезопасится от этого.
Давайте проверим, работает ли код так, как мы хотели. Загрузите индикатор и проверьте. Вы должны видеть две линии на каждом дне (кроме первого дня), которые должны отображать данные предыдущего дня.
Заключение и домашнее задание.
По изображению, мы видим, что код делает то, что мы от него хотели. Есть две линии и текстовые линии на каждый день, и они отображают экстремумы предыдущего дня.
В конце этого урока посвященного линиям и тексту, я надеюсь, что вам понравилось, и вы нашили для себя что-нибудь полезное. В дополнении к этому уроку, в качестве упражнения вы можете изменить этот код так, чтобы текущие дневные экстремумы отображались вместе с текстом и линиями. Для этого можно использовать зарезервированное слово “TL_SetBegin”. Это работает так же как и “TL_SetEnd”, но только для начальной точки линии. Еще один совет который может вам пригодиться для того чтобы сохранить дату и время начала линии, текущего дня в переменные. Вы так же можете немного поменять код, для того чтобы значения для крайних точек линий и текстовых блоков, не задерживались на один бар. Результат изменений может выглядеть примерно так:
Итоговый код.
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;
А пока на повестке дня, у меня php и java-script.
У меня в PowerLanguage Editor-е не компилируется код.
Скрин прилагаю.
У меня win 10,
multicharts.5.0.1781.202_beta2
Вы с этим не сталкивались?
Спасибо заранее.