Почему индикаторные буфера не инициализируются?

 

Обнаружил странность. Если в четверке буфера инициализировались значением, установленным с помощью SetIndexEmptyValue (по умолчанию, EMPTY_VALUE), то в пятерке почему-то аналогичный вызов PlotIndexSetDouble(index, PLOT_EMPTY_VALUE, 0); не приводит к заполнению элементов буфера указанным значением. На всякий случай попробовал делать вызов ArrayInitialize (хотя в 4-ке этого не требовалось) - не помогает. Если в элементы буфера явно не прописать чего-либо, там хранится какой-то мусор. Это у всех так или надо что-то еще вызвать, чтобы работало как в МТ4?

Заранее спасибо.

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
  • www.mql5.com
Пользовательские индикаторы / PlotIndexSetDouble - Документация по MQL5
 
Перечитайте справку по функции еще раз и внимательно.

 
тема до сих пор в топе =)
 
Rosh:
Перечитайте справку по функции еще раз и внимательно.

Я читал справку, чесслово. Но она большая, наверно, что-то пропустил. Вы можете ткнуть в конкретное место?

Переформулирую вопрос - как в МТ5 добиться инициализации буфера? Какой функцией воспользоваться?

 
marketeer:

Я читал справку, чесслово. Но она большая, наверно, что-то пропустил. Вы можете ткнуть в конкретное место?

Переформулирую вопрос - как в МТ5 добиться инициализации буфера? Какой функцией воспользоваться?

Если я не ошибаюсь, то правильно будет так

//+------------------------------------------------------------------+
void OnInit()
  {
//--- 
   PlotIndexSetDouble(DRAW_LINE,PLOT_EMPTY_VALUE,0.0);
//---
  }
//+------------------------------------------------------------------+
 

И все-таки непонятно, разве такой код не должен по умолчанию инициализировать индикаторный буфер atr значением DBL_MAX ?

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1 

double atr[];

//+-------------------------------------------------------------------------------------------------------------------+
//|                                                                                                                   |
//+-------------------------------------------------------------------------------------------------------------------+
void OnInit()
{
  SetIndexBuffer(0, atr, INDICATOR_DATA);
  PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
  ArraySetAsSeries(atr, true);
}


//+-------------------------------------------------------------------------------------------------------------------+
//|                                                                                                                   |
//+-------------------------------------------------------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[],
                const double &open[], const double &high[], const double &low[], const double &close[],
                const long &tick_volume[], const long &volume[], const int &spread[])
{
  ArraySetAsSeries(time, true);
  
  int needForCount = rates_total - prev_calculated;           // как правило, выдает 0-й или 1-й индекс свечи
  if(prev_calculated == 0 ) needForCount = rates_total - 1;   // кол-во баров при первом подсчете

  for(int i = needForCount; i >= 0; --i)
  {
    if(i == 0) Print(" time[0]=", time[0], " atr[0]=", atr[0]);
    
  }
  
  return(rates_total);
}

Почему-то у меня выходит инициализация нулями:


Пока выкручиваюсь прямым присваиванием на каждом тике нужным значением, но хотелось бы понять как задавать умолчательное значение для новых, появляющихся буферных индексов.

 
Vasiliy Pushkaryov:

И все-таки непонятно, разве такой код не должен по умолчанию инициализировать индикаторный буфер atr значением DBL_MAX ?

Почему-то у меня выходит инициализация нулями:

А где там инициализация ? Там ее нет. Там в OnInit() назначается пустое значение и устанавливается направление индексации.

Никаких инициализаций нет.

Буффер остается неинциализированным, даже нули - не факт, что они там должны быть.

Ты не "выкручиваешься прямым присваиванием", а "инициализируешь", как и положено. 

Что не так ?

 
George Merts:

А где там инициализация ? Там ее нет. Там в OnInit() назначается пустое значение и устанавливается направление индексации.

Никаких инициализаций нет.

Буффер остается неинциализированным, даже нули - не факт, что они там должны быть.

Ты не "выкручиваешься прямым присваиванием", а "инициализируешь", как и положено. 

Что не так ?

Если я напрямую присваиваю EMPTY_VALUE, выдается atr[0]=1.797693134862316e+308

В справке написано, что PlotIndexSetDouble() задает значение ... соответствующей линии.

Как тогда инициализировать буфер, чтобы он в дальнейшем инициализировал и новые ячейки заданными значениями по умолчанию?

 
Vasiliy Pushkaryov:

Как тогда инициализировать буфер, чтобы он в дальнейшем инициализировал и новые ячейки заданными значениями по умолчанию?

Первый раз инициализация на всей истории (когда prev_calculated = 0 через ArrayInitialize()), в дальнейшем - когда образуется новый бар - его инициализируете начальным значением. И проблем не будет.
 
Alexey Kozitsyn:
Первый раз инициализация на всей истории (когда prev_calculated = 0 через ArrayInitialize()), в дальнейшем - когда образуется новый бар - его инициализируете начальным значением. И проблем не будет.

Конечно можно все вручную самому делать.
Может чтобы более наглядным было. Код, который предоставлял выше перенес в четверку (во вложении). Единственное заменил PlotIndexSetDouble() на SetIndexEmptyValue().

И ячейка содержит нужный мне EMPTY_VALUE:


Как в МТ5 сделать, чтобы точно также работало, а не нули выдавал?

Файлы:
 
Vasiliy Pushkaryov:

Это понятно, что можно все вручную самому делать.
Код, который был выше перенес в четверку (во вложении). Единственное заменил PlotIndexSetDouble() на SetIndexEmptyValue().

И ячейка содержит нужный мне EMPTY_VALUE:


Как в МТ5 сделать, чтобы точно также работало, а не нули выдавал?

if( prev_calculated <= 0 )
   ArrayInitialize( buf, EMPTY_VALUE );
else if( rates_total > prev_calculated )
   buf[ rates_total-1 ] = EMPTY_VALUE;