Организация очереди средствами MQL4

 

Добрый день, подскажите направление решения проблемы:

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

Пример:

[1,2,3...60] -> [2,3,4...61] -> [3,4,5...62] и т.д.

Моя функция:

double BarValues[60] = ...какие-то данные...

void ShuffleDataArray(double newValue) {

double Temp[60];

ArrayCopy(Temp, BarValues, 0, 1, 59); 
Temp[59] = newValue;

// Second copying back...

ArrayCopy(BarValues, Temp, 0, 0, 60);

Alert("Arrays Transformed"); 

}

Как видите она крайне неоптимальна. Вызов этой функции происходит каждые пять секунд (из функции start), но мой код напрочь заставляет metatrader зависнуть. Т.е. как только происходит вызов моего кода окно метатрейдера становится недоступным...

Как можно организовать оптимальную очередь FIFO?

Заранее спасибо!

 

Попробуйте в лоб, такие решения в МТ4 часто быстрее:

double BarValues[60] = ...какие-то данные...
for (i=0; i<59; i++)
{
  BarValues[i]=BarValues[i+1];
}
BarValues[59]= .... новое значение в очередь ...
Не думаю что этот примитив будет вешать терминал.
 
Laserson:

Добрый день, подскажите направление решения проблемы:

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

Пример:

[1,2,3...60] -> [2,3,4...61] -> [3,4,5...62] и т.д.

Моя функция:

Как видите она крайне неоптимальна. Вызов этой функции происходит каждые пять секунд (из функции start), но мой код напрочь заставляет metatrader зависнуть. Т.е. как только происходит вызов моего кода окно метатрейдера становится недоступным...

Как можно организовать оптимальную очередь FIFO?

Заранее спасибо!



используйте массив циклически

т.е. [1,2,3...60]-> [61,2,3...60] и запоминайте что индекс смещается - начинается с первого элемента, а нулевой будет последним

на следующем шаге [61,62,3...60] начинается со вторго, а первый будет последним и т.д.

Можно написать 2 функции - записи в такой массив и чтения

WriteArray(x double)

{

startindex++;

if (startindex==ArraySize(arr)) startindex=0;

arr[startindex]=x;

}

ну и аналогично ReadeArray. Для каждого такого циклического массива нужно запоминать текущее смещение записи в массив (переменная startindex)

 

Не нужен временный массив.

ArrayCopy(ar,ar,0,1);
 
+1 за циклический буфер. Это ж паттерн программирования. =)
 
Напиши в личку. Скажу как я делал.
 
- Значение с Нулевым индексом становится Первым, Превое вторым...., последнее в массиве удаляется и его место занимает предпоследнее. где-то так.
 
Новая задача добавляется в конец массива, попытки выполнить задачи из очереди выполняются с начала массива, если задача выполнена, массив сдвигается влево и укорачивается. Можно конечно не укорачивать, а в переменной хранить количество задач. Кольцо здесь не подходит.
 
+1 за циклический буфер. Это наиболее эффективное решение для очереди ограниченной длины
 

Насколько я понял, то начальная задача :

"... добавление нового элемента таким образом, что-бы массив сдвинулся на один элемент ( куда?) и новое (добавляемое) значение встало в (Конец/начало) конец списка."

 

У меня аналогичный вопрос возник около года назад.

Без второго массива, у меня не получилось.

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