Примеры: Язык MQL4 для "чайников". Пользовательские индикаторы (часть 2)

 

New article Язык MQL4 для "чайников". Пользовательские индикаторы (часть 2) has been published:

Это пятая статья из цикла "Язык MQL4 для 'чайников'". Сегодня мы научимся использовать графические объекты - очень мощное средство разработки, которое позволяет существенно расширить возможности индикаторов. Кроме того, вы можете использовать их также в скриптах и советниках. Мы узнаем как создавать объекты, изменять их параметры, проверять ошибки. Конечно, мне не удастся описать полностью все объекты, их слишком много. Но вы получите все необходимые знания, чтобы разобраться в этом самостоятельно. Также в этой статье содержится пошаговое руководство-пример по созданию сложного сигнального индикатора. При этом, многие параметры будут доступны пользователю для настройки, что позволит гибко изменять внешний вид.

Что такое графические объекты?

Вы часто сталкиваетесь с ними, когда работаете в терминале Meta Trader 4. Вы можете использовать графические объекты для совершенно разных целей. Трейдеры расставляют уровни поддержки и сопротивления, точки разворота, уровни Фибоначчи и многое другое. Давайте посмотрим на простой пример использования объектов:

На этот график было добавлено 4 графических объекта:

  • 2 горизонтальные линии
  • текстовый объект
  • объект-символ (стрелка)

Сегодня мы научимся добавлять такие объекты с помощью MQL4. Представьте себе, сколько рутинных действий вы можете автоматизировать, используя объекты! Например, вам когда-нибудь приходилось рассчитывать точку разворота, уровни поддержки и сопротивления, а потом вручную их рисовать? Да, работы там немного, но автоматизировав этот процесс на MQL4, терминал сам все рассчитает и нарисует соответствующие уровни. Все что вам нужно будет сделать – это дважды кликнуть по названию скрипта, чтобы все сделали за вас. Кроме того, используя графические объекты, можно писать очень полезные сигнальные индикаторы.

Author: Antoniuk Oleg

 
Спасибо. Большое огромное СПАСИБО
 
Присоединяюсь к благодарностям.
Это действительно статьи для такого чайника как я.
Благодаря им я уже смог написать несколько скриптов и индикаторов которые реально работают.
Хотелось бы чтобы автор разъяснил еще как скриптом можно открывать ордер, а также как скриптом закрывать ордер и сразу-же чтобы
открывался в обратную сторону.
СПАСИБО еще раз.
 
Cпасибо! Но, вот вопрос, как нарисовать в MQL4 отрезок линии не используя Rectangle или элементы Wingdings?
 
Dedka:
Cпасибо! Но, вот вопрос, как нарисовать в MQL4 отрезок линии не используя
Rectangle или элементы Wingdings?
Нужно использовать объект типа OBJ_TREND (трендовая линия) и установить свойство OBJPROP_RAY в false. Тогда будет рисоваться обычный отрезок. Например:
// это скрипт
int start()
{
   ObjectCreate("niceLine",OBJ_TREND,0,Time[0],High[0],Time[25],Low[25]);
   ObjectSet("niceLine",OBJPROP_RAY,false);
   return(0);
}
 
banderass:
Нужно использовать объект типа OBJ_TREND (трендовая линия) и установить свойство OBJPROP_RAY в false. Тогда будет рисоваться обычный отрезок.

Спасибо! Сейчас попробую.
 
Dedka:
Спасибо! Сейчас попробую.

Все работает в лучшем виде! Спасибо!
"Век живи - век учись ..."
И еще вопрос: почему не раборает конструкция 
 SetIndexStyle(2,DRAW_LINE,STYLE_DOT,1,CLR_NONE);?
 

Олег, большое спасибо за очередную просветительскую статью! Прочитав ее, я даже решил переделать один из своих индикаторов. При этом одна вещь в статье и приложенных индикаторах мне решительно не понравилась. Я имею в виду завершение индикаторов функцией ObjectsDeleteAll(). С одной стороны мне, новичку, это понятно. С другой стороны, убирая такой индикатор со своего графика или перезапуская его с новыми параметрами, пользователь автоматически удаляет все графические объекты с графика, в том числе не относящиеся к нашему индикатору. Некоторые из этих графических объектов могут быть очень нужны пользователю. Нужно или радикально переделать функцию deinit(), или в статье сделать комментарий, что в реальной жизни нужно удалять графические объекты более избирательно. Есть проблема, но все равно я благодарен вам за ваш тяжкий труд просвещения.

 
Martes:

Олег, большое спасибо за очередную просветительскую статью! Прочитав ее, я даже решил переделать один из своих индикаторов. При этом одна вещь в статье и приложенных индикаторах мне решительно не понравилась. Я имею в виду завершение индикаторов функцией ObjectsDeleteAll(). С одной стороны мне, новичку, это понятно. С другой стороны, убирая такой индикатор со своего графика или перезапуская его с новыми параметрами, пользователь автоматически удаляет все графические объекты с графика, в том числе не относящиеся к нашему индикатору. Некоторые из этих графических объектов могут быть очень нужны пользователю. Нужно или радикально переделать функцию deinit(), или в статье сделать комментарий, что в реальной жизни нужно удалять графические объекты более избирательно. Есть проблема, но все равно я благодарен вам за ваш тяжкий труд просвещения.

Спасибо за замечание. Написать функцию deinit(), которая бы удаляла только объекты самого индикатора просто. Для этого нужно воспользоваться функцией ObjectDelete(), которая удаляет объект по его названию. При этом все удаления нужно выполнять в цикле, как и при создании объектов.
int deinit()
{
   // удаляем таблицу сигналов
   for(int x=0;x<9;x++)
      for(int y=0;y<3;y++)
         ObjectDelete("signal"+x+y);
  
  // удаляем названия таймфреймов    
  for(x=0;x<9;x++)
      ObjectDelete("textPeriod"+x);   
  
  // удаляем названия индикаторов 
  for(y=0;y<3;y++)
      ObjectDelete("textSignal"+y);   
 
   return(0);
}
Теперь индикатор будет удалять только "свои" объекты.

Dedka:
Dedka:
Спасибо! Сейчас попробую.

Все работает в лучшем виде! Спасибо!
"Век живи - век учись ..."
И еще вопрос: почему не раборает конструкция
SetIndexStyle(2,DRAW_LINE,STYLE_DOT,1,CLR_NONE);?

Можете детальнее уточнить проблему?
 

Спасибо за труд! Очень полезен для начинающих. Но у меня один вопрос возник, как быть с индикаторами, которым нельзя поставить математическое условие? К примеру AO и AC. Там имеет значение какого цвета текущий индикатор, то есть необходимо ставить условие на цвет. Я буду очень признателен, если Вы поможете, каким образом MQL проверят условие цвета текущего индикатора. Заранее Благодарен.

 
Sowulo:

Спасибо за труд! Очень полезен для начинающих. Но у меня один
вопрос возник, как быть с индикаторами, которым нельзя поставить
математическое условие? К примеру AO и AC. Там имеет значение какого
цвета текущий индикатор, то есть необходимо ставить условие
на цвет. Я буду очень признателен, если Вы поможете, каким образом
MQL проверят условие цвета текущего индикатора. Заранее Благодарен.

Узнать какой цвет очень просто. Если значение индикатора текущего бара больше чем значение индикатора предидущего бара, то рисуется зеленый цвет. И наоборот.
   if(iAO(NULL,0,0)>iAO(NULL,0,1))
      // последний столбик зеленый
Причина обращения: