Перечитайте справку по функции еще раз и внимательно.
Я читал справку, чесслово. Но она большая, наверно, что-то пропустил. Вы можете ткнуть в конкретное место?
Переформулирую вопрос - как в МТ5 добиться инициализации буфера? Какой функцией воспользоваться?
Я читал справку, чесслово. Но она большая, наверно, что-то пропустил. Вы можете ткнуть в конкретное место?
Переформулирую вопрос - как в МТ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); }
Почему-то у меня выходит инициализация нулями:
Пока выкручиваюсь прямым присваиванием на каждом тике нужным значением, но хотелось бы понять как задавать умолчательное значение для новых, появляющихся буферных индексов.
И все-таки непонятно, разве такой код не должен по умолчанию инициализировать индикаторный буфер atr значением DBL_MAX ?
Почему-то у меня выходит инициализация нулями:
А где там инициализация ? Там ее нет. Там в OnInit() назначается пустое значение и устанавливается направление индексации.
Никаких инициализаций нет.
Буффер остается неинциализированным, даже нули - не факт, что они там должны быть.
Ты не "выкручиваешься прямым присваиванием", а "инициализируешь", как и положено.
Что не так ?
А где там инициализация ? Там ее нет. Там в OnInit() назначается пустое значение и устанавливается направление индексации.
Никаких инициализаций нет.
Буффер остается неинциализированным, даже нули - не факт, что они там должны быть.
Ты не "выкручиваешься прямым присваиванием", а "инициализируешь", как и положено.
Что не так ?
Если я напрямую присваиваю EMPTY_VALUE, выдается atr[0]=1.797693134862316e+308
В справке написано, что PlotIndexSetDouble() задает значение ... соответствующей линии.
Как тогда инициализировать буфер, чтобы он в дальнейшем инициализировал и новые ячейки заданными значениями по умолчанию?
Как тогда инициализировать буфер, чтобы он в дальнейшем инициализировал и новые ячейки заданными значениями по умолчанию?
Первый раз инициализация на всей истории (когда prev_calculated = 0 через ArrayInitialize()), в дальнейшем - когда образуется новый бар - его инициализируете начальным значением. И проблем не будет.
Конечно можно все вручную самому делать.
Может чтобы более наглядным было. Код, который предоставлял выше перенес в четверку (во вложении). Единственное заменил PlotIndexSetDouble() на SetIndexEmptyValue().
И ячейка содержит нужный мне EMPTY_VALUE:
Как в МТ5 сделать, чтобы точно также работало, а не нули выдавал?
Это понятно, что можно все вручную самому делать.
Код, который был выше перенес в четверку (во вложении). Единственное заменил 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;

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