MQL4 УРОК 11 – Ваш первый индикатор (часть 2)Добро пожаловать во вторую часть урока "Ваш первый индикатор”. В предыдущем уроке мы не написали ни единой строчки кода – это за нас сделал "помощник”. За что ему спасибо. Сегодня мы добавим пару строк в уже имеющийся код, чтобы программа стала более полезной. После этого мы разберём весь код строчку за строчкой. Начнём кодить! Я выделил жирным код, который нужно добавить. Цитата //+——————————————————————+
//| MyFirstIndicator.mq4 | //| Kirill | //| StockProgrammer@mail.ru | //+——————————————————————+ #property copyright "Kirill” #property link "StockProgrammer@mail.ru” #property indicator_separate_window #property indicator_buffers
#property indicator_color1 Red //—- buffers double ExtMapBuffer1[];
//+——————————————————————+ //| Custom indicator initialization function | //+——————————————————————+ int init() { //—- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1); string short_name = "Your first indicator is running!”; IndicatorShortName(short_name); //—-
return(0); } //+——————————————————————+ //| Custom indicator deinitialization function | //+——————————————————————+ int deinit() {
//—- //—- return(0);
} //+——————————————————————+ //|
Custom indicator iteration function |
//+——————————————————————+ int start() { int counted_bars=IndicatorCounted(); //—- check for possible errors if (counted_bars<0) return(-1); //—- last counted bar will be recounted if (counted_bars>0) counted_bars–; int pos=Bars-counted_bars; double dHigh , dLow , dResult; Comment("Hi! I’m here on the main chart window!”); //—- main calculation loop while(pos>=0) { dHigh = High[pos]; dLow = Low[pos];
dResult = dHigh – dLow; ExtMapBuffer1[pos]= dResult ; pos–; } //—- return(0); } //+——————————————————————+ Как он будет работать? Код: | //+------------------------------------------------------------------+ //| MyFirstIndicator.mq4 | //| Kirill | //| StockProgrammer@mail.ru | //+------------------------------------------------------------------+ | Разбор: Комментарии Первые пять строчек (выделены серым цветом у Вас в редакторе) – это комментарии. Напомню, что комментарии мы используем для того, чтобы вставлять в код строчки, которые компилятор должен игнорировать. Есть много причин, по которым могут потребоваться комментарии: - Сделать код более красивым. - Задокументировать такие моменты, как право собственности, дату создания и т.д. - Сделать код понятнее. - Объяснить, как код работает. - … Комментарии бывают однострочные и многострочные (см. урок 2 – Синтаксис). В нашей программе помощник собрал введённую нами информацию о названии программы, её авторе и ссылке в самом верху. Код: | #property copyright "Kirill" #property link "StockProgrammer@mail.ru" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red | Разбор: Директива property . (см. урок 9) #property copyright – здесь хранится имя автора программы. Вы ввели его на втором шаге помощника. Тип данных – string. #property link – ссылка на Вашу домашнюю страницу или Ваш e-mail. Эти данные Вы также ввели на втором шаге помощника. Тип данных – string. #property indicator_separate_window – таким образом мы говорим препроцессору, что мы хотим, чтобы наш индикатор рисовался в отдельном окне. Тип данных – void (нет принимаемого значения). * #property indicator_chart_window – альтернатива – индикатор рисуется в окне графика. Обе опции использовать одновременно нельзя. #property indicator_buffers 1 – с помощью indicator_buffers мы устанавливаем количество массивов, выделяемых под линии нашего индикатора. В каждом индикаторе разрешается не больше 8 линий. В нашем случае мы рисуем только одну линию. #property indicator_color1 Red – indicator_colorN устанавливает цвет линии номер N. Пользователь может изменить этот цвет в настройках индикатора. Тип данных – color. Код: | //---- buffers double ExtMapBuffer1[]; | Разбор: Массивы (Arrays) В жизни мы часто группируем похожие объекты. В программировании тоже очень удобно группировать данные одного типа. Для достижения этой цели используются массивы. Массив – это упорядоченное множество элементов одного типа. Нумерация в массиве начинается с нуля. Объявление массива: Здесь мы объявили массив, в котором может содержатся до 50 (включительно) элементов типа integer. Доступ к элементу происходит по его индексу. Например, доступ к 0-вому элементу массива и присваивания ему значения 16 выглядит так: Массив можно инициализировать в строчке его объявления. Делается это так: | int my_array[5] = {16,24,15,8901,17} | В нашей программе используется такой код: Таким образом мы объявили массив типа double. Этот массив мы будем использовать для подсчёта значений, которые необходимо рисовать на графике индикатора. Код: Разбор: В MQL4 есть три спец. функции: init(), start(), deinit(). Подробнее – см. урок 7 – Функции. Код: | //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); [b] string short_name = "Your first indicator is running!"; IndicatorShortName(short_name);[/b] //---- | Разбор: Функции пользовательских индикаторов. Я не могу дать Вам описания всех функций индикаторов в этом уроке, но те, которые мы использовали, мы обсудим. SetIndexStyle(): void SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE) - Устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора. index – Порядковый номер линии. Должен быть от 0 до 7. Это потому что у нас может быть всего 8 линий, а нумерация в массиве, где они хранятся начинается с нуля. type – Стиль отрисовки линии индикатора. Может быть одним из перечисленных стилей отрисовки линии: DRAW_LINE – Простая линия DRAW_SECTION – Отрезки между непустыми значениями линии DRAW_HISTOGRAM – Гистограмма DRAW_ARROW – Стрелки (символы) DRAW_ZIGZAG – Отрезки между непустыми значениями чётной и нечётной линий (зигзаг) DRAW_NONE – Отсутствие какого-либо рисования style – Стиль линии. Используется для линий толщиной в 1 пиксель. Может быть одним из перечисленных стилей линии. Пустое значение (EMPTY) указывает, что стиль не будет изменен. DRAW_LINE – Простая линия DRAW_SECTION – Отрезки между непустыми значениями линии DRAW_HISTOGRAM – Гистограмма DRAW_ARROW – Стрелки (символы) DRAW_ZIGZAG – Отрезки между непустыми значениями чётной и нечётной линий (зигзаг) DRAW_NONE – Отсутствие какого-либо рисования width – Ширина линии. Допустимые значения – 1,2,3,4,5. Пустое значение (EMPTY) указывает, что ширина не будет изменена. clr – Цвет линии. Отсутствие параметра означает, что цвет не будет изменен. В нашем коде: | SetIndexStyle(0,DRAW_LINE); | index = 0 – это означает, что мы будем работать с первой (и единственной) нашей линией. type = DRAW_LINE – это означает, что мы хотим рисовать линию. Остальные параметры мы оставили по умолчанию. SetIndexBuffer() bool SetIndexBuffer(int index, double array[]) - Связывает переменную-массив, объявленный на глобальном уровне, с предопределенным буфером пользовательского индикатора. Количество буферов, необходимых для расчета индикатора, задается с помощью функции IndicatorBuffers() и не может быть больше 8. В случае успешного связывания возвращается TRUE, иначе FALSE. Чтобы получить расширенные сведения об ошибке, следует вызвать функцию GetLastError(). Как мы уже замечали ранее, рассчитанные данные для отрисовки на график в нашей программе будут храниться в массиве ExtMapBuffer1[]. Его мы и связываем с нашей единственной линией, имеющей индекс 0. IndicatorShortName(); void IndicatorShortName(string name) - Установка "короткого” имени пользовательского индикатора для отображения в подокне индикатора и в окне DataWindow. Мы в нашей программе завели переменную short_name типа string, которой присвоили значение "Your first indicator is running!”. Затем мы передали эту переменную в функцию IndicatorShortName(); . Код: Разбор: Функция init() возвращает 0 и завершает свою работу. Управление переходит функции start(). Код: | int deinit() { //---- //---- return(0); } | Разбор: Ничего нового про функцию deinit() сказать не могу. Мы продолжим разбирать код в следующем уроке.
|