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

 

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

За это время ни чего не изменилось. Они такие же странные или справку всё ни, как не перепишут.

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

Понимаю это до сих пор буквально:

#property indicator_separate_window
#property indicator_buffers 2
//----
extern color ColorValue = Red;
//----
double glArBufInd1[];
double glArBufInd2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init()
 {// Для буфера развёртки по вертикали.
  SetIndexBuffer     (0, glArBufInd1);
  SetIndexEmptyValue (0, EMPTY_VALUE);
  SetIndexLabel      (0, "VERTICAL SWEEP");
  SetIndexStyle      (0, DRAW_NONE, EMPTY, EMPTY, CLR_NONE);
  // Для буфера вызова свойств индикатора.
  SetIndexArrow      (1, 253);
  SetIndexBuffer     (1, glArBufInd2);
  SetIndexDrawBegin  (1, 0);
  SetIndexLabel      (1, "PROPERTY");
  SetIndexStyle      (1, DRAW_ARROW, EMPTY, 5, ColorValue);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start()
 {
  glArBufInd1[0] = 1;
  glArBufInd1[1] = -1;
  glArBufInd2[0] = 0;
  SetIndexShift (1, 5);
  // Установка порядкового номера бара от начала данных,
  // с которого должна начинаться отрисовка указанной линии индикатора.
  // Отрисовка индикатора производится слева направо. Значения индикаторного массива,
  // находящиеся левее указанного бара, не будут рисоваться на графике
  // и отображаться в окне DataWindow. По умолчанию устанавливается значение 0. 
  SetIndexDrawBegin (1, 0);
 }
//+------------------------------------------------------------------+

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

Это так и должно быть?

Метаквоты отзовитесь!

 
Zhunko >>:

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

Это так и должно быть?

Так, а в чем проблема то со справкой? С формированием нового бара буфер индикатора должен увеличиваться на один элемент. Иначе как индикатор будет отображать новые данные?

Если этот подход не устраивает, объявляйте свой массив, а уж из него рисуйте, что хотите. Причем количество таких массивов будет ограничено только оперативной памятью.

 
Scriptong >>:

Так, а в чем проблема то со справкой? С формированием нового бара буфер индикатора должен увеличиваться на один элемент. Иначе как индикатор будет отображать новые данные?

Если этот подход не устраивает, объявляйте свой массив, а уж из него рисуйте, что хотите. Причем количество таких массивов будет ограничено только оперативной памятью.

Проблема Вами не понята. Эта функция управляет индикаторным буфером, а не массивом:

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

Если номер бара установлен нулевым, то и отбражаться должен только один нулевой бар. Без зависимости от новых данных. Это написано в справке. Почитайте. Уже три раза одно и тоже процитировал.

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

Мне нужен только один элемент индикаторного буфера для быстрого вызова свойств индикатора.

 
Zhunko писал (а) >>

Мне нужен только один элемент индикаторного буфера для быстрого вызова свойств индикатора.

Я в аналогичных ситуациях просто обнуляю значение, уходящее из нужного мне окна отрисовки. В данном случае что-то вроде
glArBufInd2[1] = EMPTY_VALUE;
 
Zhunko >>:

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

За это время ни чего не изменилось. Они такие же странные или справку всё ни, как не перепишут.

Понимаю это до сих пор буквально:

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

Это так и должно быть?

Метаквоты отзовитесь!



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

 
Rosh писал(а) >>

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

Не работает у меня что то эта функция.

Что с ней, что без неё - SetIndexDrawBegin(0,30);

Картинка не меняется

 
Prival >>:

Не работает у меня что то эта функция.

Что с ней, что без неё - SetIndexDrawBegin(0,30);

Картинка не меняется

Может Вы не тма смотрите, на вашей картинке хорошо видно, что индикатор на первых 30 барах не отрисован.

 

Нет Вы ошибаетесь.

Выкладываю рисунок индикаторы Кай-Кай отличаються только наличием вот этих строк

   SetIndexDrawBegin(0,50);
   SetIndexDrawBegin(1,50);
   SetIndexDrawBegin(2,50);
   SetIndexDrawBegin(4,50);
Файлы:
 
Prival >>:

Нет Вы ошибаетесь.

Выкладываю рисунок индикаторы Кай-Кай отличаються только наличием вот этих строк

Мне кажется, Вы не прочитали, то что я написал. Из Вашего рисунка я не вижу, что функция не работает.


 

Я наверноре что то не так делаю, т.к. не понимаю. Там есть переменная хистори в индикаторе =100. И индикатор начинает рисоваться и считаться на 100 последних барах (на рисунке это видно верхний кай-кай). Я ввожу в индикатор команду SetIndexDrawBegin(0,50);, переименовываю его и бросаю на график, т.е. он должен считаться с 100 бара, а рисоваться на половину меньше. Может както коряво пояснаю. Индикатор я приложил посмотрите его пожалуйста, я наверное что то не так там делаю.

Мне нужно что бы он считал, но несколько баров, те что самые левые (начало отрисовки) не рисовал

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