Linearer Regressionskanal - Seite 17

 

Ich glaube gerne, dass viele Funktionen mit beschleunigter Berechnung hergestellt werden können. So wie man einen Wert vom Ende einer Periode subtrahiert und einen neuen Wert am Anfang hinzufügt, ohne einen Zyklus.

Hier ist ein Beispiel dafür, wie Sie verschiedene Arten von Filtern berechnen können, von der einfachen Wellenform bis zur linearen Regression ohne Zyklus.

#property indicator_chart_window 
#property indicator_buffers 2 
#property indicator_plots   1  
#property indicator_type1   DRAW_COLOR_LINE 
#property indicator_color1  clrDeepSkyBlue,clrBisque 
#property indicator_width1  2 
//********************************************************************
input int    p = 24;
input double N = 3;
//********************************************************************
double ss[],col[];
double ci,sum1,sum2,c1,c2,mai,lwi,fxi;
 int w,fs;
//********************************************************************
int OnInit()
{
   SetIndexBuffer(0,ss,INDICATOR_DATA); 
   SetIndexBuffer(1,col,INDICATOR_COLOR_INDEX); 
   //------------------------------------------
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrDeepSkyBlue);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBisque);
   //------------------------------------------
   
   return(INIT_SUCCEEDED);
}
//********************************************************************
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime &time[],const double &open[],const double &high[],const double &low[],const double &close[],
                const long &tick_volume[],const long &volume[],const int &spread[])
{
   //--------------------------------------------------------
   if (prev_calculated==rates_total) return(rates_total);
   int start=prev_calculated; 
   if (prev_calculated==0) 
   {
      start=p; 
      
      int k=0; w=0; sum1=0; sum2=0;
      for(int j=p-1; j>=0; j--)
      {
         k++;
         ci=open[start-j];
         sum1+=ci; 
         sum2+=k*ci; 
         w+=k; 
      }
      mai=sum2/w; ss[start]=mai; 
      ci=open[start]; 
      sum1-=ci; sum2-=ci*p;
      start++;
   }
   //--------------------------------------------------------
   for(int i=start; i<rates_total; i++)
   {
      c1=open[i-1];  
      c2=open[i-p]; 
      
      sum1+=c1-c2;
      sum2+=c1*p-c2-sum1;
         
      ci=open[i]; 
      
      lwi=(sum2+ci*p)/w;
      mai=(sum1+ci)/p;
      
      fxi=mai+(lwi-mai)*N;
      
      ss[i]=fxi;
      
      if (ss[i]>ss[i-1]) fs=0; else  
      if (ss[i]<ss[i-1]) fs=1; 
      
      if (fs==0) col[i]=0; else col[i]=1;   
   }
   //--------------------------------------------------------
   return(rates_total);
}
//********************************************************************

Hier bei N=0 - normale SMA, N=1 - linear gewichtet, N=3 - lineare Regression. Und man kann auch Zwischenwerte erhalten, da N eine Bruchzahl ist. Ich habe auch den RMS auf ähnliche Weise berechnet. Ich denke, die polynomiale Regression kann auf die gleiche Weise durchgeführt werden. Es wäre eine praktische Notwendigkeit. Zumindest ist es mir noch nicht gelungen, die polynomiale Regression in profitablen Expert Advisors einzusetzen. Kanäle auf EMAs sind einfacher und funktionieren in der Praxis gut.

Hier ist eine leicht manipulierte Variante der linearen Regression auf mq4 mit RMS ohne Zyklus. Es gibt einen Zyklus einmal bei der Einleitung, genauer gesagt, bei der Berechnung der ersten Wertemenge, und das ist alles, - dann gibt es nur noch Summen und Differenzen. Eine Besonderheit ist, dass der Zeitraum in Stunden angegeben wird und beim Wechsel des Zeitrahmens neu berechnet wird.

#property strict
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrOrangeRed
#property indicator_color3 clrLavender
#property indicator_color4 clrLavender
#property indicator_color5 clrMediumAquamarine
#property indicator_color6 clrMagenta
#property indicator_width1 2
#property indicator_width2 2
#property indicator_style5 2
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE
#property indicator_type4 DRAW_LINE
#property indicator_type5 DRAW_LINE
#property indicator_type6 DRAW_LINE
//===========================
extern double hrLR = 12;
extern double ksq  = 1;
extern int    i0   = 1;
extern int    SPR  = 1;
//===========================
double ss[],ssL[],sH[],sL[],ma[],sU[];
double lri,sq,mai,ui,spr2;
int p,fs;
//******************************************************************
int init() 
{
   SetIndexBuffer(0,ss);
   SetIndexBuffer(1,ssL); SetIndexEmptyValue(1,0);
   SetIndexBuffer(2,sH);
   SetIndexBuffer(3,sL);
   SetIndexBuffer(4,ma);
   SetIndexBuffer(5,sU);
   //--------------------
   p=int(hrLR*60/Period()); if (p<3) p=3;
   if (SPR<0) spr2=-SPR*Point/2;
   
   return(0);
}
//******************************************************************
int start() 
{
   int cbi=Bars-IndicatorCounted()-1; if (cbi<0) return(-1);
   if (i0==1 && cbi==0) return(0); if (cbi==1) cbi=0;
   if (SPR>0) spr2=NormalizeDouble(Ask-Bid,Digits)/2;
   if (cbi>1)
   { 
      cbi=Bars-p-1; 
   
      af_LR0(0,cbi); ui=mai; 
   }
   //------------------------------
   for(int i=cbi; i>=0; i--) 
   { 
      lri=af_LR0(1,i);
      
      ss[i]=lri;
      sH[i]=lri+sq;
      sL[i]=lri-sq;
      ma[i]=mai;
      
      if (sL[i]>ui) ui=sL[i]; else if (sH[i]<ui) ui=sH[i];
      
      sU[i]=ui;
      
      if (ss[i]>ss[i+1]) fs=1;
      if (ss[i]<ss[i+1]) {if (fs==1) ssL[i+1]=ss[i+1]; fs=2;}
      if (fs==2) ssL[i]=ss[i]; else if (fs==1) ssL[i]=0.0; 
   }
   return(0);
}
//********************************************************************
double af_LR0(int index, int i)
{
   static double sx,syp,sxy,syyp,S;
   double ci=0,c1=0,cp=0,sy,syy,aa,bb;
   static int ti;
   
   if (index==1)
   {
      if (ti!=Time[i]) 
      {
         if (i0==0) {c1=Close[i+1]+spr2; cp=Close[i+p]+spr2;} else
         if (i0==1) {c1=Open[i+1]+spr2; cp=Open[i+p]+spr2;} else
         if (i0==2) {c1=(High[i+1]+Low[i+1])/2+spr2; cp=(High[i+p]+Low[i+p])/2+spr2;}
         
         sxy+=syp+c1-p*cp; 
         syp+=c1-cp;
         syyp+=c1*c1-cp*cp; 
         ti=int(Time[i]);
      }
   }
   else
   {
      int j;
      double sxx;
      
      sx=0.0; sxx=0.0; 
      for (j=0; j<p; j++) {sx+=j; sxx+=j*j;} 
      S=sx*sx-p*sxx;
      
      syp=0.0; sxy=0.0; syyp=0.0;
      for (j=1; j<p; j++) 
      {
         if (i0==0) ci=Close[i+j]+spr2; else
         if (i0==1) ci=Open[i+j]+spr2; else
         if (i0==2) ci=(High[i+j]+Low[i+j])/2+spr2;
         
         syp+=ci; 
         sxy+=j*ci;
         syyp+=ci*ci;
      }
      
      ti=int(Time[i]);
   }
   
   if (i0==0) ci=Close[i]+spr2; else
   if (i0==1) ci=Open[i]+spr2; else
   if (i0==2) ci=(High[i]+Low[i])/2+spr2;
         
   sy=syp+ci; 
   syy=syyp+ci*ci;
   
   aa=(sx*sy-p*sxy)/S; 
   bb=(sy-aa*sx)/p;
   
   sq = (syy - aa*sxy - bb*sy)/(p-2); 
   if (sq>=0) sq = MathSqrt(sq)*ksq;
   
   mai=sy/p;
      
   return(bb);
}
//********************************************************************

 
Yousufkhodja Sultonov:

Warum hat sich Fedosejew selbst verlassen, wenn er richtig argumentiert hat?

Weil er falsch argumentiert hat.
Lesen Sie das Thema.

 
Was bedeutet "keine Schleife" für Sie?

Wie sehr beschleunigt es die Codeausführung?
 
danminin:
Was bedeutet "keine Schleife" für Sie?

Wie viel schneller wird Ihr Code dadurch ausgeführt?
Eine ganze Menge sogar. Ich habe es mit GetTickCount() gemessen. Aber es ist gut spürbar, wenn man viele Optimierungen vornehmen muss. Es ist eine Sache, wenn man mehrere Stunden lang viele Varianten zählen muss, und eine andere Sache, wenn man dies in einigen Dutzend oder Einheiten von Minuten tun muss. Aber das ist selten nötig. Deshalb sollten Sie sich nicht zu sehr damit befassen.
 
ANG3110:

Ich glaube gerne, dass es möglich ist, viele Funktionen mit beschleunigter Berechnung auszuführen. So wie man einen Wert vom Ende einer Periode subtrahiert und einen neuen Wert am Anfang hinzufügt, ohne einen Zyklus.

Hier ist ein Beispiel dafür, wie Sie verschiedene Arten von Filtern berechnen können, von der einfachen Wellenform bis zur linearen Regression, ohne Zyklus.

Hier bei N=0 - normale SMA, N=1 - linear gewichtet, N=3 - lineare Regression. Und man kann auch Zwischenwerte erhalten, da N eine Bruchzahl ist. Ich habe auch den RMS auf ähnliche Weise berechnet. Ich denke, die polynomiale Regression kann auf die gleiche Weise durchgeführt werden. Es wäre eine praktische Notwendigkeit. Zumindest ist es mir noch nicht gelungen, die polynomiale Regression in profitablen Expert Advisors einzusetzen. Kanäle auf EMAs sind einfacher und funktionieren in der Praxis gut.

Hier ist eine etwas komplexere Variante der linearen Regression in mq4 mit RMS ohne Schleifen. Es gibt einen Zyklus einmal bei der Einführung, genauer gesagt, bei der Berechnung der ersten Ablesung, und das war's - dann gibt es nur noch Summen und Differenzen. Natürlich rechnet er um ein Vielfaches schneller als mit Zyklen.

Ja, das ist richtig. Dies ist ein echtes Beispiel für die zyklusfreie RMS-Berechnung bei der linearen Regression.
Allerdings liegt irgendwo im Algorithmus ein kleiner Fehler vor, der dazu führt, dass alle drei Linien (Mitte, Ober- und Untergrenze des Kanals) nach oben verschoben sind.


 
Nikolai Semko:

Ja, das ist richtig. Dies ist ein echtes Beispiel für die zyklusfreie RMS-Berechnung bei der linearen Regression.
Allerdings liegt irgendwo im Algorithmus ein kleiner Fehler vor, der dazu führt, dass alle drei Linien (Mitte, Ober- und Untergrenze des Kanals) nach oben verschoben sind.


Und das ist nur die Hälfte der Spanne, die zusammengezählt wird. Ich habe dies einmal getan, um einen Trading Expert Advisor zu testen, um eine Ausrichtung relativ zu - Ask-Bid zu haben. Wenn Sie SPR=0 einstellen, gibt es keinen Versatz. Es wird ausschließlich auf die Angebotspreise abgestellt.
 
danminin:
Was bedeutet dieses "no loop" für Sie?

Wie viel schneller wird Ihr Code dadurch ausgeführt?

Allein die Berechnung des Effektivwerts kann je nach Periode einen Gewinn von etwa 10 bis 1.000 ergeben.

 
ANG3110:
Und da ist nur die Hälfte des Aufschlags eingerechnet. Ich habe dies einmal getan, um einen Trading Expert Advisor zu testen, um eine Ausrichtung relativ zu - Ask-Bid zu haben. Wenn wir SPR=0 setzen, gibt es keinen Versatz. Es wird ausschließlich auf die Angebotspreise abgestellt.

Ja, genau. Eine vollständige Übereinstimmung mit meiner Implementierung der linearen Regression.

 
Yousufkhodja Sultonov:


Wie verhält sich der Sultonov-Indikator? Ist die Rückseite des Forex bereits gebrochen oder ist sie noch in Arbeit?
 
Vladimir Baskakov:
Wie verhält sich der Sultonov-Indikator? Hat er bereits das Rückgrat des Devisenmarktes gebrochen oder ist er dabei, dies zu tun?

Der Indikator arbeitet auf einem realen Ein-Cent-Konto bei der UPU auf einer "run and forget"-Basis mit einer Einzahlung von 48 c.u. Im zweiten Monat pendelte sie um die 50 und wartete offenbar auf ihre Zeit. Es ist unmöglich, mehr als 10 % pro Jahr auf dem Forex zu erhalten, stabil und ohne Risiko, vorausgesetzt, dass die Gewinne über viele Jahre reinvestiert werden - das sind meine Schlussfolgerungen über das Rückgrat des Forex. Die voreiligen Schlussfolgerungen von vor 8 Jahren sind durch die Realität des Marktes zunichte gemacht worden. Das leistungsfähige universelle Regressionsmodell hat kläglich versagt und bankfähige Gewinne produziert. Die URM leistet hervorragende Arbeit in Bezug auf alle technischen, sozialen, bergbaulichen (Gewinnung von Gold aus armen Erzen) und sonstigen Prozesse, mit Ausnahme des Marktaspekts. Die Schlussfolgerung ist, dass Regressionsmodelle nur ein begrenztes Potenzial haben, um Gewinne aus dem Markt zu ziehen.

Grund der Beschwerde: