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

 

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

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

Какие бывают индикаторы?

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

Это Скользящее Среднее (Moving Average, MA), часто используемый технический индикатор. Обратите внимание на следующие важные вещи:

  • индикатор рисуется в окне самого графика
  • индикатор выводит лишь один показатель
  • диапазон значений индикатора никак не ограничен и зависит от текущих цен
  • линия рисуется определенным цветом, толщиной и стилем (сплошная линия)

Author: Antoniuk Oleg

 
Moriarty:
Ошибочка:

Уровни - это вертикальные линии, которые рисуются индикатором определенным стилем, цветом и толщиной.


Да, согласен - уровни - горизонтальные уровни.
 
Пофиксено.
 
дауж, как я так ...
 
banderass писал(а):дауж, как я так ...

Мой вопрос наверное примитивный,но у меня тяжелые неувязки с функцией:IndicatorCounted-не доходит.

Если посмотреть какое значение она возвращает,к примеру в алерте,то это -1.

А это совсем не то что написано в статье "количество посчитанных индикатором баров".

И еще там говорится про какую-то функцию IndicatorBars() .Опечатка,наверное..

Если ответите-век не забуду!!

Гриша.

 

Тоже чего то не догнал...

Если - counted_bars=IndicatorCounted() - это число неизменённых баров (или посчитанных индикатором), то после повторного запуска start: IndicatorCounted() - а следовательно и counted_bars будет уже чему-то равно. Зачем тогда исполнять строку: if(counted_bars>0) counted_bars--; это же обнулит counted_bars и тогда: limit=Bars-counted_bars - то есть станет равен Bars. И индикатор по новой начнёт пересчитывать все бары??

Где я ошибаюсь, плз, подскажите.

P.S. (может и здесь подскажете?) я использую ДЕЛЕНИЕ на значение из предыдущего бара, при запуске индикатора появлялось деление на НОЛЬ, поэтому сейчас приходиться использовать такую конструкцию:

Counted_bars=IndicatorCounted();
if (Counted_bars==0)

i=Bars-Bars2-1;
while (i>=0)

{ ..... }

i--;

При появлении нового бара Counted_Bars уже не расматривается и i становится =0, в цикле while происходит только одна иттерация только для нового бара.

Может есть вариант попроще??

 
greg21:
banderass писал(а):дауж, как я так ...

Мой вопрос наверное примитивный,но у меня тяжелые неувязки с функцией:IndicatorCounted-не доходит.

Если посмотреть какое значение она возвращает,к примеру в алерте,то это -1.

А это совсем не то что написано в статье "количество посчитанных индикатором баров".

И еще там говорится про какую-то функцию IndicatorBars() .Опечатка,наверное..

Если ответите-век не забуду!!

Гриша.


автор забросил эту статью? а вопрос для новичков не "примитивный". И эти статьи читают и до сих пор...
 

Здравствуйте, помогите пожалуйста разобраться вот в этом:

  int counted_bars=IndicatorCounted(),
limit;

if(counted_bars>0)
counted_bars--;

limit=Bars-counted_bars;

for(int i=0;i<limit;i++)
-----------

if(counted_bars>0)
counted_bars--;

limit=Bars-counted_bars;

if(limit>barsToProcess)
limit=barsToProcess;

-----------
я запутался в этих конструкциях,  limit=Bars-counted_bars; это будет равно 2 или 1? а во второму случае зачем проверять условие и делать limit=barsToProcess; почему его сразу не присвоить без проверки условия? я пробовал, на индикаторе в данном случае отображается кривая за период barsToProcess а дальше на графике пусто, а как например работает Moving Average, у нее есть период, но прорисовывается от начала до конца?

Спасибо

 
Дело в том что индикаторы приведеные в примере пересчитывают 2 последних бара ...
 
Подскажите а как поменять размер стрелок, и цвет например?
 

а то ничего не видно на графике

Причина обращения: