Интересная функция

 

Привет!

Если не затруднит, гляньте функцию, которую я состряпал для советника.

Необходимо, чтобы функция записывала в массив текущее значение индикатора, если его текущее значение не равно предыдущему (только в этом случае!) и выводила средний результат с периодом, задаваемым значением per2.

У меня такое впечатление, что она делает не совсем то. Если есть ошибка, может, кто-нибудь сможет подправить?

Спасибо!

int xxx()
  {
  
double arr1[200];

int per1=100;
int per2=12;

int j=0; 
double IND=iCustom(Symbol(),0,"Indicator",0,1);
double INDprev=iCustom(Symbol(),0,"Indicator",0,1+1);
double result;

if (IND!=INDprev){

while (j<per1) {

arr1[j]= iCustom(Symbol(),0,"Indicator",0,j);

j++; }


ArraySetAsSeries(arr1,true);
}
result =iMAOnArray(arr1,0,per2,1,MODE_SMA,1);

return(MathRound(result));

}
 
 
Idalgo:

Привет!

...Необходимо, чтобы функция записывала в массив текущее значение индикатора, если его текущее значение не равно предыдущему (только в этом случае!)

...

if (IND!=INDprev){

while (j<per1) {

arr1[j]= IND;

j++; }

...

В этом месте пишется в первые 100 элементов массива значение функции. А остальные 100 (от 100 до 200) элементов никак не заполняются. Так ли задумывалось?

 
Talex:
Idalgo:

Привет!

...Необходимо, чтобы функция записывала в массив текущее значение индикатора, если его текущее значение не равно предыдущему (только в этом случае!)

...

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);



А так не ближе к истине?

 
D500_Rised:

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);
}
 
Idalgo:

... В чем же дело?

Попробуйте вот этот вариант:

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:
Idalgo:

... В чем же дело?

Попробуйте вот этот вариант:

Оказалось, дело было в индикаторе - попробовал функцию с другими индикаторами - все заработало. Последний вариант Talex'a также абсолютно работоспособен.

Так что всем спасибо!

Причина обращения: