Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey
20
Andrey  

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

имеется массив из 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?

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

Левитин Сергей В.
5169
Левитин Сергей В.  

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

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

Dmitry Fedoseev
47743
Dmitry Fedoseev  

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

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

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

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

_SERG_
119
_SERG_  

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий