Работа с массивами-подскажите, как правильно.

 

Перечитал учебник, перечитал статьи: "MQL для чайников", чтобы не просить помощи, но похоже все же придется, потому что, что в учебнике, что в статьях описано, что такое массивы и... все. Ни как с ними работать, ни как их толком обьявить-ничего нет. Пишу индикатор в котором нужно использовать массив. Раньше всегда задавал массив, например так (над стартом) double massive1[1000]; или использовать буфер, который 

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

1. Как и где обьявлять массив в индикаторе?

2. Обязательно ли писать массив, например так: double val[1000]; потому что у других он записан как-то так double val[]; и все работает ?

3. Сколько массивов допустимо в индикаторе?

4. Если можно то короткое резюме как работать и как задать массив в индикаторе, потому НИГДЕ этого нет :(

 
ask >>:

Перечитал учебник, перечитал статьи: "MQL для чайников", чтобы не просить помощи, но похоже все же придется, потому что, что в учебнике, что в статьях описано, что такое массивы и... все. Ни как с ними работать, ни как их толком обьявить-ничего нет. Пишу индикатор в котором нужно использовать массив. Раньше всегда задавал массив, например так (над стартом) double massive1[1000]; или использовать буфер, который

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

1. Как и где обьявлять массив в индикаторе?

2. Обязательно ли писать массив, например так: double val[1000]; потому что у других он записан как-то так double val[]; и все работает ?

3. Сколько массивов допустимо в индикаторе?

4. Если можно то короткое резюме как работать и как задать массив в индикаторе, потому НИГДЕ этого нет :(

если буфер нужен только для расчетов, мона написать SetIndexStyle(индекс,DRAW_NONE);


1. Просто массив в любом месте. Буферный массив обьявляется на глобальном уровне вне функций (над стартом:))

2. обязательно:

если буферный массив double val[]; в init() - SetIndexBuffer(индекс,val);

Если обычный double val[1000];

или если размер заранее не известен, то double val[]; далее ArrayResize(val,РазмерМассива);

3. буферных 8.

остальных многа. вроде есть ограничение на 2 гига)

4. Непонятно, что непонятно. Есть конечно нюансы :)

Спрашивайте, попытаюсь ответить)

здесь можно статьи Роша по MQL почитать.

 
Swan >>:

если буфер нужен только для расчетов, мона написать SetIndexStyle(индекс,DRAW_NONE);


1. Просто массив в любом месте. Буферный массив обьявляется на глобальном уровне вне функций (над стартом:))

2. обязательно:

если буферный массив double val[]; в init() - SetIndexBuffer(индекс,val);

Если обычный double val[1000];

или если размер заранее не известен, то double val[]; далее ArrayResize(val,РазмерМассива);

3. буферных 8.

остальных многа. вроде есть ограничение на 2 гига)

4. Непонятно, что непонятно. Есть конечно нюансы :)

Спрашивайте, попытаюсь ответить)

здесь можно статьи Роша по MQL почитать.

Спасибо большое! Тогда можно на примере спрошу. Вроде все сделал как нужно (ну точно что не так, как нужно, просто, чтобы проверить как работают эти массивы, но мне то кажется, что как нужно)

А почему тогда кажет совсем-совсем не то :( Где там ошибка не подскажете? Почему не показывает просто обычные цены клоз, а погоду какую-то рисует?

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


#property indicator_buffers 1
#property indicator_color1 Lime
#property indicator_width1 1

#property indicator_separate_window

double   Buffer[];


int init()
  {
      

     SetIndexBuffer(0, Buffer);
     
      SetIndexStyle(0, DRAW_LINE);
  

    


      return(0);
  }

int deinit()
  {
      
  }

int start()
  {
 double value1[1000]; 

   for (int k=1000; k>=0;k--)
   {
          
         
   
        value1[k]=Close [k];   
           
           
          
   Buffer[k]= iMAOnArray(value1,0,1,0,MODE_SMA,k);   
           
           
           
     
        }
       
        
   //**---------------   
  
        
        
        
        
      return(0);
  }
 
ask >>:

А почему тогда кажет совсем-совсем не то :( Где там ошибка не подскажете? Почему не показывает просто обычные цены клоз, а погоду какую-то рисует?

Написать надо было вот так:

1) инициализировать буфер value1 до расчетов

2) выставить ему признак, чтобы индексация в массиве стала наоборот :-)

int start()
{
   double value1[1000]; 

   ArraySetAsSeries(value1,true);
   for (int k=1000; k>=0;k--)
   {
   value1[k]=Close [k];   
   }
       
   for ( k=1000; k>=0;k--)
   {
   Buffer[k]= iMAOnArray(value1,0,1,0,MODE_SMA,k);   
   }
   return(0);
}
 
jartmailru >>:

Написать надо было вот так:

1) инициализировать буфер value1 до расчетов

2) выставить ему признак, чтобы индексация в массиве стала наоборот :-)

точно.

только хз почему))

можно и в один цикл

int start()
  {
   double value1[1000];//индекс первого значения 0, последнего 1000-1
   ArraySetAsSeries(value1,true);//для последующих вычислений iMAOnArray и т.п. задаецо направление индексирования как у буферов
   for (int k=1000-1; k>=0;k--)
      {
      value1[k]=Close [k];
      Buffer[k]= iMAOnArray(value1,0,1,0,MODE_SMA,k);   
      }
   return(0);
  }
 
Swan писал(а) >> можно и в один цикл

Если цикл правильный от (1000-1) к 0, то можно, а если от 0 до (1000-1), то нельзя.

Я лучше проинициализирую лишний раз.

 
jartmailru >>:

Если цикл правильный от (1000-1) к 0, то можно, а если от 0 до (1000-1), то нельзя.

Я лучше проинициализирую лишний раз.

мона)

int start()
  {
   double value1[1000];
   ArraySetAsSeries(value1,true);
   for (int k=0; k<1000;k++)
      {
      value1[k]=Close [k];
      Buffer[k]= iMAOnArray(value1,0,1,0,MODE_SMA,k);   
      }
   return(0);
  }

но это частный случай.

 
Swan писал(а) >> мона) но это частный случай.

угу. мона. пока единичка в периоде средней стоит.

 
jartmailru >>:

угу. мона. пока единичка в периоде средней стоит.

не, ма простая :)

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_chart_window

extern int MA_Period=10;

double   Buffer[];

int init()
  {
   SetIndexBuffer(0, Buffer);
   SetIndexStyle(0, DRAW_LINE);
   return(0);
  }

int start()
  {
   double value1[1000];
   ArraySetAsSeries(value1,true);
   for (int k=0; k<1000; k++)
      {
      value1[k]=Close [k];
      Buffer[k-MA_Period]=iMAOnArray(value1,0,MA_Period,0,MODE_SMA,k-MA_Period);
      }
   return(0);
  }
 
  Swan и jartmailru СПАСИБО ВАМ БОЛЬШОЕ!!! ТЕПЕРЬ ВСЕ ПОНЯТНО СТАЛО. Я давольный. Научили, теперь буду писать-писать-писать-писать :)
 
Простите, что надоедаю, но еще один вопрос: почему нельзя строить iMAOnArray(value1........k), если значения value1 принимают то положительное, то отрицательное значение, допустим такие: 1, 3, 4, -5, -1, 2 или если можно, то можно спросить как ?
Причина обращения: