Canal de regressão linear - página 18

 
Aqui está uma versão compacta e rápida de regressão parabólica e linear em mql4, mas como se livrar de um ciclo ao calcular o valor sxxy que ainda não descobri.
#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 = 2 4;
//================================
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:

O indicador funciona

E onde você está procurando a felicidade agora, algo do teto novamente (como a mineração)?
 
ANG3110:
Aqui está uma variante compacta e rápida de regressão parabólica e linear em mql4, mas ainda não descobri como me livrar de um ciclo ao calcular o valor sxxy.

Qual é o objetivo disso?

Tente aplicar este código para calcular a regressão em outro lugar, digamos, se você tiver um conjunto de valores - você teria que ir bem fundo no funcionamento do código. E porque, se é mais razoável fazer o contrário, o código pode não ser tão eficiente, mas é fácil de modificar.

Pessoalmente, minha classe de regressão tem três funções virtuais - para obter o número de pontos e suas coordenadas, para aplicar a regressão - você deve declarar uma classe onde você sobrecarrega estas funções para as necessárias - e imediatamente obter o coeficiente do polinômio de regressão de qualquer grau de zero para o terceiro. Além disso, há duas funções opcionais - para obter pesos e o "ponto polar" (ou seja, o ponto pelo qual o polinômio deve necessariamente passar), mas estas funções podem ser omitidas, os pesos serão equiparados a um, e o polinômio será calculado sem o ponto polar. Pode não ser tão eficiente (tanto às custas dos loops internos quanto das funções virtuais), mas é muito flexível, e não há necessidade de descobrir.

 
Georgiy Merts:

Qual é o objetivo disso?

Tente aplicar este código para calcular a regressão em outro lugar, digamos, se você tiver um conjunto de valores - você teria que ir bem fundo no funcionamento do código. E por que, quando é mais razoável fazer o contrário, o código pode não ser tão eficaz, mas é fácil de modificar.

Pessoalmente, minha classe de regressão tem três funções virtuais - número de pontos e suas coordenadas - para aplicar a regressão - declaro uma classe onde estas funções devem ser sobrecarregadas e imediatamente obtemos o coeficiente polinomial de regressão de qualquer grau de zero a terceiro. Além disso, há duas funções opcionais - para obter pesos e o "ponto polar" (ou seja, o ponto pelo qual o polinômio deve necessariamente passar), mas estas funções podem ser omitidas, os pesos serão equiparados a um, e o polinômio será calculado sem o ponto polar. Pode não ser tão eficiente (tanto às custas dos loops internos quanto das funções virtuais), mas é muito flexível, e não há necessidade de descobrir.

Estas variantes rápidas, para fins específicos, exatamente aquelas onde a velocidade é necessária, ao testar e a posição do fim da regressão. Se você precisar de coeficientes e graus diferentes de polinômio, então eu aplico esta variante. Aqui, uma série de coeficientes no código - X[]. Ou seja, há informações exaustivas para desenhar curvas de qualquer profundidade. Se estamos falando da conveniência de algo, provavelmente depende de quem precisa dele. Não o uso no comércio, apenas para fins específicos de pesquisa até o momento.
#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;
   }
}
//***************************************************************
 
Estou pronto para refutar a opinião arraigada de que os polinômios de qualquer grau são afortunados e insubstituíveis. Em exemplos reais de participantes vou provar, que os polinômios perdem por quase todos os indicadores de regressão da URM (acima deu o link), para esquecer para sempre a insubstituibilidade dos polinômios.
 
Yousufkhodja Sultonov:
Estou pronto para refutar a opinião arraigada de que os polinômios de qualquer grau são vitais e insubstituíveis. Em exemplos reais de participantes, provarei que os polinômios perdem por quase todos os índices de regressão URM (acima eu dei um link) para esquecer para sempre a insinuabilidade dos polinômios.

Não é necessário, você provou isso há muito tempo, acreditamos nisso.

 
TheXpert:

Em troca de quê? Eu não quero saber dele, desde que ele não comece a correr por aí em fios técnicos, especialmente em relação aos profissionais, falando bobagens e membros do trolling, mencionando "o clube" e outras bobagens.

É só que neste fio seu trolling foi lindamente traduzido em auto-banning, pelo qual eu lhe agradeci.

Como você pode passar por algo assim?Aqui está outro no clube- 11 páginas cheias de porcaria, cagando umas com as outras, mas ninguém tem coragem suficiente para escrever um teste normal - para verificar e argumentar sua posição. E é melhor simplesmente unir forças e descobrir isso pelo menos por si mesmos. É chamado de super técnicos especialistas em pró... Posso imaginar o que eles escrevem sobre as suas valias.

Há mais um clube aqui - o OOP Victims Club com novos conceitos - acontece que se a herança não é usada, não é mais OOP, então há esse lixo. E também lhes falta a coragem de escrever um teste e verificar quando é mais rápido - quando é polimorfismo e quando é piggyback etc. ...e todas as mesmas caras que conhecemos do clube das vítimas do C++.

 
Vladimir Baskakov:
E onde você procura a felicidade agora, novamente algo do teto (como a mineração)?

Não há receitas de "felicidade" em nenhum lugar, é inútil procurar por ela. Estou satisfeito com o que foi alcançado. Estou orgulhoso do fato de ter conseguido desenvolver o SDMhttps://www.mql5.com/ru/articles/250 e a "Teoria do Mercado" https://www.mql5.com/ru/articles/1825, mas, eles serão compreendidos dentro de 100 anos ou mais. Eu disse anteriormente que o indicadorhttps://www.mql5.com/ru/forum/318795/page17#comment_13020163 está persistentemente esperando por seu tempo e chegou:


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

Em nenhum lugar existe uma receita de "felicidade

Pena que seus alunos, Semko provou há muito tempo que esta idéia é insustentável.
 
Dmitry Fedoseev:

Se você puder encontrar uma solução sem recorrência, é melhor do que com a recorrência.

Está tudo bem.
Razão: