How to code an indicator properly - страница 2

 
Roman #:
После авто-ресайза массива в последний индекс буфера кладётся крайнее его актуальное значение!
Затем выход из функции и передача управления.
Какой может быть мусор в новом последнем элементе?
Это явная ошибка поведения. 

Красным - никогда так не было.

Нет актуального значения для нового элемента вашего индикаторного буфера! Неоткуда системе его взять.

Новый элемент непроинициализирован ничем, пока ваш код это не сделает. В МТ5 всегда так было. В МТ4 заполнялось нулем.

 
Stanislav Korotky #:

Нет актуального значения для нового элемента вашего индикаторного буфера! Неоткуда системе его взять.

Новый элемент непроинициализирован ничем, пока ваш код это не сделает. В МТ5 всегда так было. В МТ4 заполнялось нулем.

У него не в этом проблема. Он просто не видит, что при увеличении индикаторного буфера происходит сдвиг не на один элемент, а на два.
 
Aleksandr Slavskii #:
У него не в этом проблема. Он просто не видит, что при увеличении индикаторного буфера происходит сдвиг не на один элемент, а на два.
Проблема его понятна, но не ему самому ;-) - система двигает буфер при появлении нового бара, и он сам двигает на каждом тике, даже если бар новый для этого тика только что был создан - я в самом первом своем посте сказал, что нужно делать проверку на новый бар и тогда не делать ArrayCopy. А про пустоту в новом элементе - уже нечего добавить - он пустой по определению. Точка.
 
Stanislav Korotky #:

Красным - никогда так не было.

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[])
{
   //сдвиг
   ArrayCopy(buff, buff, 0, 1, rates_total-1);
   
   //вставка последнего значения
   buff[rates_total-1] = SymbolInfoDouble(_Symbol, SYMBOL_BID);
 

   return(rates_total);
}
Жёлтым выделил крайний индекс, по идее уже аллоцированного на +1 буфера в момент нового бара, куда кладётся актуальное значение!
Почему система этого не понимает?
Потому, что ошибка в поведении к которой вы приспособились!
И выдаёте это, что так было всегда. НЕТ не было так всегда, это появилось несколько лет назад, и все схавали.
 
Aleksandr Slavskii #:
У него не в этом проблема. Он просто не видит, что при увеличении индикаторного буфера происходит сдвиг не на один элемент, а на два.
А вот собственно, почему на два элемента сдвиг, вас не смущает такое поведение?
И вы это считаете нормальным? Просто приспособились к кривизне.
 
Roman #:
А вот собственно, почему на два элемента сдвиг, вас не смущает такое поведение?
И вы это считаете нормальным? Просто приспособились к кривизне.
Потому, что на один элемент сдвигает Ваш код при каждом тике. Но при новом баре МТ сам сдвигает на количество добавленных баров (обычно добавляется 1 бар).
 
Sergey Gridnev #:
Потому, что на один элемент сдвигает Ваш код при каждом тике. Но при новом баре МТ сам сдвигает на количество добавленных баров (обычно добавляется 1 бар).

Я вижу полное непонимание проблемы индикаторного буфера.

Запустите тогда в таком виде, может дойдёт, что на первом запуске ничего не будет отрисовываться.
Значения в левом верхнем углу подокна изменяются, а отрисовки нет.
Начнёт отрисовываться только с приходом нового бара.
Речь не за пользовательский сдвиг, а за буферный!

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[])
{
   //вставка последнего значения
   buff[rates_total-1] = SymbolInfoDouble(_Symbol, SYMBOL_BID);
 

   return(rates_total);
}
 
Roman #:
Запустите тогда в таком виде, может дойдёт, что на первом запуске ничего не будет отрисовываться.
Значения в левом верхнем углу подокна изменяются, а отрисовки нет.
Начнёт отрисовываться только с приходом нового бара.
Чтобы нарисовать линию нужно 2 точки. Одной мало. Попробуйте стрелку вместо линии.
 
Vladislav Boyko #:
Чтобы нарисовать линию нужно 2 точки. Одной мало. Попробуйте стрелку вместо линии.
Первая точка, присваиваем значение переданное в буфер в момент старта, вторая точка - последующие изменения значения.
В чём сложность такой реализации? Вроде профессионалы, а на таком пустяке спотыкаетесь.
Ведь раньше не было таких проблем, не со сдвигом буфера, не с начальной отрисовкой.
 
Комментарии, не относящиеся к этой теме, были перенесены в "Как по Вашему, какой ИИ лучше для кодинга на MQL4/5? (Можно выбрать несколько)".