Скачать MetaTrader 5

Подскажите про массивы

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
ovak77
193
ovak77  
Я только учусь и на массивах попал в засаду: пытаюсь написать скрипт в котором массив данных будет перезаписываться. Например, 10 индексов, 0-9, допустим даты с 1 по 10 января, как 11 числа удалить данные за 1 января и вписать данные за 11, т.е. перезаписать в массив данные со 2 по 11 января, затем с 3 по 12 и т.д.?
Vladimir Karputov
Модератор
80854
Vladimir Karputov  
ovak77:
Я только учусь и на массивах попал в засаду: пытаюсь написать скрипт в котором массив данных будет перезаписываться. Например, 10 индексов, 0-9, допустим даты с 1 по 10 января, как 11 числа удалить данные за 1 января и вписать данные за 11, т.е. перезаписать в массив данные со 2 по 11 января, затем с 3 по 12 и т.д.?
Через промежуточный массив. Сначала копируете со сдвигом 1 в промежуточный массив. Затем дописываете один элемент в этот промежуточный массив. Последняя операция - копирование из промежуточного массива в начальный, но теперь без сдвига.
ovak77
193
ovak77  
Vladimir Karputov:
Через промежуточный массив. Сначала копируете со сдвигом 1 в промежуточный массив. Затем дописываете один элемент в этот промежуточный массив. Последняя операция - копирование из промежуточного массива в начальный, но теперь без сдвига.
ничего не понял, я только учусь, пробовал переборами, пробовал через ArrayCopy, не получается. Покажите пожалуйста пример
Vladimir Karputov
Модератор
80854
Vladimir Karputov  
ovak77:
ничего не понял, я только учусь, пробовал переборами, пробовал через ArrayCopy, не получается. Покажите пожалуйста пример
Давайте так: объявите два массива размерностью 10. Заполните данными первый массив. А потом ArrayCopy но со смещением (смотреть справку). Распечатайте второй массив.
ovak77
193
ovak77  
Vladimir Karputov:
Давайте так: объявите два массива размерностью 10. Заполните данными первый массив. А потом ArrayCopy но со смещением (смотреть справку). Распечатайте второй массив.
ArrayCopy(AskBufferTemp,AskBuffer,1,0+delta,InpVisible);
AskBufferTemp[0]=last_tick.ask;
ArrayCopy(AskBuffer,AskBufferTemp,0,0,InpVisible);

Я нашел такую конструкцию, но она перезаписывает только last_tick.ask и работает только в индикаторах, через INDICATOR_DATA, если данных в массиве много, то приходится писать десятки массивов и при каждом перезапуске обнулять все массивы и главное, в скрипте это не работает, в нем нет индикаторных буферов. Может есть способ перебором в For перезаписывать?

Andrei Fandeev
27837
Andrei Fandeev  
ovak77:
Я только учусь и на массивах попал в засаду: пытаюсь написать скрипт в котором массив данных будет перезаписываться. Например, 10 индексов, 0-9, допустим даты с 1 по 10 января, как 11 числа удалить данные за 1 января и вписать данные за 11, т.е. перезаписать в массив данные со 2 по 11 января, затем с 3 по 12 и т.д.?

https://book.mql4.com/ru/functions/timeseries

Массивы и таймсерии - Стандартные функции - Учебник по MQL4
Массивы и таймсерии - Стандартные функции - Учебник по MQL4
  • book.mql4.com
При работе с массивами очень важно помнить, что в MQL4 нумерация любой последовательности однотипных элементов начинается с нуля. Ранее указывалось, что не следует путать максимальное значение индекса элемента массива с количеством элементов этого массива (см. Массивы). Например, если объявлен массив: то это значит, что одномерный массив...
Alexey Volchanskiy
24616
Alexey Volchanskiy  
Alexey Volchanskiy:

Что надо сделать - сдвинуть массив влево, потом в ячейку 9 записать данные за сегодня. Если массив маленький, можно тупо сдвинуть, как я напишу ниже, если большой - использовать кольцевой буфер для скорости



написал ерунду спросоня )) вот так правильно

double dt[10];

void ShiftAndPutData(double data)
{
   for(int n = 0; n < 9; n++) //shift left
      dt[n] = dt[n+1];
   dt[9] = data;
}
ovak77
193
ovak77  
Andrei Fandeev:

https://book.mql4.com/ru/functions/timeseries

Я учусь в пятерке, прочитал несколько статей, в том числе https://www.mql5.com/ru/articles/567 и везде лишь общие сведения, вроде ArrayCopy наилучший вариант, но не получается заставить его работать
Основы программирования на MQL5 - Массивы
Основы программирования на MQL5 - Массивы
  • 2012.11.03
  • Dmitry Fedoseev
  • www.mql5.com
Наряду с переменными и функциями, массивы являются практически неотъемлемой частью любого языка программирования. Замечено, что некоторые начинающие изучать программирование, панически боятся массивов. Удивительно, но факт! Смею заверить вас, что бояться их не нужно. Массивы, по своей сути, это все те же обычные переменные. Если не вдаваться в...
Andrei Fandeev
27837
Andrei Fandeev  
ovak77:
Я учусь в пятерке, прочитал несколько статей, в том числе https://www.mql5.com/ru/articles/567 и везде лишь общие сведения, вроде ArrayCopy наилучший вариант, но не получается заставить его работать
Я Вам дал ссылку на очень понятное изложение понятия Массивы, и как с ними работать. Тут ведь не важно МТ4 или МТ5 для понимания сути.
Вам же дают ключевую подсказку - Скопировать массив в промежуточный, сдвиньте его, в освободившуюся клетку добавьте новое значение. Скопируйте обратно.
И каким образом копировать и сдвигать тоже подсказали. Вариантов несколько. Через Копи, через Цикл перебором, и тд
ovak77
193
ovak77  
Andrei Fandeev:
Я Вам дал ссылку на очень понятное изложение понятия Массивы, и как с ними работать. Тут ведь не важно МТ4 или МТ5 для понимания сути.
Вам же дают ключевую подсказку - Скопировать массив в промежуточный, сдвиньте его, в освободившуюся клетку добавьте новое значение. Скопируйте обратно.
И каким образом копировать и сдвигать тоже подсказали. Вариантов несколько. Через Копи, через Цикл перебором, и тд
Суть понятна, а скрипт не работает
ovak77
193
ovak77  

Вроде что-то слепил, не знаю, можно ли так писать, но вроде работает, выдает 1 предупреждение

      CustomMqlTick arr0[3];
      CustomMqlTick arr1[3];

      static int j;
      if(j<3)
        {
         for(int i=j;i<3 && !IsStopped();i++)
           {
            arr0[i]=my_tick0;
            ArrayPrint(arr0);
           }
        }
      j=j+1;

      if(j==3)
        {
         for(int v=0;v<2 && !IsStopped();v++)
           {
            arr1[v]=arr0[v+1];
           }
         j=2;
         ArrayCopy(arr0,arr1,0,0,2);
        }
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий