Помогите с массивом, пожалуйста!

 

Привет!

Использую в эксперте индикатор, выдающий ряд значений (условно) следующего вида:

100,100,100,150,150,150,150,150,10,10,10,10,10,10,10,10,10,10,200,200,200,200,200 и т.п.

Хотелось бы создать в эксперте массив, в котором бы хранились только значения 100,150,10,200 (т.е. только новые, чтобы можно было их корректно усреднить). В идеале, хотелось бы, чтобы количество этих элементов в массиве могло оптимизироваться через внешнюю переменную.

Может, кто-нибудь сможет помочь организовать код? Я честно промучался несколько дней, пытаясь разобраться сам. :)

 
А критерий отбора значений из этого ряда какой? Да и последовательности "100,150,10,200 (т.е. только новые,... " в ряду не видно. Критерий "новости" значения?
 
Babay:
А критерий отбора значений из этого ряда какой? Да и последовательности "100,150,10,200 (т.е. только новые,... " в ряду не видно. Критерий "новости" значения?

В качестве критерия новизны можно использовать, к примеру, "первое значение не равное трем одинаковым предыдущим". Значения могут повторяться в массиве, это не возбраняется, при условии, что они не идут одно за другим...

 
Idalgo:
Babay:
А критерий отбора значений из этого ряда какой? Да и последовательности "100,150,10,200 (т.е. только новые,... " в ряду не видно. Критерий "новости" значения?

В качестве критерия новизны можно использовать, к примеру, "первое значение не равное трем одинаковым предыдущим". Значения могут повторяться в массиве, это не возбраняется, при условии, что они не идут одно за другим...

Если "... к примеру...", то вроде бы так:

bool bTmp
int i, k, n;
int iaSrc[] // source
int iaTgt[] // target

bTmp = false;

bTmp = (iaSrc[k] <> iaSrc[k - 1]); // если не равно предыдущему
if (bTmp)
{
bTmp = (iaSrc[k-1] == iaSrc[k-2]) && // и все три предыдущие равны
(iaSrc[k-1] == iaSrc[k-3]);

}


i = ArraySize(iaTgt);
bTmp = (iaSrc[k] == iaTgt[i - 1]); // и не равно предыдущему из уже имеющихся
if (bTmp)
{
ArrayResize(iaTgt, i + 1}; // добавляем, млин
iaTgt[i] = iaSrc[k];
}


Примерно так. Последовательность проверки зависит от того, какие условя более вероятны.

Только в чем проблема, я так и не понял :) Количество элементов в массиве-назначении будет зависеть от количества поступающих данных, удовлетворяющих условию. Если данные в этом массиве надо ограничить количественно, то тогда он должен быть организован, как стек. Ну типа FIFO или FILO. Как тебе надо...

 
Babay:
Idalgo:
Babay:
А критерий отбора значений из этого ряда какой? Да и последовательности "100,150,10,200 (т.е. только новые,... " в ряду не видно. Критерий "новости" значения?

В качестве критерия новизны можно использовать, к примеру, "первое значение не равное трем одинаковым предыдущим". Значения могут повторяться в массиве, это не возбраняется, при условии, что они не идут одно за другим...

Если "... к примеру...", то вроде бы так:


Примерно так. Последовательность проверки зависит от того, какие условя более вероятны.

Только в чем проблема, я так и не понял :) Количество элементов в массиве-назначении будет зависеть от количества поступающих данных, удовлетворяющих условию. Если данные в этом массиве надо ограничить количественно, то тогда он должен быть организован, как стек. Ну типа FIFO или FILO. Как тебе надо...

Babay, благодарю за код! Только мне показалось, что это не прямо так, скажем, mql4 по виду таких отрывков, как:

if bTmp 
{
ArrayResize(iaTgt, i + 1}; // добавляем, млин
iaTgt[i] = iaSrc[k];
}

Но, думаю, ты имел в виду, что мне тоже надо головой подумать, чтобы это как-то приспособить, а не просто копи-пейстом прикрутить... :) А как организовать это дело как стек? Я, в общем, на этом и застрял, чтобы из массива удалялись первые значения... :)