Привет!
...Необходимо, чтобы функция записывала в массив текущее значение индикатора, если его текущее значение не равно предыдущему (только в этом случае!)
...
if (IND!=INDprev){
while (j<per1) {
arr1[j]= IND;
j++; }
...
В этом месте пишется в первые 100 элементов массива значение функции. А остальные 100 (от 100 до 200) элементов никак не заполняются. Так ли задумывалось?
Привет!
...Необходимо, чтобы функция записывала в массив текущее значение индикатора, если его текущее значение не равно предыдущему (только в этом случае!)
...
if (IND!=INDprev){
while (j<per1) {
arr1[j]= IND;
j++; }
...
В этом месте пишется в первые 100 элементов массива значение функции. А остальные 100 (от 100 до 200) элементов никак не заполняются. Так ли задумывалось?
Ну, просто на всякий случай массив взял с запасом. Насколько я понимаю, это не критично и среднее будет выводится, используя лишь нужное количество последних значений... :) Немного подкорректировал функцию. Наверное, должно быть вот так:
arr1[j]= iCustom(Symbol(),0,"Indicator",0,j);
double arr1[100];
int per1=100;
int per2=12;
int j=0;
double IND;
double INDprev;
double result;
while (j<per1) {
IND=iCustom(Symbol(),0,"Indicator",0,j);
INDprev=iCustom(Symbol(),0,"Indicator",0,j+1);
if (IND!=INDprev){
arr1[j]= IND; }
j++; }
ArraySetAsSeries(arr1,true);
result =iMAOnArray(arr1,0,per2,1,MODE_SMA,1);
Print(result);
return(result);
А так не ближе к истине?
double arr1[100];
int per1=100;
int per2=12;
int j=0;
double IND;
double INDprev;
double result;
while (j<per1) {
IND=iCustom(Symbol(),0,"Indicator",0,j);
INDprev=iCustom(Symbol(),0,"Indicator",0,j+1);
if (IND!=INDprev){
arr1[j]= IND; }
j++; }
ArraySetAsSeries(arr1,true);
result =iMAOnArray(arr1,0,per2,1,MODE_SMA,1);
Print(result);
return(result);
А так не ближе к истине?
Уважаемый D500_Rised! Погонял Вашу функцию - кажется, что она дает правильные результаты, в отличие от моей. Вы не в первый раз мне помогаете - я Вам очень признателен, поверьте. Спасибо!
Все-таки ничего не получается. Выработанный выше вариант просто возвращает текущее значение, но не формирует среднее значение.
Написал функцию и никак не могу понять почему она возвращает 0, а не значение индикатора.
Вроде все правильно. В чем же дело?
Может, кому-нибудь бросится в глаза ошибка?
double xxx() { double arr1[200]; int j=0,k=0; double IND,INDprev; double result; while (j<500) { IND=MathRound(iCustom(Symbol(),0,"Indicator",0,j)); INDprev=MathRound(iCustom(Symbol(),0,"Indicator",0,j+1)); if (IND!=INDprev){ k++; arr1[k]= IND; } j++; } ArraySetAsSeries(arr1,true); result =iMAOnArray(arr1,0,12,1,MODE_SMA,1); return(result); }
... В чем же дело?
Попробуйте вот этот вариант:
double xxx() { double arr1[12]; int j=0,k=0; double IND,INDprev; double result; while (j<500) { IND=MathRound(iCustom(NULL,0,"Indicator",0,j)); INDprev=MathRound(iCustom(NULL,0,"Indicator",0,j+1)); if (IND!=INDprev){ arr1[k]= IND; k++; } if(k==11)break; j++; } //ArraySetAsSeries(arr1,true); result =iMAOnArray(arr1,0,12,0,MODE_SMA,0); return(result); }
... В чем же дело?
Попробуйте вот этот вариант:
Оказалось, дело было в индикаторе - попробовал функцию с другими индикаторами - все заработало. Последний вариант Talex'a также абсолютно работоспособен.
Так что всем спасибо!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Привет!
Если не затруднит, гляньте функцию, которую я состряпал для советника.
Необходимо, чтобы функция записывала в массив текущее значение индикатора, если его текущее значение не равно предыдущему (только в этом случае!) и выводила средний результат с периодом, задаваемым значением per2.
У меня такое впечатление, что она делает не совсем то. Если есть ошибка, может, кто-нибудь сможет подправить?
Спасибо!