Заработать на ФОРЕКС
Вторник, 26.09.2017, 06:55
Всё для прибыльной торговли на FOREX!
Главная | Добавить в избранное | Сделать стартовойфорекс советники
Меню сайта
Категории раздела
Уроки по MQL4 [14]
Лучшие брокеры
заработок в интернете форекс бесплатно Виртуальный выделенный сервер для Форекс Виртуальный выделенный сервер для Форекс Виртуальный выделенный сервер для Форекс Виртуальный выделенный сервер для Форекс заработок в интернете заработок на форекс заработок в интернете заработок в интернете заработок в интернете заработок в интернете Виртуальный выделенный сервер для Форекс
Радио Forex
Друзья сайта
Поиск
Наш опрос
Рейтинг брокеров
Всего ответов: 1938
Термины ФОРЕКС
<a href="http://instaforex.com/ru/" rel="nofollow">Форекс портал</a>
Главная » Статьи » Уроки по MQL4 » Уроки по MQL4


MQL4 УРОК 12 – Ваш первый индикатор (часть 3)
2

MQL4 УРОК 12 – Ваш первый индикатор MQL4 УРОК 12 – Ваш первый индикатор (часть 3)


Добро пожаловать на третью часть урока "Ваш первый индикатор”.
В предыдущем уроке мы разбирали код нашего первого индикатора строчку за строчкой и дошли до функции start().
Очень надеюсь, что Вы прекрасно понимаете, что происходило в предыдущих уроках.
Сегодня мы изучим функцию start() и её содержимое, и, наконец-то, мы скомпилируем и запустим наш первый индикатор.
Вы готовы? Давайте разберём оставшийся код!

Наш код:

Цитата

//+——————————————————————+
//| 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 windows!”);

//—- main calculation loop

while(pos>=0)
{
dHigh = High[pos];
dLow = Low[pos];
dResult = dHigh – dLow;

ExtMapBuffer1[pos]= dResult ;

pos–;

}

//—-

return(0);
}
//+——————————————————————+

Код:

int start()
 {

 }

Разбор:

Как я Вам уже говорил, мы будем проводить 90% нашей программистской жизни внутри фигурных скобок тела функции start(). Это так, потому что она самая важная из всех трёх спец. функций MQL4. В отличии от функций init() и deinit() функция start() не будет вызвана (клиентским терминалом) только единожды. Она будет вызываться при каждом поступление новых котировок. Функция start() возвращает значение типа integer, как и все остальные спец. функции языка MQL4. 0 означает, что функция отработала без ошибок, а любое другое число означает, что произошла ошибка.

Код:

int counted_bars=IndicatorCounted();

Разбор:

Здесь мы объявили переменную counted_bars типа integer и инициализировали её значением, возвращаемым функцией IndicatorCounted(); .

int IndicatorCounted( ) 

Функция возвращает количество баров, не измененных после последнего вызова индикатора. Большинство подсчитанных баров не нуждается в пересчете. Функция используется для оптимизации вычислений.

 

Замечание: самый последний бар не считается посчитанным, и в большинстве случаев необходимо пересчитывать только его. Однако бывают пограничные случаи, когда вызов пользовательского индикатора производится из эксперта на первом тике нового бара. Возможна ситуация, что последний тик предыдущего бара не обработан (по той причине, что в момент прихода этого последнего тика обрабатывался предпоследний тик), и пользовательский индикатор не был вызван и поэтому не был рассчитан. Чтобы избежать в такой ситуации ошибок расчета индикатора, функция IndicatorCounted() возвращает реально посчитанное количество баров минус один. 

ОЧЕНЬ ВАЖНО: на будущее запомните, что в MQL4 бары нумеруются задом-наперёд. Нулевой бар – это текущий бар, следующий (более старый – левее на графике) – это первый бар, за ним – второй и т.д. При появлении нового бара они все перенумеровываются, и текущий опять становится нулевым.

Код:

//---- check for possible errors
 if (counted_bars<0) return(-1);

Разбор:

Очевидно, что число баров, не измененных после последнего вызова индикатора должно быть = 0 или > 0. Если же оно < 0, значит произошла ошибка. Мы терминируем функциюstart() и сообщаем об ошибке, возвращая не 0.

Код:

//---- last counted bar will be recounted
 if (counted_bars>0) counted_bars--;

Разбор:

Притворяемся, что посчитано на один бар меньше, чтобы пересчитать последний бар. На самом деле, это перестраховка, т.к. функция IndicatorCounted( ) и так возвращает число на 1 меньше. Но ничего страшного в том, что мы пересчитаем ещё один лишний бар нет. PS: надеюсь, вы помните, что –; - это оператор декремента – уменьшение на единицу.

Код:

int pos=Bars-counted_bars;

Разбор:

Здесь мы объявляем переменную pos, которая указывает, сколько раз должен сработать наш счётный цикл (про цикл while см. далее). ‘Функция’ Bars возвращает количество уже имеющихся на графике баров. Чтобы вычислить pos мы из общего количества баров графика вычитаем количество уже посчитанных баров.

Кстати, хороший момент обсудить ‘функцию’ Bars и её братьев.

Предопределённые переменные языка MQL4:

Ask, Bid, Bars, Close, Open, High, Low, Time и Volume – являются функциями, хотя в MQL4 они называются предопределёнными переменными и после них не надо ставить круглые скобки.
И я докажу Вам, что они скорее функции, чем переменные.
Переменная – означает область в памяти + тип данных, который Вы указываете.
Функция – означает сделать что-то и вернуть какое-то значение. Например, Bars считает и возвращает количество баров на графике. Так что же? Это переменная?
Если ввести следующий код:
Bars = 1;
Вы получите ошибку: ‘Bars’ – unexpected token
Это потому что они не переменные, и Вы не можете присваивать им значения.
Итак, обсудим эти функции.

int Bars

Эта функция возвращает значение типа integer, в котором содержится информация о количестве имеющихся на текущем графике барах.

double Ask

Эта функция, используемая преимущественно в советниках, возвращает значение типа double, в котором содержится информация о цене покупки базовой валюты в данной валютной паре.

double Bid

Эта функция, используемая преимущественно в советниках, возвращает значение типа double, в котором содержится информация о цене продажи базовой валюты в данной валютной паре.

Замечание: Например, USD/JPY = 105.11/105.14 – здесь левая цена – это bid (цена, по которой Вы продаёте), правая цена – это ask (цена, по которой Вы покупаете).

double Open[]

Эта функция возвращает значение типа double, в котором содержится информация о цене открытия (далее – везде ‘цена’ – это bid) для указанного бара.

Например: Open[0] вернёт цену открытия текущего бара.

double Close[]

Эта функция возвращает значение типа double, в котором содержится информация о цене закрытия для указанного бара.

Замечание: Т.к. цена закрытия текущего бара ещё никому не известна, Close[0] возвращает текущую цену bid.

double High[]

Эта функция возвращает значение типа double, в котором содержится информация о самой высокой цене (цене high) для указанного бара.

double Low[]

Эта функция возвращает значение типа double, в котором содержится информация о самой низкой цене (цене low) для указанного бара.

double Volume[]

Эта функция возвращает значение типа double, в котором содержится информация ( для forex объёмы не контролируются, поэтому: ) о количестве изменений котировки для указанного бара.

int Digits

Эта функция возвращает значение типа integer, в котором содержится информация о количестве знаков после запятой для котировки данной валюты. Обычно 4.

int Point

Эта функция возвращает значение типа double равное одному пункту для данной валютной пары. Обычно 0.0001 .

datetime Time[]

Эта функция возвращает значение типа datetime, в котором содержится информация о времени открытия указанного бара.

Код:

double dHigh , dLow , dResult;

Разбор:

Мы объявили три переменные типа double, которые мы используем позже. Заметьте, как мы объявили все три в одной строчке, разделив их запятыми.

Код:

Comment("Hi! I'm here on the main chart window!");

Разбор:

В этой строчке мы используем функцию Comment, чтобы распечатать текст "Hi! I’m here on the main chart window!” в левом верхнем углу основного графика.

Всего таких информирующих функции три:

void Comment()

Функция выводит комментарий, определенный пользователем, в левый верхний угол графика. Параметры могут иметь любой тип. Количество параметров не может превышать 64.

void Print( …) 

Печатает некоторое сообщение в журнал экспертов. Параметры могут иметь любой тип. Количество параметров не может превышать 64.

void Alert( …) 

Отображает диалоговое окно, содержащие пользовательские данные. Параметры могут быть любого типа. Количество параметров не может превышать 64.

Код:

//---- main calculation loop

 while(pos>=0)
 {
 dHigh = High[pos];
 dLow = Low[pos];
 dResult = dHigh - dLow;

 ExtMapBuffer1[pos]= dResult;

 pos--;

 }

Разбор:

Пришло время войти в цикл расчёта отображаемых нашим индикатором точек. Любое значение, которое мы положим в массив ExtMapBuffer1[] будет отображено на графике (потому что, используя функцию SetIndexBuffer(), мы связали этот массив с линией, индексируемой нулём).

ОЧЕНЬ ВАЖНО: когда мы связываем массив с линией, массив приобретает ещё одно спец. свойство. При появлении нового бара на графике, все элементы массива сдвигаются влево на один, т.е. N-й становится N+1-ым, … , 1-й становится 2-м, 0-й становится 1-м. Таким образом, высвобождается место для нового нулевого элемента. Это сделано для того, чтобыпри пересчёте только новых баров графика, информация о значении индикатора на старых барах сохранялась в элементах масива, индексируемых теми же числами, что и сами бары.

Переменной цикла (она регулирует число его прохождений) у нас является переменная pos. Мы её используем для обращения к не подсчитанным барам. Например High[pos] вернёт максимальное значение цены на баре с индексом pos.
В теле цикла мы присваиваем переменной dHigh значение цены high на баре pos.
Аналогично, мы присваиваем переменной dLow значение цены low на баре pos.
Разницу dHigh – dLow мы присваиваем переменной dResult.
Затем Мы используем dResult для отрисовки линии индикатора, присваивая его значение соответствующему элементу массива ExtMapBuffer1[] (элементу с индексом pos).
Последняя строчка цикла – мы применяем оператор декремента к переменной цикла pos. Когда, pos станет = -1, цикл завершит свою работу.

Наконец-то мы можем скомпилировать наш индикатор!

Нажмите F5 или нажмите кнопку Компилировать.
В результате сгенерируется исполняемый файл "MyFirstIndicator.ex4″, который Вы можете запустить в своём терминале.
Чтобы это сделать нажмите F4 или вручную откройте терминал. В окне навигатора в терминале выберите раздел "Пользовательские Индикаторы", найдите MyFirstIndicator и перетащите его на график цены.

Замечание: Ваш индикатор показывает волатильность рынка.

MQL4 УРОК 12 – Ваш первый индикатор

Надеюсь, Вам понравился Ваш первый индикатор.
Готовьтесь к следующему уроку и к следующему шагу в мир практического MQL4 – Ваш первый Торговый Советник.

До скорых встреч!



Категория: Уроки по MQL4 | Добавил: Profit (19.12.2013)
Просмотров: 3502 | Теги: MQL4, mql4 codebase, mql4 скачать, mql4 com, учебник mql4, индикаторы mql4, функции mql4, программирование mql4, язык mql4, советник mql4 | Рейтинг: 5.0/1

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш выбор брокеров
forex4you roboforex форекс бесплатно заработать на форекс instaforex nordfx

Копирование
VPS для Форекс
vps сервер для форекс
Заработать на ФОРЕКС
памм инвестирование
Форекс обзор
<a href="http://instaforex.com/ru/" rel="nofollow">Форекс портал</a>
Наша кнопка
Установите нашу кнопку себе на сайт

Форекс советники

Торговые сессии
Котировки Sell/Buy
vps для форекс
Журнал
FOREX MAGAZINE
Форекс рассылки
FxMail.ru
Рекомендуемые Форекс рассылки
Форма входа
Статистика
vps для форекс сервер для форекс
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Торговля на финансовых рынках сопряжена с риском. Все материалы носят исключительно ознакомительный характер. Администрация сайта не несет ответственности за принимаемые Вами решения.
Copyright Profit © 2010 - 2017

Облако тегов: форекс для начинающих форекс для начинающих видео форекс для новичков форекс для тебя форекс для чайников форекс анализ технический анализ форекс прогноз форекс аналитика рейтинг форекс брокеров форекс видео брокеры форекс лучшие брокеры форекс надежный брокер форекс форекс брокеры отзывы самый лучший форекс брокер MQL4 Волновой форекс анализ и прогноз mql4 com Форекс аналитика от Trading Central трейдер VSA форекс вебинар бесплатные советники форекс советники форекс бесплатно vps для форекс форекс сервер советники форекс ПАММ памм счета стратегии форекс торговые стратегии форекс зaрaботaть нa форекс волновой анализ форекс волновой анализ волновой анализ рынка форекс волновой анализ рынка волновой анализ эллиотта волновой анализ элиота аналитика рынка форекс аналитика форекс аналитика форекс на каждый день форекс аналитика прогнозы trading central аналитика аналитика форекс на сегодня trading central заработок на форекс лучшие советники форекс vps форекс советники бесплатно Форекс советник аналитика форекс прогноз ежедневная форекс аналитика форекс новости аналитика советники форекс 2014 прибыльные советники форекс советники форекс скачать скачать советник форекс советники форекс 2015 советники форекс 2016 аналитика форекс евро форекс аналити лучшая аналитика форекс аналитика форекс евро доллар trading central отзывы прогнозы от trading central технический анализ форекс анализ рынка форекс фундаментальный анализ форекс Анализ Форекс нелинейный волновой анализ упрощенн волновой анализ эл волновой анализ eur usd теория волн технический анализ рынка прогноз рынка форекс прогноз форекс прогноз курса форекс прогноз доллара форекс аналитика форекс прогнозы прогноз форекс на сегодня прогноз евро форекс аналитика рынка аналитика евро форекс аналитика форекс евро дол прогноз аналитика форекс графический анализ форекс свечной анализ на форекс Фундаментальный анализ форекс на сегодня прогноз евро доллар форекс прогноз рынка форек прогноз форекс 2016 форекс прогноз евро технический анали технический анализ для начинающих технический анализ трейдеров евро доллар прогноз форекс прогноз форекс 2017