CopyBuffer и многомерный массив

 

Всем привет!

У меня задачка, которую не могу решить, прошу помочь знанием.

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

CopyBuffer((int)Envelopes_handle[id_instr][period_id],0,0,10, Enup[id_instr][period_id][]);

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

 
Artem Mordvinkin:

Всем привет!

У меня задачка, которую не могу решить, прошу помочь знанием.

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

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

Любой массив - одномерный с точки зрения его хранения в памяти. В любом языке программирования. Два, три, пять индексов - всего лишь способ вычисления абсолютного (одномерного) адреса элемента массива. Я ответил на Ваш вопрос, или ещё что-то неясно? 

 
Алексей Тарабанов:

Любой массив - одномерный с точки зрения его хранения в памяти. В любом языке программирования. Два, три, пять индексов - всего лишь способ вычисления абсолютного (одномерного) адреса элемента массива. Я ответил на Ваш вопрос, или ещё что-то неясно? 

Наверное, нет:) 

CopyBuffer((int)Envelopes_handle[id_instr][period_id],0,0,10, Enup[id_instr][period_id][]);

Здесь как быть? Копировать по одному значению в один элемент? И в данном случае цикл или 10 строк? Если так, то не то, что искал (если конечно другие варианты возможны)

 

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

С арифметикой, надеюсь, помощь не нужна? 

 
По синтаксису МТ5 не ко мне. 
 
Я - как анти Барабашка. Не знаю и не хочу знать, кто такой МТ5 )))
 
Алексей Тарабанов:

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

С арифметикой, надеюсь, помощь не нужна? 

С арифметикой нормально. С ответом - нет. Я как бы не настаиваю на ответах мне, поэтому можно без пренебрежения. Возможно, ответ на мой вопрос элементарен, но я не понимаю его. Я понимаю, что вы пишете про одномерные массивы, но я кроме как перебирать циклом не вижу решения (передавать ли по одному значению в один элемент (сообщение выше), передавать ли все 10 значений в транзитный одномерный и потом через цикл передавать в трехмерный. Мне не нравится история с циклом. Если есть возможность показать на коде - буду благодарен, нет желания - не стоит и про арифметику писать - не школьник.

 
Artem Mordvinkin:

С арифметикой нормально. С ответом - нет. Я как бы не настаиваю на ответах мне, поэтому можно без пренебрежения. Возможно, ответ на мой вопрос элементарен, но я не понимаю его. Я понимаю, что вы пишете про одномерные массивы, но я кроме как перебирать циклом не вижу решения (передавать ли по одному значению в один элемент (сообщение выше), передавать ли все 10 значений в транзитный одномерный и потом через цикл передавать в трехмерный. Мне не нравится история с циклом. Если есть возможность показать на коде - буду благодарен, нет желания - не стоит и про арифметику писать - не школьник.

Возможности показать в коде нет,- я не программирую на МQL5, только на четвёрке, но дело не в этом. У Вас есть верное решение задачи и несколько способов его реализации. Но, отчего - то, у Вас нет понимания их эквивалентности. Цикл есть в обоих случаях, размерность, а значит - вычислительная сложность, одинаковы: за что боремся,боярин? 

Если что, звоните. Всегда рад пообщаться. 

 
Алексей Тарабанов:

Возможности показать в коде нет,- я не программирую на МQL5, только на четвёрке, но дело не в этом. У Вас есть верное решение задачи и несколько способов его реализации. Но, отчего - то, у Вас нет понимания их эквивалентности. Цикл есть в обоих случаях, размерность, а значит - вычислительная сложность, одинаковы: за что боремся,боярин? 

Если что, звоните. Всегда рад пообщаться. 

Спасибо, Алексей. Борьба за производительность. Сова на OnTick и 3 десятка индюков (несколько таймфреймов  и пар) - 10 последних значений на индюке. Опасаюсь, что передача этих самых значений через цикл будет медленнее, чем их же передача через прямую конструкцию CopyBuffer. Но синтаксис не позволяет передать в трехмерный, как я понимаю, либо я что-то делаю неправильно, либо что-то не знаю (наверняка, за тем и пришел на форум). Возможно мои опасения насчет цикла (снижение скорости обработки информации) преувеличены, но возможно есть и другое решение. 

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

Структуры использовать:

struct S1{
   double data[];
   int h;
};

struct S2{
   S1 tf[];
};

S2 sym[];

CopyBuffer(sym[id_instr].tf[period_id].h,0,0,10, sym[id_instr].tf[period_id].data);

Всем массивам, разумеется, размеры установить.

Причина обращения: