Многоуровневый массив буфера индикатора

 

Доброго времени, коллеги!


Представим что кол-во символов в окне обзора рынка может отличаться, как и их название.

И я хочу чтобы мой индюк показывал значение MA в одном окне по всем символам. Ниже накидал примерный код, по памяти. В нем при попытке CopyBuffer в двумерный массив получаю ошибку. Как иначе это реализовать если изначально не известно какие Символы и сколько их будет? Хочу адаптивны индюк.

double bufferMA[][]; 

void onInit()
{
        SetIndexBuffer(0,bufferMA,INDICATOR_DATA);

        int totalSymbols = SymbolsTotal(true);
        ArrayResize(bufferMA,totalSymbols); //Делаю размер массива 1-го уровня равный кол-ву Символов
        
        int handleMA[totalSymbols];

        for(int i=0;i<totalSymbols;i++)
        {
                handleMA[i]=iMA(SymbolName(i,true),_Period,30,0,MODE_SMA,PRICE_CLOSE);
        }

}

void onTick()
        {
                for(int i=0;i<totalSymbols;i++)
                {
                        CopyBuffer(handleMA[i],0,0,bars,bufferMA[i]); // Вот тут получаю ошибку
                }
        }
 
Petr Zharuk:

Доброго времени, коллеги!


Представим что кол-во символов в окне обзора рынка может отличаться, как и их название.

И я хочу чтобы мой индюк показывал значение MA в одном окне по всем символам. Ниже накидал примерный код, по памяти. В нем при попытке CopyBuffer в двумерный массив получаю ошибку. Как иначе это реализовать если изначально не известно какие Символы и сколько их будет? Хочу адаптивны индюк.

Попробовать сделать не двумерный массив, а "массив массивов" - массив указателей на массивы, вероятно, используя классы.

 
Petr Zharuk:
void onTick()
        {
                for(int i=0;i<totalSymbols;i++)
                {
                        CopyBuffer(handleMA[i],0,0,bars,bufferMA[i]); // Вот тут получаю ошибку
                }
        }
 
Petr Zharuk:

Доброго времени, коллеги!


Представим что кол-во символов в окне обзора рынка может отличаться, как и их название.

И я хочу чтобы мой индюк показывал значение MA в одном окне по всем символам. Ниже накидал примерный код, по памяти. В нем при попытке CopyBuffer в двумерный массив получаю ошибку. Как иначе это реализовать если изначально не известно какие Символы и сколько их будет? Хочу адаптивны индюк.

К двумерному массиву нужно обращаться по двум измерениям.

Здесь же обращение к массиву, как к одномерному

CopyBuffer(handleMA[i],0,0,bars,bufferMA[i]);
 
CopyBuffer

CopyBuffer

Получает в массив buffer данные указанного буфера указанного индикатора в указанном количестве.

Буфера индикаторов одномерные массивы. В двумерный этой командой никак.)

Сперва в одномерные массивы, а потом можно добавить в двумерный.

 

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

 
Petr Zharuk:

Доброго времени, коллеги!


Представим что кол-во символов в окне обзора рынка может отличаться, как и их название.

И я хочу чтобы мой индюк показывал значение MA в одном окне по всем символам. Ниже накидал примерный код, по памяти. В нем при попытке CopyBuffer в двумерный массив получаю ошибку. Как иначе это реализовать если изначально не известно какие Символы и сколько их будет? Хочу адаптивны индюк.

В блоге на английском есть описание реализации подхода с многомерными индикаторными буферами.

PS. Отдельным заголовочным файлом идет в индикаторе в кодебазе.

MQL's OOP notes: Arrayed indicator buffers based on operators overloading
MQL's OOP notes: Arrayed indicator buffers based on operators overloading
  • 2016.09.17
  • www.mql5.com
From very first moment as I started learning MetaTrader many years ago I was wondering why there are no multidimentional buffers in indicators. Indeed, when you code an indicator with multiple buffers
 
Petr Zharuk:

Доброго времени, коллеги!


Представим что кол-во символов в окне обзора рынка может отличаться, как и их название.

И я хочу чтобы мой индюк показывал значение MA в одном окне по всем символам. Ниже накидал примерный код, по памяти. В нем при попытке CopyBuffer в двумерный массив получаю ошибку. Как иначе это реализовать если изначально не известно какие Символы и сколько их будет? Хочу адаптивны индюк.

struct MyStruct{
   int handleMA;
   double bufferMA[];
};
MyStruct myStructs[];

int totalSymbols;

void onInit()
{
        //SetIndexBuffer(0,bufferMA,INDICATOR_DATA);
        totalSymbols = SymbolsTotal(true);
        ArrayResize(myStructs, totalSymbols);
        for(int i=0;i<totalSymbols;i++)
        {
             myStructs[i].handleMA=iMA(SymbolName(i,true),_Period,30,0,MODE_SMA,PRICE_CLOSE);
        }

}

void onTick() {
   int bars = 100; // dummy
    for(int i=0;i<totalSymbols;i++)
    {
            CopyBuffer(myStructs[i].handleMA,0,0,bars,myStructs[i].bufferMA); // Вот тут не получаю ошибку
    }
}
 
Stanislav Korotky #:

В блоге на английском есть описание реализации подхода с многомерными индикаторными буферами.

PS. Отдельным заголовочным файлом идет в индикаторе в кодебазе.

Спасибо, познавательно, хотя сложное по мне решение)

 
trader6_1 #:

Элегантное решение, массив структуры, в которой массив. Жаль в структуре нельзя объявить структуру)))

 
Всем спасибо за активность. 
Теперь надо познать что такое структуры.
Причина обращения: