Меню сайта |
|
|
|
Статистика |
|
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
Форма входа |
|
|
|
|
Урок 11 - Ваш первый индикатор (часть 2)
Добро пожаловать на вторую часть урока "Ваш первый индикатор".
В предыдущем уроке мы не написали ни единой строчки кода - это за нас сделал "помощник". За что ему спасибо.
Сегодня мы добавим пару строк в уже имеющийся код, чтобы программа стала более полезной.
После этого мы разберём весь код строчку за строчкой.
Начнём кодить!
Я выделил жирным код, который нужно добавить.
Цитата:
//+------------------------------------------------------------------+
//| 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)
В жизни мы часто группируем похожие объекты. В программировании тоже
очень удобно группировать данные одного типа. Для достижения этой цели
используются массивы.
Массив - это упорядоченное множество элементов одного типа. Нумерация в массиве начинается с нуля.
Объявление массива:
Здесь мы объявили массив, в котором может содержатся до 50 (включительно) элементов типа integer.
Доступ к элементу происходит по его индексу.
Например, доступ к 0-вому элементу массива и присваивания ему значения 16 выглядит так:
Массив можно инициализировать в строчке его объявления. Делается это так:
Код:
int my_array[5] = {16,24,15,8901,17}
В нашей программе используется такой код:
Код:
double ExtMapBuffer1[];
Таким образом мы объявили массив типа double. Этот массив мы будем
использовать для подсчёта значений, которые необходимо рисовать на
графике индикатора.
Код:
Разбор:
В MQL4 есть три спец. функции: init(), start(), deinit(). Подробнее - см. урок 7 - Функции.
Код:
Код:
//---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); string short_name = "Your first indicator is running!"; IndicatorShortName(short_name);
//----
Разбор:
Функции пользовательских индикаторов.
Я не могу дать Вам описания всех функций индикаторов в этом уроке, но те, которые мы использовали, мы обсудим.
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() сказать не могу.
Мы продолжим разбирать код в следующем уроке.
|
|
Поиск |
|
|
|
Форекс портал
|