Canal de regresión lineal - página 18

 
Aquí hay una versión compacta y rápida de la regresión parabólica y lineal en mql4, pero cómo deshacerse de un ciclo cuando se calcula el valor sxxy no he descubierto todavía.
#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:

El indicador funciona

¿Y dónde buscas ahora la felicidad, algo del techo de nuevo (como la minería)?
 
ANG3110:
Aquí hay una variante compacta y rápida de la regresión parabólica y lineal en mql4, pero todavía no he descubierto cómo deshacerse de un ciclo al calcular el valor sxxy.

¿Qué sentido tiene eso?

Intenta aplicar este código para calcular la regresión en otro lugar, por ejemplo, si tienes una matriz de valores - tendrás que profundizar bastante en el funcionamiento del código. Y por qué, si es más razonable hacer lo contrario, el código puede no ser tan eficiente, pero es fácil de modificar.

Personalmente, mi clase de regresión tiene tres funciones virtuales - para obtener el número de puntos y sus coordenadas, para aplicar la regresión - debería declarar una clase donde sobrecargue estas funciones a las requeridas - e inmediatamente obtener el coeficiente del polinomio de regresión de cualquier grado desde cero hasta el tercero. Además, hay dos funciones opcionales: para obtener los pesos y el "punto polar" (es decir, el punto por el que debe pasar necesariamente el polinomio), pero estas funciones pueden omitirse, los pesos se igualarán a uno y el polinomio se calculará sin el punto polar. Puede que no sea tan eficiente (tanto a costa de los bucles internos como de las funciones virtuales), pero es muy flexible, y no hay necesidad de ingeniárselas.

 
Georgiy Merts:

¿Qué sentido tiene eso?

Intenta aplicar este código para calcular la regresión en otro lugar, por ejemplo, si tienes un array de valores - tendrás que profundizar bastante en el funcionamiento del código. Y por qué, cuando es más razonable hacer lo contrario, que el código no sea tan eficaz, pero sí fácilmente modificable.

Personalmente, mi clase de regresión tiene tres funciones virtuales - para obtener el número de puntos y sus coordenadas, para aplicar la regresión - hay que declarar una clase donde estas funciones deben ser sobrecargadas - e inmediatamente obtenemos el coeficiente del polinomio de regresión de cualquier grado desde cero hasta el tercero. Además, hay dos funciones opcionales: para obtener los pesos y el "punto polar" (es decir, el punto por el que debe pasar necesariamente el polinomio), pero estas funciones pueden omitirse, los pesos se igualarán a uno y el polinomio se calculará sin el punto polar. Puede que no sea tan eficiente (tanto a costa de los bucles internos como de las funciones virtuales), pero es muy flexible, y no hay necesidad de ingeniárselas.

Estas variantes rápidas, para fines específicos, exactamente aquellos en los que la velocidad es necesaria, cuando las pruebas y la posición del final de la regresión. Si necesita coeficientes y diferente grado de polinomio, entonces aplico esta variante.Aquí matriz de coeficientes en el código - X[]. Es decir, hay información exhaustiva para dibujar curvas de cualquier profundidad. Si hablamos de la conveniencia de algo, probablemente dependa de quién lo necesite. No lo uso en el comercio, sólo para fines específicos de investigación hasta ahora.
#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;
   }
}
//***************************************************************
 
Estoy dispuesto a refutar la opinión arraigada de que los polinomios de cualquier grado son afortunados e insustituibles. En los ejemplos reales de los participantes voy a demostrar, que los polinomios pierden por casi todos los indicadores de regresión de URM (arriba dio el enlace), para olvidar sobre unsinkability de polinomios para siempre.
 
Yousufkhodja Sultonov:
Estoy dispuesto a refutar la opinión arraigada de que los polinomios de cualquier grado son vitales e insustituibles. En ejemplos reales de participantes demostraré que los polinomios pierden por casi todos los índices de regresión URM (arriba di un enlace) para olvidarse de la insumergibilidad de los polinomios para siempre.

No hace falta, ya lo demostró hace tiempo, nos lo creemos.

 
TheXpert:

¿A cambio de qué? A mí me importa una mierda, siempre y cuando no empiece a dar vueltas en los hilos técnicos, sobre todo en lo que se refiere a los profesionales, diciendo tonterías y trolleando a los miembros, mencionando "el club" y otras tonterías.

Es que en este hilo su trolleo se tradujo maravillosamente en el autobaneo, que le agradecí.

¿Cómo se puede superar algo así?Aquí hay otro en el club- 11 páginas llenas de mierda, cagando entre sí, pero nadie tiene las agallas suficientes para escribir una prueba normal - para comprobar y argumentar su posición. Y mejor que se unan y lo resuelvan al menos por ellos mismos. Se llama supertécnicos a los profesionales... Me imagino lo que escriben en sus pluses.

Hay un club más aquí - el Club de las Víctimas de la OOP con nuevos conceptos - resulta que si no se usa la herencia, ya no es OOP, así que ahí está esa basura. Y también les falta valor para escribir una prueba y comprobar cuándo es más rápido, cuándo es polimorfismo y cuándo es piggyback, etc. ...y todas las mismas caras que conocemos del club de víctimas de C++.

 
Vladimir Baskakov:
¿Y dónde buscas la felicidad ahora, de nuevo algo del techo (como la minería)?

No hay recetas para la "felicidad" en ninguna parte, es inútil buscarla. Estoy satisfecho con lo que se ha conseguido. Estoy orgulloso de haber conseguido desarrollar el SDMhttps://www.mql5.com/ru/articles/250 y la "Teoría del Mercado" https://www.mql5.com/ru/articles/1825, pero, se entenderán dentro de 100 años o más. Ya dije que el indicadorhttps://www.mql5.com/ru/forum/318795/page17#comment_13020163 está esperando persistentemente su momento y éste ha llegado:


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

En ninguna parte hay una receta para la "felicidad".

Lástima de tus alumnos, Semko demostró hace tiempo que esta idea es insostenible
 
Dmitry Fedoseev:

Si se puede encontrar una solución sin recursividad, es mejor que con recursividad.

Está bien.