Зачем такие сложности, используйте либо индикаторные буфера, либо
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);
Устанавливает направление индексирования в массиве. Значение параметра 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), то выполняется тело цикла.оператор;
Выражение 1 описывает инициализацию цикла. Выражение 2 - проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for, выполняется выражение 3. Все повторяется, пока выражение 2 не станет ложным.
Если оно ложно, цикл заканчивается и управление передается следующему оператору. Выражение З вычисляется после каждой итерации.
В нашем случае оно изначально ложно - 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.
Просветите, если можно. И не злитесь, если мои вопросы кажутся идиотскими. Я только начинаю этим заниматься. Хорошо бы найти человека, живущего в Москве и способного за кружечкой пива, изредка давать консультации. Я ведь тем самым ни у кого ничего не краду и ничьих интересов не нарушаю. Правда ведь?
Пример, приведенный ув. Rosh - ведь он считает среднее за "i" баров. Так ведь? А я хотел считать среднее за несколько тиков внутри одного бара. Достаточно длинного, скажем - М15.
Просветите, если можно. И не злитесь, если мои вопросы кажутся идиотскими. Я только начинаю этим заниматься. Хорошо бы найти человека, живущего в Москве и способного за кружечкой пива, изредка давать консультации. Я ведь тем самым ни у кого ничего не краду и ничьих интересов не нарушаю. Правда ведь?
да, это Рош меня запутал =)))
тогда вроде бы всё правильно, только цикл исправить...
тогда вроде бы всё правильно, только цикл исправить...
и ещё - перед "// Вычисляем среднее" надо добавить FRC15S = 0.0;
А то оно "держит в уме" все предыдущие значения ;)
А то оно "держит в уме" все предыдущие значения ;)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
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--)" никогда не сработает, поэтому и нет смещения значений массива."
Объясните пожалуйста, почему? И как сделать правильно.
С уважением ко всем,
Алексей.