Какое счастье жить без индикаторных буферов!!! - страница 3

 
Prival >>:

Приведенный выше индикатор, неэкономичен ? он неправильно написан ? где там раз за разом пересчитываються бары ?

Если я правильно понимаю там 0 бар вообше не считаеться.

Rosh если вас не затруднит как бы вы написали индикатор (который приведен мною последним, вычитание машек).

Этот индикатор, его логику построения брал из учебника SK https://book.mql4.com/ru/samples/icustom просто вставил в те места где нужно свои расчеты, а оказывается, так нельзя ((

P/S/ Я уже несколько раз изучал, ваши уроки. Но видно способ мышления никак не могу переделать, никак я не могу с индикаторами подружиться

Я вот еще раз посмотрел на код, и написал как я это вижу на картинке.


 
Rosh >>:

Я вот еще раз посмотрел на код, и написал как я это вижу на картинке.

Что-то я прикинул, ниасиливаеццо...

Можно поподробней как цикл заменить на буферы?

Разве что iMaOnArray. Но честно говоря экономии времени не вижу, хоть убей.

 

откуда каждый тик ?

while(i>0)
если бы было >=. то да согласен, у меня там еще защита стоит, посмотрите пост, я его подправил, к сожалению не успел поправить как вы ответили. Извините если отвлекаю.
 
Prival >>:

откуда каждый тик ?

если бы было >=. то да согласен, у меня там еще защита стоит, посмотрите пост, я его подправил, к сожалению не успел поправить как вы ответили. Извините если отвлекаю.

Это легко проверить, добавим только одну строчку в код

int start()
  {
   int      i,Counted_bars,n;
   double   Ma_b,Ma_m,Sum_H,Sum_L;
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1) i=History-1;    // Если много баров то ... рассчитывать заданное колич.
   while(i>0)                       // Цикл по непосчитанным барам
     {
      //Прогноз минус оценка цены (текущая невязка)
      
      Print("i = ", i, ".  Посчитаем цикл");
      Ma_b=iCustom(NULL,0,"04_Kal",alf,bet,sig,Di,0,i);
      Ma_m=iCustom(NULL,0,"04_Kal",alf,bet,sig,Di,1,i);
      Buffer_0[i]=(Ma_m-Ma_b)/Point;             // Значение 0 буфера на i-ом баре
      
      //Cena-Cena
      Ma_b=iCustom(NULL,0,"04_Kal",alf,bet,sig,Di,0,i);
      Ma_m=iCustom(NULL,0,"04_Kal",alf,bet,sig,Di,0,i+1);
      Buffer_1[i]=(Ma_b-Ma_m)/Point;
      
      //
      Sum_H=0;                      // Обнуление в начале цикла
      Sum_L=0;                      // Обнуление в начале цикла
      for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений 
        {
         Sum_H=Sum_H + Buffer_0[n];     // Накопление суммы 
         Sum_L=Sum_L + Buffer_1[n];     // Накопление суммы 
        }
      Buffer_2[i]=Sum_H/Aver_Bars;     // Значение 2 буфера на i-ом баре
      Buffer_3[i]=Sum_L/Aver_Bars;     // Значение 3 буфера на i-ом баре
     
      i--;                          // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return(0);
  }

и запустим индикатор на фунтоЙене.


 
Rosh писал (а) >>

Это легко проверить, добавим только одну строчку в код

и запустим индикатор на фунтоЙене.

Это можно и не проверять, если документацию прочитать :)

-

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

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

-

Из замечания следует, что максимальное значение, возвращаемое функцией IndicatorCounted() -- Bars-1-1, т.е Bars-2 (т.к. нулевой бар на каждом новом тике не посчитан)

 

Я что должен не верить своим глазам ? Вот рисунок

Добавил в код рекомендуемые строчки. Вот код. Индикатор прилагаю.

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 1
#property  indicator_color1  Silver

int      History=5;
double   Buffer_0[];
datetime LastTime = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexStyle(0,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+Digits);
   SetIndexBuffer(0,Buffer_0);
   IndicatorShortName("Kaй-Kaй");
   SetIndexLabel(0,"Buffer_0");
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   int      i,Counted_bars,n;
   double   Ma_b,Ma_m,Sum_H,Sum_L;
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1) i=History-1;    // Если много баров то ... рассчитывать заданное колич.
   while(i>0)                       // Цикл по непосчитанным барам
     {
Print("TimeCurrent=",TimeToStr(TimeCurrent(),TIME_SECONDS)," Time[i]=",TimeToStr(Time[i],TIME_SECONDS), " i=",i, " Counted_bars=",Counted_bars);
      Ma_b=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);
      Ma_m=iMA(NULL,0,23,8,MODE_SMMA,PRICE_MEDIAN,i);

      Buffer_0[i]=(Ma_m-Ma_b)/Point; // Значение 0 буфера на i-ом баре
      i--;                           // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return(0);
  }
//+------------------------------------------------------------------+

Файлы:
bolvanka.mq4  2 kb
 
Prival писал (а) >>

Я что должен не верить своим глазам ? Вот рисунок

Добавил в код рекомендуемые строчки. Вот код. Индикатор прилагаю.

Хорошо, завтра посмотрю. Может я привел в своем посте один код, а запустил совсем другой. Я его комментировал, когда делал первый рисунок, мог так и запустить для второго рисунка.

 
Да, я вчера ошибся, Prival. Ваш индикатор не производит расчеты на каждый тик, а только по открытию нового бара. Меня, видимо, сбили с толку множественные выводы в лог о невозможности загрузить отсутствующий индикатор.
 

Rosh, а на мой пост среагируете?

 
Про этот?
Zhunko >>:

Всё таки, начало данных, номер...

Начало данных справа. Это логично воспринимается, потому, как бары начинаются с нуля.

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

Думаю, в документации уже ничего не будет меняться. Если даже это описание не кажется ясным сразу, то после некоторого опыта написания индикаторов приходишь к тому, что часто действительно необходимо скрыть начальные рассчитанные значения индикатора до того момента, как индикатор выйдет в "рабочий" режим. Тогда понимание этой функции сразу становится однозначным.

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