Хотя, можно попробовать создавать временный массив и копировать через него сразу все данные.
Непонятно, что за "ротация", поэтому вопрос неясен. Массив (в часности вышеупомянутый) в MQL нужно подразумевать как какой-то класс-массив в С++, индекс к элементам которого обратный. Например,
class Array { DATA data[n]; int count;// <= n DATA operator[](int i){ return data[count - i - 1]; } };
Это не значит, что на самом деле там элементы располагаются в обратном порядке. Они только так индексируюстя.
Соответственно, я надеялся, что может существует способ помимо ручного сдвига.
Однако, Resize добавляет новые элементы в конец, и тогда сдвигать придется "ручками".
double buf[MAX]; if(bNewData) { ArrayCopy(buf, buf, 0, 1, MAX - 1); buf[MAX-1] = dNewValue; }
//========процедура сдвига всего 3-x мерного массива buf на 1 индекс======== ArraySetAsSeries(buf,true); //"переворачиваем" массив ArrayCopy(buf, buf, ArrayRange(buf,1)*ArrayRange(buf,2), 0, WHOLE_ARRAY-1); ArraySetAsSeries(buf,false);//возвращаем в исходное значение
Замерял по скорости еще два способа (через промежуточный массив и банальный перенос в циклах), так они оказались медленнее, чем указанный.
Проблему решил. Не знаю, может это и очевидно, но на всякий случай напишу. Мало ли... кому-то может пригодится. ;о) VNN, спасибо за подсказку. На самом деле делается так:
Замерял по скорости еще два способа (через промежуточный массив и банальный перенос в циклах), так они оказались медленнее, чем указанный.
Здравствуйте,
задался таким же вопросом. Сейчас вижу, что ArraySetAsSeries нельзя применять к многомерным массивам (возможно в 2007г. это было возможно)
Жаль что MQL до сих пор так и не придумал команду для смещения значений массивов.
Как сейчас сдвигать многомерные массивы? Полным перебором и копированием в цикле? Жалко терять процессорное время (а следовательно время на оптимизацию) на такую операцию.
Здравствуйте,
задался таким же вопросом. Сейчас вижу, что ArraySetAsSeries нельзя применять к многомерным массивам (возможно в 2007г. это было возможно)
Жаль что MQL до сих пор так и не придумал команду для смещения значений массивов.
Как сейчас сдвигать многомерные массивы? Полным перебором и копированием в цикле? Жалко терять процессорное время (а следовательно время на оптимизацию) на такую операцию.
Пытаюсь решить следующую проблему.
Есть некий массив (например, 1000 элементов), в который помещаются некие ценовые данные по последним 1000 барам. Порядок баров соответствует порядку элементов в массиве. Т.е. для 0 бара данные в 0 индексе массива, для 1 бара – в 1 индексе и т.д.
Массив объявлен на глобальном уровне. Возникает новый бар, и теперь уже он имеет номер 0, а «старый» нулевой бар имеет номер 1 и т.д. Т.е. имеет место ротация индексов баров. Соответственно необходимо сделать аналогичную ротацию массива БЕЗ пересчета всех его значений (предварительно увеличив его размер).
А теперь сам вопрос. Можно ли это как-то сделать средствами MQL? Желательно максимально оптимально по скорости. Я экспериментировал, пытаясь назначить массив как тайм серию, но эффекта это не дало – новые элементы добавляются в конец индексов (т.е. если массив n, то новый элемент массива становится n+1).
Заранее признателен за помощь.
если считать ваш массив кольцевым буфером, то индекс высчитывается через модуль по размеру - и ненадо ничего наместе копировать

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть некий массив (например, 1000 элементов), в который помещаются некие ценовые данные по последним 1000 барам. Порядок баров соответствует порядку элементов в массиве. Т.е. для 0 бара данные в 0 индексе массива, для 1 бара – в 1 индексе и т.д.
Массив объявлен на глобальном уровне. Возникает новый бар, и теперь уже он имеет номер 0, а «старый» нулевой бар имеет номер 1 и т.д. Т.е. имеет место ротация индексов баров. Соответственно необходимо сделать аналогичную ротацию массива БЕЗ пересчета всех его значений (предварительно увеличив его размер).
А теперь сам вопрос. Можно ли это как-то сделать средствами MQL? Желательно максимально оптимально по скорости. Я экспериментировал, пытаясь назначить массив как тайм серию, но эффекта это не дало – новые элементы добавляются в конец индексов (т.е. если массив n, то новый элемент массива становится n+1).
Заранее признателен за помощь.