Подскажите пожалуйста, как перебирать с помощью цикла динамические массивы?

 

Здравствуйте. Подскажите пожалуйста.

Для наглядности вопроса, предположим, что я хочу создать индикатор где будет 100 разных МА-шек.

Я не понимаю, как массово проводить однотипные действия с динамическими массивами для каждой МА-шки.
Как их массово создавать и затем с помощью цикла перебирать?

То, как я умею делать, я привел в коде ниже. А как это сделать без таких огородов не выходит. Помогите пожалуйста :(

// Создаем 100 динамических массивов
double         MA_1[];
double         MA_2[];
double         MA_3[];
double         MA_4[];
double         MA_5[];
...            ...
double         MA_99[];
double         MA_100[];

// Создаем 100 хендлов
int            MA_1_Handle;
int            MA_2_Handle;
int            MA_3_Handle;
int            MA_4_Handle;
int            MA_5_Handle;
...            ...
int            MA_99_Handle;
int            MA_100_Handle;



int OnInit() {

// Связываем 100 буферов
   SetIndexBuffer(0, MA_1, INDICATOR_DATA);
   SetIndexBuffer(1, MA_2, INDICATOR_DATA);
   SetIndexBuffer(2, MA_3, INDICATOR_DATA);
   SetIndexBuffer(3, MA_4, INDICATOR_DATA);
   SetIndexBuffer(4, MA_5, INDICATOR_DATA);
   ...
   SetIndexBuffer(98, MA_99, INDICATOR_DATA);
   SetIndexBuffer(99, MA_100, INDICATOR_DATA);


// Связываем 100 хендлов с нужными скользящими средними
   MA_1_Handle = iMA(Symbol(), PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);
   MA_2_Handle = iMA(Symbol(), PERIOD_CURRENT, 2, 0, MODE_SMA, PRICE_CLOSE);
   MA_3_Handle = iMA(Symbol(), PERIOD_CURRENT, 3, 0, MODE_SMA, PRICE_CLOSE);
   MA_4_Handle = iMA(Symbol(), PERIOD_CURRENT, 4, 0, MODE_SMA, PRICE_CLOSE);
   MA_5_Handle = iMA(Symbol(), PERIOD_CURRENT, 5, 0, MODE_SMA, PRICE_CLOSE);
   ...
   MA_99_Handle = iMA(Symbol(), PERIOD_CURRENT, 99, 0, MODE_SMA, PRICE_CLOSE);
   MA_100_Handle = iMA(Symbol(), PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_CLOSE);

   return(INIT_SUCCEEDED);
}



int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) {

// Наполняем 100 динамических массивов значениями
   CopyBuffer(MA_1_Handle, 0, 0, rates_total, MA_1);
   CopyBuffer(MA_2_Handle, 0, 0, rates_total, MA_2);
   CopyBuffer(MA_3_Handle, 0, 0, rates_total, MA_3);
   CopyBuffer(MA_4_Handle, 0, 0, rates_total, MA_4);
   CopyBuffer(MA_5_Handle, 0, 0, rates_total, MA_5);
   ...
   CopyBuffer(MA_99_Handle, 0, 0, rates_total, MA_99);
   CopyBuffer(MA_100_Handle, 0, 0, rates_total, MA_100);

// Это уже 500 строчек кода!!!  ( х_х)
// А дальше нужно писать код и если для каждой МА писать свой код, то даже страшно становится.

// Надеюсь, я продемонстрировал свою боль )
// То, есть вопрос, как массово, а не по одному создать все это?
// Как с помощью цикла перебирать динамические массивы один за другим?


То как я пытался сделать, но mql такого не пропускает:

// Идеальное решение было бы таким:
// Правда синтаксис такого провернуть не позволяет, а как правильно не могу придумать.

   double MA_val[100][];  // Эх, если бы можно было таким образом создать 100 динамических массивов
   int    MA_Handle[100];
   // А дальше для каждого значения периода MA выполнить однотипные действия
   for ( int i = 0; i < 100; i++) {
      SetIndexBuffer(0, MA_val[i], INDICATOR_DATA); // Так не пропустит
      MA_Handle[i] = iMA(Symbol(), PERIOD_CURRENT, i, 0, MODE_SMA, PRICE_CLOSE);
      
      CopyBuffer(MA_Handle[i], 0, 0, rates_total, MA_val[i]);
   }
   
// Типо того. В общем, основной вопрос, как засунуть динамические массивы в цикл для дальнейшего перебора


Благодарю за все ответы!

P.S. Не кидайте в меня помидорами :)
Предполагаю, что решение должно быть тривиальным, а это все мое непонимание теории C++

Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
Массив структур использовать. В структуре динамический массив - он будет индикаторным буфером.
 
yar.forex:

Здравствуйте. Подскажите пожалуйста.

Для наглядности вопроса, предположим, что я хочу создать индикатор где будет 100 разных МА-шек.

Я не понимаю, как массово проводить однотипные действия с динамическими массивами для каждой МА-шки.
Как их массово создавать и затем с помощью цикла перебирать?

То, как я умею делать, я привел в коде ниже. А как это сделать без таких огородов не выходит. Помогите пожалуйста :(


То как я пытался сделать, но mql такого не пропускает:


Благодарю за все ответы!

P.S. Не кидайте в меня помидорами :)
Предполагаю, что решение должно быть тривиальным, а это все мое непонимание теории C++

так же можно обойтись одним массивом.
Вот примеры как только с одним массивом рисуется более тысячи MA-шек. Причем быстрее.

https://www.mql5.com/en/code/24798

https://www.mql5.com/en/code/27733

 
yar.forex:

Здравствуйте. Подскажите пожалуйста. 

Можно так, как Дмитрий говорил: 

struct My
   {
   double ma[];
   int handle;
   } my[100];
   
for(int i=0; i<100; i++)
   {
   SetIndexBuffer(i, my[i].ma, INDICATOR_DATA);
   }

for(int i=0; i<100; i++)
   {
   my[i].handle = iMA(Symbol(), PERIOD_CURRENT, i+1, 0, MODE_SMA, PRICE_CLOSE);
   }

for(int i=0; i<100; i++)
   {
   CopyBuffer(my[i].handle, 0, 0, rates_total, my[i].ma);
   }
 
Nikolai Semko:

так же можно обойтись одним массивом.
Вот примеры как только с одним массивом рисуется более тысячи MA-шек. Причем быстрее.

https://www.mql5.com/en/code/24798

https://www.mql5.com/en/code/27733

Спасибо, пригодится. Очень круто выглядит )

 
Aleksei Stepanenko:

Можно так, как Дмитрий говорил: 

Спасибо за пример кода. Подобное решение как раз и искал :)
 
А подскажите пожалуйста, можно ли каким то образом избежать так же и подобного огорода? 

Такое можно сократить?

#property indicator_type1     DRAW_COLOR_LINE
#property indicator_label1    "MA_1"
#property indicator_color1    clrBlue, clrSilver
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

#property indicator_type2     DRAW_COLOR_LINE
#property indicator_label2    "MA_2"
#property indicator_color2    clrBlue, clrSilver
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1

#property indicator_type3     DRAW_COLOR_LINE
#property indicator_label3    "MA_3"
#property indicator_color3    clrBlue, clrSilver
#property indicator_style3    STYLE_SOLID
#property indicator_width3    1

#property indicator_type4     DRAW_COLOR_LINE
#property indicator_label4    "MA_4"
#property indicator_color4    clrBlue, clrSilver
#property indicator_style4    STYLE_SOLID
#property indicator_width4    1

#property indicator_type5     DRAW_COLOR_LINE
#property indicator_label5    "MA_5"
#property indicator_color5    clrBlue, clrSilver
#property indicator_style5    STYLE_SOLID
#property indicator_width5    1

...

#property indicator_type99     DRAW_COLOR_LINE
#property indicator_label99    "MA_99"
#property indicator_color99    clrBlue, clrSilver
#property indicator_style99    STYLE_SOLID
#property indicator_width99    1

#property indicator_type100     DRAW_COLOR_LINE
#property indicator_label100    "MA_100"
#property indicator_color100    clrBlue, clrSilver
#property indicator_style100    STYLE_SOLID
#property indicator_width100    1
 

в OnInit так же циклом задайте, для пятёрки (не понял где Вы пишите):

//--- привязка массива к индикаторному буферу с индексом i 
   SetIndexBuffer(i,MABuffer,INDICATOR_DATA); 
//--- задать рисование линии 
   PlotIndexSetInteger(i,PLOT_DRAW_TYPE,DRAW_LINE); 
//--- задание стиля для рисования линии 
   PlotIndexSetInteger(i,PLOT_LINE_STYLE,STYLE_DOT); 
//--- задание цвета линии 
   PlotIndexSetInteger(i,PLOT_LINE_COLOR,clrRed); 
//--- задание толщины линии 
   PlotIndexSetInteger(i,PLOT_LINE_WIDTH,1); 


для четвёрки: https://docs.mql4.com/ru/customind/setindexstyle

для пятёрки: https://www.mql5.com/ru/docs/constants/indicatorconstants/drawstyles

ещё https://www.mql5.com/ru/articles/45
 
Aleksei Stepanenko:

в OnInit так же циклом задайте, для пятёрки (не понял где Вы пишите):


для четвёрки: https://docs.mql4.com/ru/customind/setindexstyle

для пятёрки: https://www.mql5.com/ru/docs/constants/indicatorconstants/drawstyles

ещё https://www.mql5.com/ru/articles/45
Гениально :) 
Спасибо большое!
 
Не за что
Причина обращения: