Canale di regressione lineare - pagina 18

 
Ecco una versione compatta e veloce della regressione parabolica e lineare in mql4, ma come liberarsi di un ciclo quando si calcola il valore sxxy non l'ho ancora capito.
#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:

L'indicatore funziona

E dove stai cercando la felicità ora, qualcosa di nuovo dal soffitto (come le miniere)?
 
ANG3110:
Ecco una variante compatta e veloce della regressione parabolica e lineare in mql4, ma non ho ancora capito come liberarsi di un ciclo quando si calcola il valore sxxy.

Che senso ha?

Provate ad applicare questo codice per calcolare la regressione altrove, per esempio, se avete un array di valori - dovrete andare abbastanza in profondità nel funzionamento del codice. E perché, se è più ragionevole fare il contrario, il codice può non essere così efficiente, ma è facile da modificare.

Personalmente, la mia classe di regressione ha tre funzioni virtuali - per ottenere il numero di punti e le loro coordinate, per applicare la regressione - dovresti dichiarare una classe dove sovraccarichi queste funzioni a quelle richieste - e ottenere immediatamente il coefficiente del polinomio di regressione di qualsiasi grado da zero al terzo. Inoltre, ci sono due funzioni opzionali - per ottenere i pesi e il "punto polare" (cioè il punto per cui il polinomio deve necessariamente passare), ma queste funzioni possono essere omesse, i pesi saranno equiparati a uno, e il polinomio sarà calcolato senza il punto polare. Può non essere così efficiente (sia a spese dei cicli interni che delle funzioni virtuali), ma è molto flessibile, e non c'è bisogno di capirlo.

 
Georgiy Merts:

Che senso ha?

Provate ad applicare questo codice per calcolare la regressione altrove, per esempio, se avete un array di valori - dovrete andare abbastanza in profondità nel funzionamento del codice. E perché, quando è più ragionevole fare il contrario, lasciare che il codice non sia così efficace, ma facilmente modificabile.

Personalmente, la mia classe di regressione ha tre funzioni virtuali - per ottenere il numero di punti e le loro coordinate, per applicare la regressione - è necessario dichiarare una classe dove queste funzioni devono essere sovraccaricate - e si ottiene immediatamente il coefficiente del polinomio di regressione di qualsiasi grado da zero al terzo. Inoltre, ci sono due funzioni opzionali - per ottenere i pesi e il "punto polare" (cioè il punto per cui il polinomio deve necessariamente passare), ma queste funzioni possono essere omesse, i pesi saranno equiparati a uno, e il polinomio sarà calcolato senza il punto polare. Può non essere così efficiente (sia a spese dei cicli interni che delle funzioni virtuali), ma è molto flessibile, e non c'è bisogno di capirlo.

Queste varianti veloci, per scopi specifici, esattamente quelli dove la velocità è necessaria, quando i test e la posizione della fine della regressione. Se avete bisogno di coefficienti e diverso grado di polinomio, allora applico questa variante.Qui array di coefficienti nel codice - X[]. Cioè, ci sono informazioni esaustive per disegnare curve di qualsiasi profondità. Se stiamo parlando della convenienza di qualcosa, probabilmente dipende da chi ne ha bisogno. Non lo uso nel commercio, solo per scopi specifici di ricerca finora.
#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;
   }
}
//***************************************************************
 
Sono pronto a confutare l'opinione radicata che i polinomi di qualsiasi grado siano fortunati e insostituibili. Su esempi reali di partecipanti dimostrerò, che i polinomi perdono da quasi tutti gli indicatori di regressione di URM (sopra ha dato il link), per dimenticare l'inaffondabilità dei polinomi per sempre.
 
Yousufkhodja Sultonov:
Sono pronto a confutare l'opinione radicata che i polinomi di qualsiasi grado siano vitali e insostituibili. Su esempi reali di partecipanti dimostrerò che i polinomi perdono per quasi tutti gli indici di regressione URM (ho dato il link sopra) per dimenticare per sempre l'inaffondabilità dei polinomi.

Non c'è bisogno, l'hai dimostrato molto tempo fa, noi ci crediamo.

 
TheXpert:

In cambio di cosa? Non me ne frega un cazzo di lui, basta che non cominci a correre nei thread tecnici, soprattutto per quanto riguarda i professionisti, dicendo sciocchezze e trollando i membri, menzionando "club" e altre sciocchezze.

È solo che in questo thread il suo trolling si è meravigliosamente tradotto in un auto-banning, per il quale l'ho ringraziato.

Come si può superare una cosa del genere?Ecco un altro nel club- 11 pagine piene di stronzate, che si prendono per il culo a vicenda, ma nessuno ha abbastanza fegato per scrivere un test normale - per controllare e argomentare la propria posizione. E meglio unire le forze e capirlo almeno da soli. Si chiamano super esperti tecnici sui professionisti... Posso immaginare cosa scrivono sui loro plus.

C'è un altro club qui - il club delle vittime dell'OOP con nuovi concetti - si scopre che se l'ereditarietà non è usata, non è più OOP, quindi c'è quella spazzatura. E anche a loro manca il coraggio di scrivere un test e controllare quando è più veloce - quando è polimorfismo e quando è piggyback ecc...e tutte le stesse facce che conosciamo dal club delle vittime del C++.

 
Vladimir Baskakov:
E dove cerchi la felicità ora, ancora qualcosa dal soffitto (come le miniere)?

Non ci sono ricette per la "felicità" da nessuna parte, è inutile cercarla. Sono soddisfatto di ciò che è stato raggiunto. Sono orgoglioso del fatto che sono riuscito a sviluppare la SDMhttps://www.mql5.com/ru/articles/250 e la "Teoria del Mercato" https://www.mql5.com/ru/articles/1825, ma, saranno compresi tra 100 anni o più. Ho detto prima che l'indicatorehttps://www.mql5.com/ru/forum/318795/page17#comment_13020163 sta persistentemente aspettando il suo momento ed è arrivato:


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

Non c'è da nessuna parte una ricetta per la "felicità

Peccato per i tuoi studenti, Semko ha dimostrato questa idea insostenibile molto tempo fa
 
Dmitry Fedoseev:

Se si può trovare una soluzione senza ricorsione, è meglio che con la ricorsione.

È tutto a posto.