Ошибка переноса кода индикатора в советник

 

Друзья, подскажите, инициализирую массив типа double в эксперте (в индикаторе это был буффер вывода по которому рисовался индик), делаю расчет переменной double и присваиваю ее значение i-ому элементу массива.

Вывожу значение через Print/Comment - значение переменной выводит, а значение любого из элементов массива всегда нулевое. Почему?

 

double NANO(int k)
  {
   double     HH, LL;
   double     best[];
   double     best_MA;
  
   for(int s=k; s < BESTperiod+k; s++)
      {
         HH = High[s] - High[s+1];
         LL = Low[s] - Low[s+1];
      
      double pp = (HH + LL)/Point;    
      best[s] = pp;
      //Print("pp[", s, "]: ", pp);
      Print("best[", s, "]: ", best[s]);
      }
      
   Comment(
   "\n\n best: ", best[0]
   );
      best_MA = iMAOnArray(best,0,BESTperiod,0,MODE_SMA,k);
      
return(best_MA);
  }


 

 
Vitaliy Hudyakov:

Друзья, подскажите, инициализирую массив типа double в эксперте (в индикаторе это был буффер вывода по которому рисовался индик), делаю расчет переменной double и присваиваю ее значение i-ому элементу массива.

Вывожу значение через Print/Comment - значение переменной выводит, а значение любого из элементов массива всегда нулевое. Почему?

double NANO(int k)
  {
   double     HH, LL;
   double     best[];
   double     best_MA;
   int n=0;
   for(int s=k; s < BESTperiod+k; s++)
      {
      n++;
         HH = High[s] - High[s+1];
         LL = Low[s] - Low[s+1];
      
      double pp = (HH + LL)/Point;
      ArrayResize(best,n);  
      best[n-1] = pp;
      //Print("pp[", s, "]: ", pp);
     // Print("best[", s, "]: ", best[s]);
      }
      
   Comment(
   "\n\n best: ", best[0]
   );
      best_MA = iMAOnArray(best,0,BESTperiod,0,MODE_SMA,k);
      
return(best_MA);
  }
 
Благодарю, вечером попробую!
 
Vitaly Muzichenko:
double NANO(int k)
  {
   double     HH, LL;
   double     best[];
   double     best_MA;
   int n=0;
   for(int s=k; s < BESTperiod+k; s++)
      {
      n++;
         HH = High[s] - High[s+1];
         LL = Low[s] - Low[s+1];
      
      double pp = (HH + LL)/Point;
      ArrayResize(best,n);  
      best[n-1] = pp;
      //Print("pp[", s, "]: ", pp);
     // Print("best[", s, "]: ", best[s]);
      }
      
   Comment(
   "\n\n best: ", best[0]
   );
      best_MA = iMAOnArray(best,0,BESTperiod,0,MODE_SMA,k);
      
return(best_MA);
  }

 

 

Только добрался до кода.

Попробовал поменять - лучше не стало. В массив заносятся непонятно какие данные, с данными индюка при тех же параметрах не сходятся. 

 
Vitaliy Hudyakov:

 

 

Только добрался до кода.

Попробовал поменять - лучше не стало. В массив заносятся непонятно какие данные, с данными индюка при тех же параметрах не сходятся. 

Похоже, Ваш индикатор считает такую функцию

double NANO(int k)
{
   double     HH, LL;
   double     best_MA;
  
   HH = High[k] + High[k+1] - High[k+BESTperiod-1] - High[k+BESTperiod];
   LL = Low[k] + Low[k+1] - Low[k+BESTperiod-1] - Low[k+BESTperiod];
   best_MA = 0.5 * ( HH + LL ) / Point / ( BESTperiod - 1 );

   return(best_MA);
}


 

 
Mislaid:

Похоже, Ваш индикатор считает такую функцию

double NANO(int k)
{
   double     HH, LL;
   double     best_MA;
  
   HH = High[k] + High[k+1] - High[k+BESTperiod-1] - High[k+BESTperiod];
   LL = Low[k] + Low[k+1] - Low[k+BESTperiod-1] - Low[k+BESTperiod];
   best_MA = 0.5 * ( HH + LL ) / Point / ( BESTperiod - 1 );

   return(best_MA);
}


 

 

Нет, у меня формула иная. А что это за формула, откуда? 

 
Vitaliy Hudyakov:

 

Нет, у меня формула иная. А что это за формула, откуда? 

Я просто преобразовал Вашу скользящую среднюю, зная алгоритм ее вычисления. На примере. Пусть BESTperiod = 4. Будем вычислять составляющую НН.

Если бы мы писали это в массив, то увидели бы 4 значения:

(H1 - H2); (H2 - H3); (H3 - H4); (H4 - H5), где H - это High[]

Скользящая средняя с периодом  BESTperiod вычисляется по формуле:

( 0.5 * (H1 - H2) + (H2 - H3) + (H3 - H4) + 0.5 *(H4 - H5) ) / ( BESTperiod  - 1 )

 Раскройте скобки в числителе, и получите ту формулу, которую я привел.