Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Victor Demihov
618
Victor Demihov  

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

В общем-то появилось несколько вопросов, о которых я раньше не задумывался. Обычно, в индикаторах в функции OnInit() инициализируют каждый массив-буфер. Хотя, объявляется данный массив, как правило, без задания размера оного, например:

double   ZZPrice[];
datetime ZZTime[];

 Так вопрос первый в том, что если нет чёткой длинны, то какой резон данный буфер-массив инициализировать нулём или пустым значением? Ведь по сути инициализациях некоторого диапазона данных некоторым значением, есть заполнение диапазона данных неким значением. Например:

int ZZTimeBuf[100];

void Initialize (int& fi_Array[],        // Переданный массив для инициализации значением fi_Value
                 int& fi_CountElements,  // Количество элементов в массиве, который требуется инициализировать
                 int& fi_Value)          // Значение, которым будем инициализировать переданный массив
{
   for (int i = 0; i <= fi_CountElements; i++)
   {
      fi_Array[i] = fi_Value;
   }
}

 В данном случае всё логично, а какой резон инициализировать массив, количество элементов в котором не ведомо?

Alexey Viktorov
8017
Alexey Viktorov  

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

ArrayFill()

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

void  ArrayFill(
   void&  array[],       // массив
   int    start,         // индекс начального элемента
   int    count,         // количество элементов
   void   value          // значение, которым заполняется массив
   );


А про индикаторный буфер вообще ничего не понятно. Кто и где инициализирует нулём индикаторный буфер?

Конечно мысль попользовать массив структур в качестве индикаторного буфера интересна, но на столько сомнительна...

Алексей Тарабанов
7314
Алексей Тарабанов  
Пока не окончилась работа init, никаких индикаторных буферов не существует. Осознайте это. 
Victor Demihov
618
Victor Demihov  
AlexeyVik:

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

ArrayFill()

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

Алексей, а разница то какая? Функция ArrayFill() тоже самое, что я по ходу придумал когда писал свой вопрос. Разница лишь в том, что в ArrayFill() имеется множество перегрузок и она универсальна. И не более того. А я изобразил, как это выглядит изнутри в плане одной перегрузки и всё... Где тут тупость то? :)

Идём дальше.. На самом деле, у меня буферы инициализируются не в ИНИТЕ. А написал я так сверху неподумав. Но это сути вопроса не меняется. Возьмём, например, стандартный индикатор ZigZag. В нём имеется функция InitializeAll().

int InitializeAll()
{
   ArrayInitialize(ExtZigzagBuffer,0.0);
   ArrayInitialize(ExtHighBuffer,0.0);
   ArrayInitialize(ExtLowBuffer,0.0);
//--- first counting position
   return(Bars-InpDepth);
}

 Размер данным инициализируемым буферам не задаётся да момента их инициализации. Тогда какой резон их инициализировать? Я не представляю реализацию подобного алгоритма инициализации массива у которого нет чёткой длинны ! 

. ... Rick D. ... .
1176
. ... Rick D. ... .  
Может по вызову InitializeAll какая-то отложенная инициализация идет?
Alexey Viktorov
8017
Alexey Viktorov  
shanty:

Алексей, а разница то какая? Функция ArrayFill() тоже самое, что я по ходу придумал когда писал свой вопрос. Разница лишь в том, что в ArrayFill() имеется множество перегрузок и она универсальна. И не более того. А я изобразил, как это выглядит изнутри в плане одной перегрузки и всё... Где тут тупость то? :)

Идём дальше.. На самом деле, у меня буферы инициализируются не в ИНИТЕ. А написал я так сверху неподумав. Но это сути вопроса не меняется. Возьмём, например, стандартный индикатор ZigZag. В нём имеется функция InitializeAll().

 Размер данным инициализируемым буферам не задаётся да момента их инициализации. Тогда какой резон их инициализировать? Я не представляю реализацию подобного алгоритма инициализации массива у которого нет чёткой длинны ! 

Разница вот такая



И чушь это далеко не всегда тупость.

Я никогда не смотрел ZigZag, но судя по индикатору хуйкинАши, даже в базовых индикаторах МТ такой чуши можно встретить, что крышу трудно удержать чтобы не съехала.

Victor Demihov
618
Victor Demihov  
RickD:
Может по вызову InitializeAll какая-то отложенная инициализация идет?
Ну так загляните, и проверьте это.. )
Victor Demihov
618
Victor Demihov  
AlexeyVik:

Разница вот такая

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

Хотя, нам то какая разница. Вопрос не в том. Инициализация произойдёт как у меня заданным числом, так и при помощи ArrayFill(). Но я спрашивал  о том, зачем массив, размер которого не задан, инициализировать некоторым значением. Смысл в этом какой? Я это, кстати, не у метаквотовцев изначально встретил в терминале (эти индюки я особо не копал, т.к. мне не нравится как они написаны), а у некоторых других авторов, к которым я отношусь весьма положительно, за их профессионализм. Но как бы то ни было, инициализация часто реализуется. Зачем это делается?

Alexey Viktorov
8017
Alexey Viktorov  
shanty:

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

Хотя, нам то какая разница. Вопрос не в том. Инициализация произойдёт как у меня заданным числом, так и при помощи ArrayFill(). Но я спрашивал  о том, зачем массив, размер которого не задан, инициализировать некоторым значением. Смысл в этом какой? Я это, кстати, не у метаквотовцев изначально встретил в терминале (эти индюки я особо не копал, т.к. мне не нравится как они написаны), а у некоторых других авторов, к которым я отношусь весьма положительно, за их профессионализм. Но как бы то ни было, инициализация часто реализуется. Зачем это делается?

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

Если понимаешь что это бесполезно так и не делай эту инициализацию. Почему-то мне кажется что даже автор такого кода ответить не сможет. Разве что "так все делают"...

Victor Nikolaev
Модератор
14651
Victor Nikolaev  
AlexeyVik:

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

Если понимаешь что это бесполезно так и не делай эту инициализацию. Почему-то мне кажется что даже автор такого кода ответить не сможет. Разве что "так все делают"...

На самом деле все проще. Это задание значения по умолчанию. Вот если в start() или onCalculate() делать инициализацию. Хотя и делается она там по другому
. ... Rick D. ... .
1176
. ... Rick D. ... .  
shanty:
Ну так загляните, и проверьте это.. )

А не проверить однозначно. Разработчики знают наверняка.

Есть вариант. Вызывать ArrayInitialize в OnCalculate при prev_calculated = 0

1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий