Вопрос к разработчикам по поводу "Канала линейной регрессии" - страница 2

 
Уважаемый Slawa , не могли бы Вы пояснить, как задействовано далее значение, полученное в приведенной ниже строке кода?
m_value[1]=a+b*n;

Если я правильно понял, то это значение цены на линии, соответствующее бару, следующему за последним баром выборки вправо.

Заранее спасибо.
 
не могли бы Вы пояснить, как задействовано далее значение, полученное в приведенной ниже строке кода?
m_value[1]=a+b*n;

Если я правильно понял, то это значение цены на линии, соответствующее бару, следующему за последним баром выборки вправо.

Это - значение цены на последнием баре выборки (то есть этот бар включается в выборку)
 
Спасибо.

Все-же, если я правильно понял мысль уважаемого Yurixx-а, то:

Бары в выборке нумеруются с 0 по n-1
for(i=0; i<n; i++) 
...


При строгом условии i<n переменная цикла никогда не достигнет равенства n, а, следовательно, последний бар выбрки имеет номер n-1.

Именно эти номера баров используются в уравнении y(i)=b*i+a.
Следовательно, на первом баре выборки значение линейной регрессии считается как a+b*0 - совпадает, а на последнем баре считается как a+b*(n-1) - не совпадает.

Если я неправ, то покажите, пожалуйста, в чем.

ЗЫ.: Самые коварные ошибки, частенько, кроются всего в нескольких символах исходного кода.

 
Действительно, Вы правы. В ближайшее время будет исправление
 
На самом деле, то что счёт с 1 - правильно. Так как начальное значение задаётся в переменную Value, и при i==0 нет смысла проводить операции умножения на 0. Так что, исходный вариант первоначального расчёта был верный. А конечное значение действительно надо получать через (n-1) - спасибо Yurixx'у

Вот окончательный вариант
   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;
   for(i=0; i<n; i++)
     {
      value=Close[m_pos[0]+i];
      dvalue+=b;
      deviation=fabs(value-dvalue);
      if(maxdev<=deviation) maxdev=deviation;
     }


Бывает у нас ещё "с шашкой наперевес". Исправленный билд выложен.

Всем спасибо за дискуссию.

 
У меня еще один вопрос.
Как я понял вышеприведенный скрипт написан не на mql4 и используется программной частью?
Но вот допустим я хотел бы использовать канал линейной регрессии с линиями максимального размаха по High/Low.
Для этого мне приходится стоить сложный зацикленный скрипт, который прилично грузит процессор.
Есть ли возможность сделать это наподобии как сделано у Вас со стандартным интрументальным каналам, без зацикленного скрипта?

Заранее благодарю за ответ - Александр.
 
Я сделал цикл со Sleep(1000) , выглядит конечно не так фирменно, как встроенный (так красиво не потаскаешь), зато и нагрузки никакой. Единственная проблема - наличие скрипта не заметно на глаз и про него можно забыть.
 
На самом деле, то что счёт с 1 - правильно. Так как начальное значение задаётся в переменную Value, и при i==0 нет смысла проводить операции умножения на 0. Так что, исходный вариант первоначального расчёта был верный. А конечное значение действительно надо получать через (n-1) - спасибо Yurixx'у


Я уж так обрадовался, но в bild 194 осталась еще ошибка в расчете максимального размаха.
Рисунок прикладываю
Синим канал MT4.
Зеленым - вариант, как должно быть.
И вот еще - вариант кода, чтобы было правильно.

//---- maximal deviation
double maxdev=0;
double dvalue;
double linreg;
for(i=0; i<n; i++)
{
linreg=a+b*(m_pos[0]+i);
value=Close[m_pos[0]+i];
dvalue=MathAbs(value-linreg);
if( dvalue>=maxdev) maxdev=dvalue;
}

Но размах - ей богу лучше б сделали по High/Low, а то по Close - это не то, - какой-то полуфабрикат.

//---- maximal deviation
double maxdev=0;
double dvalueH, dvalueL;
double linreg;
for(i=0; i<n; i++)
{
linreg=a+b*(m_pos[0]+i);
dvalueH=MathAbs(High[m_pos[0]+i]-linreg);
dvalueL=MathAbs(linreg-Low[m_pos[0]+i]);
if( dvalueH>=maxdev) maxdev=dvalueH;
if( dvalueL>=maxdev) maxdev=dvalueL;
}

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

Тут много нюансов, которые надо хорошо обдумать.
 
А может дополнительные уровни приделать к каналу стандартного отклонения, наподобие Fibo ?
Как вариант...
Причина обращения: