Скачать MetaTrader 5

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

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

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--)" никогда не сработает, поэтому и нет смещения значений массива."

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

С уважением ко всем,
Алексей.
Forex Trader
114330
Forex Trader  
Зачем такие сложности, используйте либо индикаторные буфера, либо
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);

Forex Trader
114330
Forex Trader  
Уважаемый 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--)
Forex Trader
114330
Forex Trader  
а проще действительно использовать буфер индикатора: ;)
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;
Forex Trader
114330
Forex Trader  
ну, или если грамотно, то так: =)
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;
Forex Trader
114330
Forex Trader  
Да, я понял. Спасибо. Но в процессе текущей переписки возникает еще один вопрос сомнение:

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

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