mql5 работа с массивом ( как ? курил мануал но не понял) - страница 2

 
rapidograf #:


именно так и есть . я не понимаю и не могу понять читая мануал по MQL5 , поэтому в форум и написал.

для простоты понимания.


объявлен массив конечной длины в сто ячеек

double data_p[99];  // глобальный

Заметьте, что здесь объявлен статический массив. Его размер впоследствии нельзя будет изменить.

Если нужно однократно получить заранее известное количество цен, то тогда можно использовать статический массив. В этом случае достаточно запросить их один раз при помощи CopyClose:

   double arrfPrice[99];
   CopyClose(Symbol(), PERIOD_CURRENT, 1, 99, arrfPrice);

вопрос (?)

запустился советник предположим 

начал отрабатыватся цикл 

и на первой же свечке он забивает весь массив одинаковыми данными.

а если поставить sleep то будет пропущено куча нужных данных.

вот в чем вопрос как сопряч это все межу собой чтобы массив корректно заполнялся по событию сождания свечки

Если же массив нужно формировать последовательно при появлении новых свечей, то использовать статический массив нельзя, т. к. заранее неизвестно, сколько данных потребуется записать. Для этой цели используется динамический массив. Объявляется так:

double arrfPrice[];

Далее заполняем этот массив в момент появления новой свечи (если история котировок не интересует, а нужны только новые свечи, образованные после запуска программы):

   static datetime dtLastTime = 0;
   static double arrfPrice[];
      
   if (dtLastTime == iTime(NULL, PERIOD_CURRENT, 1))
      return;
   dtLastTime = iTime(NULL, PERIOD_CURRENT, 1);
            
   int nTotal = ArraySize(arrfPrice);
   if (ArrayResize(arrfPrice, nTotal + 1) == nTotal + 1)
      arrfPrice[nTotal] = iClose(NULL, PERIOD_CURRENT, 1);
   else
      Print("Ошибка изменения размера массива: ", GetLastError());   

Этот код годится только для советника или индикатора. Для скрипта не подойдет.

 
Ihor Herasko #:

Заметьте, что здесь объявлен статический массив. Его размер впоследствии нельзя будет изменить.

Если нужно однократно получить заранее известное количество цен, то тогда можно использовать статический массив. В этом случае достаточно запросить их один раз при помощи CopyClose:


Если же массив нужно формировать последовательно при появлении новых свечей, то использовать статический массив нельзя, т. к. заранее неизвестно, сколько данных потребуется записать. Для этой цели используется динамический массив. Объявляется так:

Далее заполняем этот массив в момент появления новой свечи (если история котировок не интересует, а нужны только новые свечи, образованные после запуска программы):

Этот код годится только для советника или индикатора. Для скрипта не подойдет.

С ПАСИБО !!!! _!

ак как привинтить к примеру который Вы написал конструкцию с использованием  CopyRates  ?

 

rapidograf #:

объявлен массив конечной длины в сто ячеек

double data_p[99];  // глобальный

for(x=0;x<=99; x++)

  {

   ...
  }

Вот тут уже проблема. Массив - не на 100, а на 99 ячеек, с 0 по 98.

И в цикле, если не сделаем сторого "x<99", напоремся на вылет за границу.

 
rapidograf #:

С ПАСИБО !!!! _!

ак как привинтить к примеру который Вы написал конструкцию с использованием  CopyRates  ?

Если нужно получить не только цены закрытия, а все цены каждой из свечей (OHLC), то просто заменить тип массива с double на MqlRates, а вместо iClose поставить CopyRates.

Или же конкретизируйте вопрос.

Причина обращения: