Канал линейной регрессии - страница 18

 
Вот вот компактный, быстрый вариант параболической и линейной регрессии на mql4, но как избавиться от одного цикла при расчете величины sxxy я пока так и не придумал.
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrDeepSkyBlue
#property indicator_color2 clrRed
#property indicator_width1 2
#property indicator_width2 2
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
//================================
extern int p = 24;
//================================
double lr[],qr[];
double lwi,mai,fxi;
double ci,cp,sy,sxy,sxxy,lri,qri;
double a1,a2;
int w,n;
//*************************************************
int init()
{
   SetIndexBuffer(0,qr);
   SetIndexBuffer(1,lr);
   //-----------------------
   if (p<3) p=3;
   
   return(0);
}
//*******************************************************************
int start()
{
   int cbi=Bars-IndicatorCounted()-1; if (cbi<0) return(-1);
   if (cbi==0) return(0); if (cbi==1) cbi=0; 
   if (cbi>1)
   { 
      cbi=Bars-p-1;
     
      sy=0; sxy=0; w=0;  
      for(int j=1; j<=p; j++) 
      {
         ci=Open[cbi+p-j];
         sy+=ci; 
         sxy+=j*ci;
         w+=j; 
      }
      cbi--;
      
      a1=6.0/(p*(p+1)*(2*p+1))*(10-15.0/(p+2)); 
      a2=12-15.0/(p+2);
   }
   //----------------------------------------
   for (int i=cbi; i>=0; i--) 
   {
      sxxy=0;
      for (int j=1; j<=p; j++)
         sxxy+=j*j*Open[i+p-j];
      
      ci=Open[i]; 
      cp=Open[i+p];
      
      sxy+=ci*p-sy;
      sy+=ci-cp;
      
      mai=sy/p;
      lwi=sxy/w;
      
      lri=3*lwi-2*mai;
      
      qri=3*mai+a1*sxxy-lwi*a2;
      
      qr[i]=qri;
      lr[i]=lri;
   }
   //----------------------------------------
   return(0);
}
//*********************************************************



 
Yousufkhodja Sultonov:

Индикатр работает 

И где сейчас счастья ищешь, опять что-нибудь с потолка (типа горнорудной промышленности)?
 
ANG3110:
Вот вот компактный, быстрый вариант параболической и линейной регрессии на mql4, но как избавиться от одного цикла при расчете величины sxxy я пока так и не придумал.

А какой смысл в этом ?

Попробуй применить этот код для просчета регрессии в другом месте, скажем, если у тебя имеется массив величин - придется довольно глубоко вникать в работу кода. И зачем, если разумнее сделать наоборот, пусть код будет не таким эффективным, зато легко модифицируемым.

Лично у меня класс регрессии имеет три виртуальные функции - получения количества точек, и их координат, чтобы применить регрессию - надо объявить класс, где перегрузить эти функции на необходимые - и сразу же получаем коэффициента полинома регрессии любой степени от нулевой до третьей. Кроме того, есть еще две необязательных функции - для получения весов и "полярной точки" (то есть такой точки, через которую полином обязательно должен пройти), но эти функции можно не использовать, веса будут приравнены к единице, а полином будет рассчитан без полярной точки.   Может быть, и не столь эффективно (как за счет внутренних циклов, так и за счет виртуальных функций), но зато, очень гибко, и без необходимости разбираться.

 
Georgiy Merts:

А какой смысл в этом ?

Попробуй применить этот код для просчета регрессии в другом месте, скажем, если у тебя имеется массив величин - придется довольно глубоко вникать в работу кода. И зачем, если разумнее сделать наоборот, пусть код будет не таким эффективным, зато легко модифицируемым.

Лично у меня класс регрессии имеет три виртуальные функции - получения количества точек, и их координат, чтобы применить регрессию - надо объявить класс, где перегрузить эти функции на необходимые - и сразу же получаем коэффициента полинома регрессии любой степени от нулевой до третьей. Кроме того, есть еще две необязательных функции - для получения весов и "полярной точки" (то есть такой точки, через которую полином обязательно должен пройти), но эти функции можно не использовать, веса будут приравнены к единице, а полином будет рассчитан без полярной точки.   Может быть, и не столь эффективно (как за счет внутренних циклов, так и за счет виртуальных функций), но зато, очень гибко, и без необходимости разбираться.

Эти быстрые варианты, для специфичных целей, именно тех, где нужна скорость, при тестировании и положение конца регрессии. Если нужны коэффициенты и различная степень полинома, то я применяю вот такой вариант.Тут массив коэффициетов в коде - X[]. То есть тут исчерпывающая информация, для построения кривых на любую глубину. Если говорить о целесообразности чего-либо, так наверное как кому нужно. В торговле я это не использую, пока только для специфических исследовательских целей.
#property strict
//********************************************************************
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrMediumSlateBlue
#property indicator_width1 2
#property indicator_type1 DRAW_LINE
//================================
extern int p = 120;
extern int m = 2;
//================================
double fx[];
double a[],b[],sx[],x[];
double ci,sum;
int N;
//********************************************************************
int init()
{
   SetIndexBuffer(0,fx);
   //------------------------------------------------
   N=m+1;
  
   if (p<N+2) p=N+2;
  
   ArrayResize(sx,2*N);
   ArrayResize(a,N*N);
   ArrayResize(b,N);
   ArrayResize(x,N);
  
   return(0);
}
//********************************************************************
int start()
{
   int cbi=Bars-IndicatorCounted()-1; if (cbi<0) return(-1);
   if (cbi==0) return(0);
  
   //--------sx-------
   sx[0]=p;
   for(int n=1; n<N*2; n++)
   {
      sum=0;
      for(int j=0; j<p; j++)
         sum+=MathPow(j,n);
      sx[n]=sum;
   } 
   //-------syx--------
   for(int n=0; n<N; n++)
   {
      sum=0;
      for(int j=0; j<p; j++)
      {
         ci=Open[j];
         if (n==0) sum+=ci; else
         sum+=ci*MathPow(j,n);
      }
      b[n]=sum;
   }
   //------Matrix------
   for(int j=0; j<N; j++)
   for(int n=0; n<N; n++)
      a[n+j*N]=sx[n+j];
   //------Gauss-------
   af_Gauss(N,a,b,x);
   //------------------
   for (int j=0; j<p; j++)
   {
      sum=x[0];
      for(int n=1; n<N; n++)
         sum+=x[n]*MathPow(j,n);
        
      fx[j]=sum;
   }
  
   SetIndexDrawBegin(0,Bars-p);
  
   return(0);
}
//***************************************************************
void af_Gauss(int M, double& A[],double& B[], double& X[])
{
   double r,s;
   for(int k=0; k<M-1; k++)
   for(int i=k+1; i<M; i++)
   {
      r=0; if (A[k+k*M]!=0) r=A[k+i*M]/A[k+k*M];
      for(int j=k; j<M; j++)
         A[j+i*M]-=A[j+k*M]*r;
      B[i]-= B[k]*r;
   }
   if (A[M-1+(M-1)*M]!=0) X[M-1]=B[M-1]/A[M-1+(M-1)*M]; else X[M-1]=0;

   for(int i=M-2; i>=0; i--)
   {
      s=0;
      for(int j=i+1; j<M; j++)
         s+=A[j+i*M]*X[j];
      if (A[i+i*M]!=0) X[i]=(B[i]-s)/A[i+i*M]; else X[i]=0;
   }
}
//***************************************************************
 
Готов опроверннуть укоренившееся мнение о везлесущности и незаменимости полиномов любой  степени. На реальных примерах участников докажу, что полиномы проигрывают почти по  всем показателям регрессии УРМ (выше давал ссылку), чтобы навсегда забыть о непотопляемости полиномов.
 
Yousufkhodja Sultonov:
Готов опроверннуть укоренившееся мнение о везлесущности и незаменимости полиномов любой  степени. На реальных примерах участников докажу, что полиномы проигрывают почти по  всем показателям регрессии УРМ (выше давал ссылку), чтобы навсегда забыть о непотопляемости полиномов.

Да не надо, вы уже давно всем все доказали, мы верим

 
TheXpert:

В свою очередь на что? Да класть мне на него, пока он не начинает бегать по техническим темам, особенно касающихся плюсов, пороть чушь и тролить участников, с упоминанием "клуба" и прочего бреда.

Просто в этой теме его троллинг красиво перевели в самобан, за что я и поблагодарил.

Ну как же можно пройти мимо такого? И не мечтай. Вот очередной отжег в клубе - 11 страниц нафигачили, пересрались между собой, а тяма ни у кого не хватает нормальный тест написать - проверить и аргументировано отстоять свою позицию. А лучше бы просто объединить усилию, и разобраться хотя бы для себя. Это называется супертехнические специалисты по плюсам... представляю, что он там на своих плюсах пишут.

Тут вот еще один клуб соорганизовался Клуб жертв ООП с новыми концепциями - оказывается если наследование не используется, то это уже не ООП, такая вот фигня. И тоже тяма не хватает взять написать тест и проверить что когда быстрее - когда полиморфизм, а когда свич и т.д. ...и все те же лица, знакомые нам по клубу жертв с++.

 
Vladimir Baskakov:
И где сейчас счастья ищешь, опять что-нибудь с потолка (типа горнорудной промышленности)?

Нигде нет рецептов "счастья", бесполезно искать. Довольствуюсь тем, что удалось достичь. Горжусь тем, что, удалось разработать УРМ https://www.mql5.com/ru/articles/250 и "Теорию рынка" https://www.mql5.com/ru/articles/1825, но, их поймут лет через 100 или более. Я ранее говорил, что,  https://www.mql5.com/ru/forum/318795/page17#comment_13020163 индикатор упорно ждет своего часа и он наступил:


Канал линейной регрессии
Канал линейной регрессии
  • 2019.08.29
  • www.mql5.com
Есть индикатор линейной регрессии. Как встроить его расчет в советник и получить данные на 0 баре или на 1...
 
Yousufkhodja Sultonov:

Нигде нет рецептов "счаст

Жалко ваших студентов, Semko давно доказал несостоятельность этой идеи
 
Dmitry Fedoseev:

Если получается найти решение без рекурсии, то оно лучше чем с рекурсией. 

Всё гуд