OBJ_REGRESSION: по какой формуле считается ширина канала?

 

Вопрос к разработчикам - а что за хитрая формула используется в OBJ_REGRESSION? :)

Попросили подправить индикатор регрессии, чтобы он точно совпадал с OBJ_REGRESSION.

Счтаю ширину канала регрессии как максимальное отклонение цены закрытия бара от средней линии регрессии. В итоге получаю небольшое расхождение с реальной шириной канала буквально в 1-2 пункта.

PS. Код пока не аттачу, но если надо - добавлю.


 
RickD:

Вопрос к разработчикам - а что за хитрая формула используется в OBJ_REGRESSION? :)

Попросили подправить индикатор регрессии, чтобы он точно совпадал с OBJ_REGRESSION.

Счтаю ширину канала регрессии как максимальное отклонение цены закрытия бара от средней линии регрессии. В итоге получаю небольшое расхождение с реальной шириной канала буквально в 1-2 пункта.

PS. Код пока не аттачу, но если надо - добавлю.


Делал когда-то. Проблема была в разном количестве баров для расчета.
 
RickD:

Вопрос к разработчикам - а что за хитрая формула используется в OBJ_REGRESSION? :)

Попросили подправить индикатор регрессии, чтобы он точно совпадал с OBJ_REGRESSION.

Счтаю ширину канала регрессии как максимальное отклонение цены закрытия бара от средней линии регрессии. В итоге получаю небольшое расхождение с реальной шириной канала буквально в 1-2 пункта.

PS. Код пока не аттачу, но если надо - добавлю.


Может нормализированы цены? Или переведены в 4-х знак.
 

Вообще не понятно - как в канале линейной регрессии у разработчиков считаются границы. На рисунке видно - что границы ни через один Close не проходят.


 

Еще один вариант. Тут граница вообще улетает за все Close.


 
https://forum.mql4.com/ru/70824/page10#1028767
 

После проведения исследований удалось получить формулу для вычисления границ регрессии, совпадающих с графическим инструментом OBJ_REGRESSION:

Для массива close (который по умолчанию таймсерия) :

   int n=m_pos[1]-m_pos[0]+1;
//---- calculate price values
   double value=Close[m_pos[0]];
   double a,b,c;
   double sumy=value;
   double sumx=0.0;
   double sumxy=0.0;
   double sumx2=0.0;
   for(i=1; i<n; i++)
     {
      value=Close[m_pos[0]+i];
      sumy+=value;
      sumxy+=value*i;
      sumx+=i;
      sumx2+=i*i;
     }
   c=sumx2*n-sumx*sumx;
   if(c==0.0) return;
   b=(sumxy*n-sumx*sumy)/c;
   a=(sumy-sumx*b)/n;
   m_value[0]=a;
   m_value[1]=a+b*(n-1);
//---- maximal deviation
   double maxdev=0;
   double deviation=0;
   double dvalue=a-b*2;
   for(i=0; i<n; i++)
     {
      value=Close[m_pos[0]+i];
      dvalue+=b;
      deviation=fabs(value-dvalue);
      if(maxdev<=deviation) maxdev=deviation;
     }
maxdev и будет расстояние от центральной линии регрессии до границы.
Причина обращения: