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

 
bstone писал(а) >>
Prival, тут все правильно объяснили. Речь идет о первых барах цены, а не первых барах, на которых появляются значения вашего индикатора. Чтобы получить нужный вам эффект, вам нужно пересчитывать начальный индекс бара. Т.е. в вашем случае он будет не 50, а 50+N, где N - индекс бара, на котором ваш индикатор начинает выдавать что-то осмысленное (т.е. видимое на графике).

Вставил SetIndexDrawBegin(0,History+50);

эффект тодже. Рисует с 100 бара. Счас постараюсь упростить индикатор, и выложить. Поправте его так что бы он делал то что нужно.

 

вот индикатор. Наличие или отсутсвие в нем команды SetIndexDrawBegin(0,50); никаким образом не влияет на отрисовку.

Что я делаю не так?

//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 1
#property  indicator_color1  Silver

//extern  
int    History=100;
double     Buffer_0[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+Digits);
//---- indicator buffers mapping
   SetIndexBuffer(0,Buffer_0);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Kaй-Kaй");
   SetIndexLabel(0,"Buffer_0");
   SetIndexDrawBegin(0,50);
//---- initialization done
   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)                       // Цикл по непосчитанным барам
     {
      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);
  }
//+------------------------------------------------------------------+
 
Prival >>:

Индикатор я приложил посмотрите его пожалуйста, я наверное что то не так там делаю.


Индикатор - не очень, четно говоря. Кроме того, он использует в своих расчетах какой-то другой индикатор 04_Kal.

 
Prival >>:

вот индикатор. Наличие или отсутсвие в нем команды SetIndexDrawBegin(0,50); никаким образом не влияет на отрисовку.

Что я делаю не так?

так

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+Digits);
//---- indicator buffers mapping
   SetIndexBuffer(0,Buffer_0);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Kaй-Kaй");
   SetIndexLabel(0,"Buffer_0");
   SetIndexDrawBegin(0,(Bars-History) +50);
//---- initialization done
   return(0);
 
Rosh >>:

Функция SetIndexDrawBegin() необходима для подавления вывода первых N значений индексного массива. Например, Вы рассчитываете сложную сглаженную, и индикатор начнет правильно отрисовывать свои значения только через 30 баров с начальной точки, тогда объявите SetIndexDrawBegin(номер_индекса, 30). Тогда первые тридацать значений будут корректно вычислены и сохранены в индикаторном буфере, но отображаться не будут.

Т.е. приход нового бара увеличивает историю на один бар и, стало быть, количество неотображаемых баров при этом не изменилось. Они же слева.

Понятно. Только это надо в справке написать. Про динамику этого явления сразу не поймёшь.

 

Спасибо Всем за помощь.

Если бы в хелпе (в примерах) была вот такая строчка

SetIndexDrawBegin(0,(Bars-History) +50);

былобы сразу понятнее.

 
Prival >>:

Спасибо Всем за помощь.

Если бы в хелпе (в примерах) была вот такая строчка

SetIndexDrawBegin(0,(Bars-History) +50);

былобы сразу понятнее.

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


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

 
lna01 >>:
Я в аналогичных ситуациях просто обнуляю значение, уходящее из нужного мне окна отрисовки. В данном случае что-то вроде

Спасибо!

Это работает.

 

void SetIndexDrawBegin( int index, int begin) 
// Установка порядкового номера бара от начала данных, с которого должна начинаться отрисовка указанной линии индикатора.
// Отрисовка индикатора производится слева направо. Значения индикаторного массива, находящиеся левее указанного бара,
// не будут рисоваться на графике и отображаться в окне DataWindow. По умолчанию устанавливается значение 0.

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

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

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

 
Rosh писал(а) >>

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

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

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

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

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

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

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

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

int      History=100;
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");
   SetIndexDrawBegin(0,(Bars-History) +50);
   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)                       // Цикл по непосчитанным барам
     {
      if (LastTime > =Time[i]) return;  //защита от дурных баров
      LastTime = Time[i];

      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);
  }
//+------------------------------------------------------------------+