Такое ощущение, что нет смещения значений массива. Почему? Помогите понять.

 
Вот простенький фрагмент программы. Накапливаем значения массива. Сдвигаем элементы. Считаем среднее. Но есть ощущение, что что-то не так. Среднее значение иногда похоже на правду, а иногда совсем не похоже.

int First = 0;

int start()
{

double FRC15[5], FRC15S;

// Набираем значения массива
if (First < 5)
{
FRC15[5-First-1] = iForce(NULL,PERIOD_M15,13,MODE_SMA,PRICE_CLOSE,0);
First++;
Print("Preparing...");
return(0);
}

// На очередном тике переприсваем значения элементов массива (сдвигаем)
for (cnt=4; cnt<0; cnt--)
{
FRC15[cnt] = FRC15[cnt-1];
}
FRC15[0] = iForce(NULL,PERIOD_M15,13,MODE_SMA,PRICE_CLOSE,0);

// Вычисляем среднее
for (cnt=0; cnt<5; cnt++)
{
FRC15S+= FRC15[cnt];
}

FRC15S/= 5;

Comment(" * FRC15S = ", FRC15S*10);
}

Уважаемый komposter считает, что "...условие "for (cnt=4; cnt<0; cnt--)" никогда не сработает, поэтому и нет смещения значений массива."

Объясните пожалуйста, почему? И как сделать правильно.

С уважением ко всем,
Алексей.
 
Зачем такие сложности, используйте либо индикаторные буфера, либо
bool ArraySetAsSeries( double& array[], bool set)


Устанавливает направление индексирования в массиве. Значение параметра set TRUE устанавливает направление индексирования в обратном порядке, то есть, последний элемент имеет нулевой индекс. Значение FALSE устанавливает нормальное направление индексирования. Функция возвращает предыдущее состояние.

Параметры

array[] - Числовой массив для установки.
set - Направление индексирования массива.

Пример

double macd_buffer[300];
double signal_buffer[300];
int i,limit=ArraySize(macd_buffer);
ArraySetAsSeries(macd_buffer,true);
for(i=0; i<limit; i++)
macd_buffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++)
signal_buffer[i]=iMAOnArray(macd_buffer,limit,9,0,MODE_SMA,i);

 
Уважаемый komposter считает, что "...условие "for (cnt=4; cnt<0; cnt--)" никогда не сработает, поэтому и нет смещения значений массива."
прям таки уважаемый =)))
читаем справку по оператору for:
for (выражение1; выражение2; выражение3)
оператор;

Выражение 1 описывает инициализацию цикла. Выражение 2 - проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for, выполняется выражение 3. Все повторяется, пока выражение 2 не станет ложным.
Если оно ложно, цикл заканчивается и управление передается следующему оператору. Выражение З вычисляется после каждой итерации.
если при инициализации цикла cnt = 4, то делается порверка выражения 2, если оно истинно (cnt < 0), то выполняется тело цикла.
В нашем случае оно изначально ложно - 4 больше 0.
Поэтому тело цикла не выполняется.

Правильно было бы написАть
for (cnt=4; cnt>0; cnt--)
 
а проще действительно использовать буфер индикатора: ;)
average = (iForce(NULL,PERIOD_M15,13,MODE_SMA,PRICE_CLOSE,0) +  iForce(NULL,PERIOD_M15,13,MODE_SMA,PRICE_CLOSE,1) +  iForce(NULL,PERIOD_M15,13,MODE_SMA,PRICE_CLOSE,2) +  iForce(NULL,PERIOD_M15,13,MODE_SMA,PRICE_CLOSE,3) +  iForce(NULL,PERIOD_M15,13,MODE_SMA,PRICE_CLOSE,4) ) / 5;
 
ну, или если грамотно, то так: =)
double summ = 0.0, average = 0.0;
for ( int i = 0; i < 5; i ++ ) { summ += iForce(NULL,PERIOD_M15,13,MODE_SMA,PRICE_CLOSE,i); }
average = summ/5;
 
Да, я понял. Спасибо. Но в процессе текущей переписки возникает еще один вопрос сомнение:

Пример, приведенный ув. Rosh - ведь он считает среднее за "i" баров. Так ведь? А я хотел считать среднее за несколько тиков внутри одного бара. Достаточно длинного, скажем - М15.

Просветите, если можно. И не злитесь, если мои вопросы кажутся идиотскими. Я только начинаю этим заниматься. Хорошо бы найти человека, живущего в Москве и способного за кружечкой пива, изредка давать консультации. Я ведь тем самым ни у кого ничего не краду и ничьих интересов не нарушаю. Правда ведь?
 
да, это Рош меня запутал =)))
тогда вроде бы всё правильно, только цикл исправить...
 
и ещё - перед "// Вычисляем среднее" надо добавить FRC15S = 0.0;
А то оно "держит в уме" все предыдущие значения ;)
Причина обращения: