MQL5 Массив буферов индикатора

 

Я правильно понял, что объединить массивы используемые как буфера данных индикатора в один массив массивов (либо массив структур/классов) невозможно?

Взять/сохранить указатель на такой массив/буфер тоже нельзя?

Т.е. если у меня 28 буферов, то их не получится обработать красиво в цикле а нужно будет 28 раз вставить одинаковые блоки кода с разницей лишь в названии буфера/массива.

#define TOTAL_BUFFERS 28
double DataBuffer[TOTAL_BUFFERS][];

int OnInit()
{
//--- indicator buffers mapping
        SetIndexBuffer(0, DataBuffer[0], INDICATOR_DATA);
        SetIndexBuffer(1, DataBuffer[1], INDICATOR_DATA);
...
 
SemenTalonov:

Я правильно понял, что объединить массивы используемые как буфера данных индикатора в один массив массивов (либо массив структур/классов) невозможно?

Взять/сохранить указатель на такой массив/буфер тоже нельзя?

Т.е. если у меня 28 буферов, то их не получится обработать красиво в цикле а нужно будет 28 раз вставить одинаковые блоки кода с разницей лишь в названии буфера/массива.

А так пробовали?

#define TOTAL_BUFFERS 28
double DataBuffer[TOTAL_BUFFERS][];

void Func(double &Arr, int Index)
{
    SetIndexBuffer(Index, Arr, INDICATOR_DATA);
}

int OnInit()
{
   for (int i=0;i<=TOTAL_BUFFERS-1;i++)
   {
        Func(DataBuffer[i],i);
   }
}
 
Vitalii Ananev:

А так пробовали?

Попробовал.

Требует определения последней размерности массива - '[' - invalid index value

т.е. массив указателей вникуда (нулевых) впринципе недопустим.

Но даже если полностью определить размер

не может передать массив - invalid array access

 
SemenTalonov:

Я правильно понял, что объединить массивы используемые как буфера данных индикатора в один массив массивов (либо массив структур/классов) невозможно?

Взять/сохранить указатель на такой массив/буфер тоже нельзя?

Т.е. если у меня 28 буферов, то их не получится обработать красиво в цикле а нужно будет 28 раз вставить одинаковые блоки кода с разницей лишь в названии буфера/массива.

Структура или класс

 

В MQL5 нет возможности использовать указатель на базовые переменные или массив их них. Но можно использовать указатели на экземпляры структур и классов.

Поэтому можно объявить класс для буфера:

class IndicatorBuffer
{
public:
        double data[];
};

Теперь можете объявить массив из буферов, менять его размер динамически.

IndicatorBuffer buffer[];

ArrayResize( bufer , sizeOfBuffer );

А доступ к данным осуществлять так:

SetIndexBuffer(  0 , buffer[ index ].data );
 
Artyom Trishkin:

Структура или класс

Массив/Структура/Класс, без разницы. Любая сущность, которая позволит объединить однотипные массивы данных и обращаться к ним итеративно в цикле.

Ilya Baranov:

В MQL5 нет возможности использовать указатель на базовые переменные или массив их них. Но можно использовать указатели на экземпляры структур и классов.

Поэтому можно объявить класс для буфера:

Теперь можете объявить массив из буферов, менять его размер динамически.

А доступ к данным осуществлять так:

Спасибо большое, это действительно работает!

 
В моем блоге (на английском) есть готовое решение.
Причина обращения: