Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Продавай продукты через Маркет и отслеживай статистику продаж
Andrey
20
Andrey 2011.12.27 16:57 

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

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

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

Левитин Сергей В.
5160
Левитин Сергей В. 2011.12.27 17:04  

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

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

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

ArrayCopy(ar,ar,0,1);
Sergey Kovalyov
893
Sergey Kovalyov 2012.01.01 11:40  
+1 за циклический буфер. Это ж паттерн программирования. =)
_SERG_
84
_SERG_ 2012.01.01 16:22  
Напиши в личку. Скажу как я делал.
_SERG_
84
_SERG_ 2012.01.01 16:44  
- Значение с Нулевым индексом становится Первым, Превое вторым...., последнее в массиве удаляется и его место занимает предпоследнее. где-то так.
Dmitry Fedoseev
42924
Dmitry Fedoseev 2012.01.01 16:58  
Новая задача добавляется в конец массива, попытки выполнить задачи из очереди выполняются с начала массива, если задача выполнена, массив сдвигается влево и укорачивается. Можно конечно не укорачивать, а в переменной хранить количество задач. Кольцо здесь не подходит.
Комбинатор
15932
Комбинатор 2012.01.01 17:06  
+1 за циклический буфер. Это наиболее эффективное решение для очереди ограниченной длины
_SERG_
84
_SERG_ 2012.01.01 17:15  

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

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

_SERG_
84
_SERG_ 2012.01.01 17:26  

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

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

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