Рекомендуемый ДЦ - Alpari !

На прошлом уроке по изучению языка MQL4 мы научились использовать индикаторы Forex в своих советниках для MT4. Но сразу возникает вопрос: «А как быть, если мы не нашли необходимого нам индикатора?» - Конечно же мы его можем написать сами на языке MQL4.

Поэтому на сегодняшнем уроке мы будем изучать: "Как создать свой индикатор для MT4".

Возьмем для примера «Стратегию форекс на внутреннем Баре». Прочитав данную стратегию — мы понимаем что нам не хватает подсветки этого самого "внутреннего бара".

Давайте исправим эту ситуацию, написав свой индикатор форекс.

Запускаем мастер создания советников в MetaEditor:

Мастер создания индикаторов

Назовем наш создаваемый индикатор форекс - "inBar" и добавим параметр для изменения цвета подсветки:

Параметры индикатора

Следующее окно оставим без изменений:

Назначение буферов вывода

После нажатия кнопочки «Готово» получим пустой шаблон индикатора для Metatrader4:

//±-----------------------------------------------------------------+
//| inBar.mq4 |
//| Copyright © 2010. |
//| http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright © 2010."
#property link "http://mql4you.ru"
#property indicator_chart_window
extern color BoxColor=Red;
//±-----------------------------------------------------------------+
int init() {return(0);}
//±-----------------------------------------------------------------+
int deinit() {return(0);}
//±-----------------------------------------------------------------+
int start()
{int counted_bars=IndicatorCounted();
return(0);}
//±-----------------------------------------------------------------+ 

Я снова удалил лишнии комментарии для наглядности. Теперь читаем определение "внутреннего бара":

Внутренний бар — это свеча, в которой высшая и низшая точки расположены в пределах предыдущей свечи и не выступают за ее границы.

Отсюда делаем вывод: необходимо анализировать 2 свечи. Причем High предыдущей свечи должен быть больше High следующей и Low предыдущей должен быть меньше Low следующей.

В MQL индексы свечей идут в обратном порядке (0 — это последяя свеча, 1 — предыдущяя и т.д.). Запишем условие:

if(High[i]<High[i+1] && Low[i]>Low[i+1])

Теперь необходимо в цикле перебрать все свечи и подсветить удовлетворяющие условию:

for(int i=0; i<limit; i++)
if(High[i]<High[i+1] && Low[i]>Low[i+1])
{string name="inBar"+TimeToStr(Time[i]);
ObjectDelete(name);
ObjectCreate(name,OBJ_RECTANGLE,0,Time[i],High[i+1],Time[i+1],Low[i+1]);
ObjectSet(name,OBJPROP_BACK,true);
ObjectSet(name,OBJPROP_COLOR,BoxColor);}

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

ObjectSet(name,OBJPROP_BACK,true);

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

Осталось прояснить — сколько свечей нам надо проанализировать. Ведь индикатор перерисовывается при каждом тике (поступлении котировки). И если мы будем анализировать всю историю котировок каждый раз — компьютер станет очень сильно тормозить.

Разработчики позаботились и об этой проблеме. В языке MQL существует функция IndicatorCounted() которая возвращает количество баров, не измененных после последнего вызова индикатора. Отняв от общего количества баров (Bars) количество баров не измененных после последнего вызова индикатора получим количество измененных. Но нам надо анализировать 2 свечи. Поэтому добавим условие:

if(counted_bars>0) counted_bars-- ;

Если нет не измененных баров — анализируем все. А если хоть один бар изменится (изменяется только последний бар), то проанализируем на 1 бар больше.

Наша функция start() приобретает следующий вид:

int start()
{int limit;
int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars-- ;
limit=Bars-counted_bars;
for(int i=0; i<limit; i++)
if(High[i]<High[i+1] && Low[i]>Low[i+1])
{string name="inBar"+TimeToStr(Time[i]);
ObjectDelete(name);
ObjectCreate(name,OBJ_RECTANGLE,0,Time[i],High[i+1],Time[i+1],Low[i+1]);
ObjectSet(name,OBJPROP_BACK,true);
ObjectSet(name,OBJPROP_COLOR,BoxColor);}
return(0);}

Компилируем и присоединяем наш индикатор для Metatrader 4 "inbar" к графику:

График с индикатором

Мы добились чего хотели. Внутренние бары индикатор для нас подсвечивает. Но при удалении индикатора с графика — подсветка остается — Непорядок...

Это может нам помешать при работе с другими индикаторами. Для исправления данной ситуации можно просто удалить все нарисованные прямоугольники: ObjectsDeleteAll(0,OBJ_RECTANGLE) в функции деинициализации deinit().

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

Поэтому мы используем другой метод: будем удалять только те прямоугольники — которые сами нарисовали. Они имеют у нас уникальное имя с постоянной частью: string name="inBar"+TimeToStr(Time[i]);

Вот по этой части и будем их находить и удалять:

int deinit()
{for(int i=ObjectsTotal() −1;i>=0;i--)
{string name=ObjectName(i);
if(StringFind(name,"inBar")==0) ObjectDelete(name);}
return(0);}

Теперь можно работать с нашим индикатором не боясь что-то испортить.

 

Скачать: Индикатор форекс «InBar»