ссылка на переменную

 

Здравствуйте,

делаю индикатор, в котором индикаторный буфер должен выбираться в цикле.

предварительно объявил

   SetIndexBuffer(0,ind1);
   SetIndexBuffer(1,ind2);
   SetIndexBuffer(2,ind3);
....
   SetIndexBuffer(19,ind20);

Далее нужно в цикле перебирать все эти буферы и заполнять нужными данными для отрисовки линий (их может быть от 1 до 20)

сейчас делаю перебор просто по имени буфера

         ind1[i]=v[1];
         ind2[i]=v[2];
         ind20[i]=v[20]; ...

Код получается громоздким. Сейчас 20 буферов, а вдруг понадобится 100? ))

Нельзя ли и буферы перебирать в цикле

Что то вроде

for (int j=1; j<20;j++){
"ind"+j [i] = v[j]
}

В PHP есть конструкция $$var - где $var="ind" - название переменной, там легко можно прибавлять в цикле индекс $var="ind"+1, $var="ind"+2 ... в цикле. В итоге $var="ind1" или "ind2" и т.д.

И затем по $$var мы работаем с переменной по имени ind1 или ind2 и т.д.

Нельзя ли что-то подобное сделать на mql5?

 
Можно. Создать структуру, в ней массив. Этот массив будет буфером. Дальше создаем массив структур.
 
Dmitry Fedoseev:
Можно. Создать структуру, в ней массив. Этот массив будет буфером. Дальше создаем массив структур.
Да, или использовать двумерные массивы, где одно из измерений - номер буфера. Может работать чуть быстрее варианта со структурами. 
 
Alexey Volchanskiy:
Да, или использовать двумерные массивы, где одно из измерений - номер буфера. Может работать чуть быстрее варианта со структурами. 
Продемонстрируйте на наглядном примере, пожалуйста.
 
Dmitry Fedoseev:
Продемонстрируйте на наглядном примере, пожалуйста.

Сорри, буфера-то индикаторные, не выйдет. Погорячился ))

А Ваш вариант типа такого?

//--- indicator buffers
double         Label1Buffer[];
double         Label2Buffer[];
double         Label3Buffer[];

struct SBuf
{
    double buf[];    
} strArr[3];

int OnInit()
{
    SetIndexBuffer(0,strArr[0].buf);
    SetIndexBuffer(1,strArr[1].buf);
    SetIndexBuffer(2,strArr[2].buf);
    return(INIT_SUCCEEDED);
}
 
Alexey Volchanskiy:

...

А Ваш вариант типа такого?

Да. Только не я изобретатель, в кодабазе видел.
 
Dmitry Fedoseev:
Можно. Создать структуру, в ней массив. Этот массив будет буфером. Дальше создаем массив структур.

Сокращённый образец (для MT5)

struct BUFFERS {
        string  s_Name;
        double  da_Values[];
};
BUFFERS go_Currency_Buffers[], go_Symbol_Buffers[];

int OnInit() {
        // эта функция читает MarketWatch и готовит структуру буферов:
        Prepare_Currencies_Structure(Currencies_List, Market_Watch_Selected_Only);
        
        // отображаемые буфера:
        int i_Buffer_Num = gi_Currencies_Total; // gi_Currencies_Total - посчитано в Prepare_Currencies_Structure
        while(i_Buffer_Num-- > 0) {
                SetIndexBuffer(i_Buffer_Num, go_Currency_Buffers[i_Buffer_Num].da_Values, INDICATOR_DATA);
                PlotIndexSetString(i_Buffer_Num, PLOT_LABEL, go_Currency_Buffers[i_Buffer_Num].s_Name);
                PlotIndexSetDouble(i_Buffer_Num, PLOT_EMPTY_VALUE, EMPTY_VALUE);
        }
        
        // буфера для расчётов:
        i_Buffer_Num = gi_Currencies_Total + gi_Symbol_Buffers_Total; // gi_Symbol_Buffers_Total - посчитано в Prepare_Currencies_Structure
        while(i_Buffer_Num-- > gi_Currencies_Total) {
                SetIndexBuffer(i_Buffer_Num, go_Symbol_Buffers[i_Buffer_Num - gi_Currencies_Total].da_Values, INDICATOR_CALCULATIONS);
                PlotIndexSetDouble(i_Buffer_Num, PLOT_EMPTY_VALUE, 0.);
        }
        
        return(INIT_SUCCEEDED);
}

Что неудобно - нельзя #property indicator_buffers менять динамически (в OnInit), поэтому приходиццо задавать с запасом

 
Alexander Puzanov:

Сокращённый образец (для MT5)

Что неудобно - нельзя #property indicator_buffers менять динамически (в OnInit), поэтому приходиццо задавать с запасом

Есть у меня в Projects проект Code Snippets. Пополнил вашим кодом. Кстати, советую всем так делать, а то готовые решения теряются, потом тратишь время, изобретая велосипеды. 
Причина обращения: