О пользовательских буферах - страница 4

 
Vinin:
Смысл?
Во всём есть свой скрытый смысл.:)))
 
AlexeyVik:
Во всём есть свой скрытый смысл.:)))

Ну да, ну да.

Чем то это кого-то напоминает. Ну любят они над собой по извращаться. Хотя дело хозяйское. И пристрастия у каждого свои.

 
Vinin:
Смысл?
Для начала надо тему прочитать.
 
Vinin:
Смысл?

Хотя бы потому, что такова примерно реализация и теже встроенных буферов терминала. По-другому не как не реализуется этот момент, кроме как освобождения последнего элемента таймсерии и добавления нового - пустого.

 

AlexeyVik:

Если поймёшь разницу между установкой значения пустой величины и инициализацией массива каким либо значением, может поймёшь свою ошибку. 

 Алексей, как Вы представляете себе установить пустую величину элементу таймсерии, которого нет ? Про это начался разговор в начале ветки, и Вы сказали, что это абсурд. Ну примерно так.. Я согласился.

Если данных нет, то как можно задать им умолчательное значение?

 

AlexeyVik:

Вот расчёты для твоего случая. Значение double занимает 8 байт. 1024 баров графика и соответственно количества ячеек буфера индикатора будут занимать всего 8 килобайт.

А какой такой глубокий смысл в изменении типа значений индикаторного буфера? Хочешь загнать туда шестнадцатиричное представление числа? Или цвета?

Хочешь иметь несколько последних значений ЗЗ заведи пользовательский массив и работай с ним.

 Нынче с памятью дефицита нет. Поэтому упор делается на удобство писанины (читания кода) и качество кода. Кстати, я ж не гонюсь за изменением типа индикаторного буфера. Интересно другое. Чтоб буфер имел все данные, необходимые для получения информации от индикатора. Если буферов несколько, то это причиняет неудобство. Но, опять-таки, кому-то это и не важно. Я ж не кого не заставляю.

Это тоже самое, что использовать IndicatorCounted(), который я у себя тоже убрал. А убрал потому, что хз какая там реализация. На выходе просчитаны все бары истории, и принтануть что там творится не возможно. Я реализовал этот момент иначе, и, теперь у меня просчитывается лишь столько баров, сколько мне нужно. Хоть милиард баров будет в терминале, просчитается лишь столько, сколько нужно. Я подчёркиваю.. везде главное удобство.

 Хотел посоветоватся как это все реализуется, и, возможно услышать другую точку зрения, а уже какую страницу наблюдаю вопросы типа Зачем? А это не нужно, Смысл? и.. всякое другое. Наверное, не стоило и начинать это обсуждение, если вариантов никто не прикидывает других. 

 
shanty:

 Алексей, как Вы представляете себе установить пустую величину элементу таймсерии, которого нет ? Про это начался разговор в начале ветки, и Вы сказали, что это абсурд. Ну примерно так.. Я согласился.

Если данных нет, то как можно задать им умолчательное значение?

Ещё раз пытаюсь объяснить.

В начале ты не уточнял или я не понял что разговор об индикаторном буфере, искать не буду, но помнится что ты говорил о массиве а не о буфере. Про пользовательский массив я повторю ещё раз, если размер не задан, то и инициализировать его каким либо значением нельзя...

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

И ещё раз повторяю "Если поймёшь разницу между установкой значения пустой величины и инициализацией массива каким либо значением, может поймёшь свою ошибку. "

 
AlexeyVik:

Ещё раз пытаюсь объяснить.

В начале ты не уточнял или я не понял что разговор об индикаторном буфере, искать не буду, но помнится что ты говорил о массиве а не о буфере. Про пользовательский массив я повторю ещё раз, если размер не задан, то и инициализировать его каким либо значением нельзя...

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

Касательно не возможности инициализации массива с неопределённой, а точнее не заданной длинны я согласен, в принципе. 

 

AlexeyVik:

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

 Алексей, я прекрасно понимаю, что значит свойство объекта. Не первый день пишу ). Но так же у меня есть некоторый опыт того, что гораздо эффективнее писать код, когда ты его понимаешь целиком и целиком же можешь контролировать. И, именно, по этой причине я периодически пишу собственные варианты даже стандартных реализаций. Кстати, о свойствах.. как ни крути, это та же инициализация пустым значением.Смотри сам: Пробегаем по длинные массива буфера, и присваиваем умолчательное значение EMPTY_VALUE каждому элементу таймсерии. Вот и будет каждый элемент таймсерии по всей протяжённости буфера иметь пустое значение, если его не изменить в процессе расчёта индикаторных данных.

  

AlexeyVik:

И ещё раз повторяю "Если поймёшь разницу между установкой значения пустой величины иинициализацией массива каким либо значением, может поймёшь свою ошибку. "

 Да я образно сказал про инициализацию значением. В данном случае, повторю,  имею ввиду инициализацию пустотой т.е. пустым значением (EMPTY_VALUE).

 

ВСЁ!!! Я больше не могу. Если ты не пытаешься понять то заставить тебя никто не сможет.

Вот такой код мог-бы и сам написать и понаблюдать что происходит

#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 clrGreen
#property indicator_width1 1
#property indicator_minimum -0.5
#property indicator_maximum 4.5

double Buff[];

/**************Custom indicator initialization function***************/
int OnInit()
{
 SetIndexStyle(0, DRAW_ARROW);
 SetIndexBuffer(0, Buff);
 SetIndexArrow(0, 167);
 SetIndexEmptyValue(0, 5);
 return(INIT_SUCCEEDED);
}/********************************************************************/

/*****************Custom indicator iteration function*****************/
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[])
{
 int i, limit = rates_total - prev_calculated;
  
   for(i = limit; i >= 0; i--)
    {
     if(i >= limit - 1) continue;
      Buff[i] = i%5;
    }
   return(rates_total);
}/********************************************************************/

Запусти, посмотри что показывает, потом поменяй число 5 в строке

SetIndexEmptyValue(0, 5);

на любое от 0 до 4 и посмотри что покажет индикатор.

Постарайся понять что в этом случае происходит не инициализация массива, а (не знаю можно-ли так выразится) подмена указанного значения на EMPTY_VALUE только в том случае когда в массив суют это указанное значение.

 
AlexeyVik:

Постарайся понять что в этом случае происходит не инициализация массива, а (не знаю можно-ли так выразится) подмена указанного значения на EMPTY_VALUE только в том случае когда в массив суют это указанное значение.

Уже понял. Благодарю за разъяснение. Хотя, мне подобный функционал не пригождался ещё ни разу.. Потому видимо я и не придал этому значение.
 
shanty:
Уже понял.
Ну и слава Богу.
Причина обращения: