Урок 11 — Ваш первый индикатор (часть 2)

0

mql0Добро пожаловать во вторую часть урока «Ваш первый индикатор».
В предыдущем уроке мы не написали ни единой строчки кода — это за нас сделал «помощник». За что ему спасибо.
Сегодня мы добавим пару строк в уже имеющийся код, чтобы программа стала более полезной.
После этого мы разберём весь код строчку за строчкой.

Начнём кодить!

Я выделил жирным код, который нужно добавить.

Цитата

//+——————————————————————+
//| MyFirstIndicator.mq4 |
//| Kirill |
//| StockProgrammer@mail.ru |
//+——————————————————————+
#property copyright «Kirill»
#property link «StockProgrammer@mail.ru»

#property indicator_separate_window
#property indicator_buffers 1
#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)

В жизни мы часто группируем похожие объекты. В программировании тоже очень удобно группировать данные одного типа. Для достижения этой цели используются массивы.
Массив — это упорядоченное множество элементов одного типа. Нумерация в массиве начинается с нуля.
Объявление массива:

int my_array[50];

Здесь мы объявили массив, в котором может содержатся до 50 (включительно) элементов типа integer.
Доступ к элементу происходит по его индексу.
Например, доступ к 0-вому элементу массива и присваивания ему значения 16 выглядит так:

my_array[0] = 16;

Массив можно инициализировать в строчке его объявления. Делается это так:

int my_array[5] = {16,24,15,8901,17}

В нашей программе используется такой код:

double ExtMapBuffer1[];

Таким образом мы объявили массив типа double. Этот массив мы будем использовать для подсчёта значений, которые необходимо рисовать на графике индикатора.

Код:

int init()

Разбор:

В 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(); .

Код:

return (0);

Разбор:

Функция init() возвращает 0 и завершает свою работу. Управление переходит функции start().

Код:

int deinit()
  {
//----

//----
   return(0);
  }

Разбор:

Ничего нового про функцию deinit() сказать не могу.

Мы продолжим разбирать код в следующем уроке.
Надеюсь, Вам понравилось, и я приветствую любые Ваши вопросы.

До встречи!

Поделиться

Об авторе

Хоакин Монфорт родился в Лондоне и окончил с Колледж Голдсмитс, Лондонский университет, получив степень бакалавра в области социальной антропологии и журналистики. После окончания учебы, Хоакин начал свою карьеру в качестве редактора одного из Лондонских журналов и параллельно стал изучать финансовые рынки. Свой интерес к рынку форекс Хоакин объясняет возможностью торговать 24 часа в сутки различными валютными парами, а также интересом к международной политике. В 2010 году Хоакин стал работать аналитиком в Forex4you. «Работать на международного иностранного брокера» - по его словам - было «прекрасной возможностью». На данный момент Хоакин является членом общества технических аналитиков Великобритании и продолжает вести исследования в области финансовых рынков, а также занимается разработкой и усовершенствованием торговых стратегий.

Комментарии закрыты.