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

 

Здравствуйте уважаемые .


как в mql5 работать с массивами ?

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

doublw data_p[];


 в секции onTick

как заполнить массив data_p[] ?

data_p[] = BarData[0].close  // вот таким содержимым

как происходит итерационная закладка данных в массив при каждом событии  BarData[0].close

не понимаю если массив то нумерация его элементов должна меняться, соответственно от  data_p[0]   и до какого то  значения  data_p[n]

а как быть в данном случае ?  как положить значения в ячейку массива по номеру и как этот номер в mql5 меняется ?  в примерах смотрел но не понял как это все происходит.


растолкуйте пожалуйста с примером если можно 

 
rapidograf:

Здравствуйте уважаемые .


как в mql5 работать с массивами ?

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

doublw data_p[];


 в секции onTick

как заполнить массив data_p[] ?

data_p[] = BarData[0].close  // вот таким содержимым

как происходит итерационная закладка данных в массив при каждом событии  BarData[0].close

не понимаю если массив то нумерация его элементов должна меняться, соответственно от  data_p[0]   и до какого то  значения  data_p[n]

а как быть в данном случае ?  как положить значения в ячейку массива по номеру и как этот номер в mql5 меняется ?  в примерах смотрел но не понял как это все происходит.


растолкуйте пожалуйста с примером если можно 

там надо организовывать смещение на 1 яч-ку при заполнении.

Вот еще тут https://www.mql5.com/ru/forum/145455/page263#comment_3665648

Вот для общего случая гляньте с этой страницы: 

https://www.mql5.com/ru/forum/160683/page1950

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2022.04.26
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
rapidograf:

Здравствуйте уважаемые .


как в mql5 работать с массивами ?

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

doublw data_p[];


 в секции onTick

как заполнить массив data_p[] ?

data_p[] = BarData[0].close  // вот таким содержимым

как происходит итерационная закладка данных в массив при каждом событии  BarData[0].close

не понимаю если массив то нумерация его элементов должна меняться, соответственно от  data_p[0]   и до какого то  значения  data_p[n]

а как быть в данном случае ?  как положить значения в ячейку массива по номеру и как этот номер в mql5 меняется ?  в примерах смотрел но не понял как это все происходит.


растолкуйте пожалуйста с примером если можно 

Динамический массив после объявления имеет размер равный нулю. Для того, чтобы в массив можно было что либо положить надо увеличить размер массива на нужное количество элементов, как минимум на 1 функцией ArrayResize()

Документация по MQL5: Операции с массивами / ArrayResize
Документация по MQL5: Операции с массивами / ArrayResize
  • www.mql5.com
ArrayResize - Операции с массивами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman Shiredchenko #:

там надо организовывать смещение на 1 яч-ку при заполнении.

Вот еще тут https://www.mql5.com/ru/forum/145455/page263#comment_3665648

Вот для общего случая гляньте с этой страницы: 

https://www.mql5.com/ru/forum/160683/page1950

спасибо .

попробую должнож получится.

но идейно все рано не понятно.

если событие в разделе  onTick случилось .  это событие обрабатывается автоматом mql5 .  но как по срабатыванию события увеличить счетчик ячеек массива i=i+1  как это соединить между собой .

 
rapidograf #:

спасибо .

попробую должнож получится.

но идейно все рано не понятно.

если событие в разделе  onTick случилось .  это событие обрабатывается автоматом mql5 .  но как по срабатыванию события увеличить счетчик ячеек массива i=i+1  как это соединить между собой .

Если нужно увеличить размерность массива, то:

int nTotal = ArraySize(array);
if (ArrayResize(array, nTotal + 1) != nTotal + 1)
{
   // Не удалось увеличить размерность массива
}
 
Ihor Herasko #:

Если нужно увеличить размерность массива, то:

не совсем я ходел увеличить длину массива


------------------------------------------------------------


double data_p[];   // объявлен безразмерный массив в длину



CopyRates(ticker, PERIOD_M5, 0, 1, BarData); // взяли данные по свечке
double Latest_Close_Price = BarData[0].close; // вынули последнюю цену


// далее пишу словами потому что пробовал кодить но не получается.

теперь при присоединении советника к графику инструмента, естественно  данные секции onTick выдает данные в CopyRates  оттуда вынимаем Latest_Close_Price,
но как положить  Latest_Close_Price   в  data_p с увеличением ячейки на каждом появлении новой Latest_Close_Price   ?

в общем и целом я прошу рабочий код самый простой без структур и прочих изысков.

можно сделать цикл но как в нем будет обрабатыватся onTick   не знаю, будут как то перехватыватся на лету или браться откуда то из потоенных регистров метатрадера.....

 
rapidograf #:

не совсем я ходел увеличить длину массива


------------------------------------------------------------


double data_p[];   // объявлен безразмерный массив в длину

Я так понимаю, вы неплохо знаете какой-то яп и ориентируетесь на эти знания не понимая того, что в MQL5

double data_p[];   // объявлен массив нулевой длинны

 
rapidograf #:

не совсем я ходел увеличить длину массива

Уточните, что здесь написано:

не совсем, я хотел увеличить длину массива

или 

я не хотел увеличить длину массива

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

double data_p[];   // объявлен безразмерный массив в длину

Не безразмерный, а нулевой. В такой массив ничего записать нельзя, нужно выделять память через ArrayResize


CopyRates(ticker, PERIOD_M5, 0, 1, BarData); // взяли данные по свечке
double Latest_Close_Price = BarData[0].close; // вынули последнюю цену


// далее пишу словами потому что пробовал кодить но не получается.

теперь при присоединении советника к графику инструмента, естественно  данные секции onTick выдает данные в CopyRates  оттуда вынимаем Latest_Close_Price,
но как положить  Latest_Close_Price   в  data_p с увеличением ячейки на каждом появлении новой Latest_Close_Price   ?

в общем и целом я прошу рабочий код самый простой без структур и прочих изысков.

можно сделать цикл но как в нем будет обрабатыватся onTick   не знаю, будут как то перехватыватся на лету или браться откуда то из потоенных регистров метатрадера.....

Вот этот Latest_Close_Price и следует записать в массив. Для этого увеличиваем размер массива, а затем записываем в новую ячейку данные:

int nTotal = ArraySize(array);
if (ArrayResize(array, nTotal + 1) != nTotal + 1)
{
   // Не удалось увеличить размерность массива
}
else
   array[nTotal] =  Latest_Close_Price;
 

всё просто - на каждом баре/тике из мкл получаем текущие данные в нужном кол-ве. Ресайзим наш массив под сделанную выборку. Полностью перезаписываем наш массив новыми данными. Не забываем развернуть массив ArraySetAsSeries. И снова у нас элемент 0=текущий, 1-предыдущий и т.д..

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

 
Ihor Herasko #:

Уточните, что здесь написано:

или 

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

Не безразмерный, а нулевой. В такой массив ничего записать нельзя, нужно выделять память через ArrayResize

Вот этот Latest_Close_Price и следует записать в массив. Для этого увеличиваем размер массива, а затем записываем в новую ячейку данные:


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

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


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

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


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

CopyRates(ticker, PERIOD_M5, 0, 1, BarData); // взяли данные по свечке

 Latest_Close_Price = BarData[0].close; // вынули последнюю цену

data_p[х] =  Latest_Close_Price


  }


вопрос (?)

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

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

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

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


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



есть 

 
подъем темы 
Причина обращения: