Doğrusal regresyon kanalı - sayfa 17

 

Hızlandırılmış hesaplama ile pek çok fonksiyonun yapılabileceğine gönülden inanıyorum. Döngüsüz olarak dönem sonundan değer alıp başına yeni değer eklemek için yazın.

Özellikle, basit bir fareden döngü olmadan doğrusal regresyona kadar çeşitli filtre türlerini döngü olmadan nasıl hesaplayabileceğinize dair bir örnek.

 #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);
}
//********************************************************************

Burada, N=0 - sıradan SMA'da, N=1 - lineer ağırlıklı, N=3 - lineer regresyon. N bir kesir olduğu için ara değerler de alabilirsiniz. Ben de SKO'yu benzer şekilde değerlendirdim. Polinom regresyonunun da aynı şekilde yapılabileceğini düşünüyorum. Pratik bir ihtiyaç olacaktır. En azından polinom regresyonunu kârlı Expert Advisor'larda henüz kullanamadım. EMA-shke'deki kanallar bir şekilde daha basit ve pratik olarak iyi çalışıyor.

İşte döngüsüz RMS'li mq4'te lineer regresyonun biraz süslü bir versiyonu. Döngü, başlangıçta veya daha kesin olarak, ilk değerin hesaplanmasındadır ve bu kadar - o zaman sadece toplamlar ve farklar. Tabii ki, döngülerden çok daha hızlı sayar. Bir incelik, sürenin saat olarak ayarlanması ve zaman çerçevesi değiştirilirken yeniden hesaplanmasıdır.

 #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 :

Fedoseev neden doğru bir şekilde akıl yürüterek kendini geri çekti?

Çünkü yanlış düşündü.
Konuyu okuyun.

 
Ve bu "döngüsüz" size ne veriyor?

Kod yürütmeyi ne kadar hızlandırır?
 
danminin :
Ve bu "döngüsüz" size ne veriyor?

Kod yürütmeyi ne kadar hızlandırır?
Aslında çok. GetTickCount() ile ölçüm yapıyordum. Ancak bu, çok sayıda optimizasyon yapmanız gerektiğinde açıkça fark edilir. Birkaç saat için bir sürü seçeneği saymak bir şeydir, birkaç onluk veya dakika birimi için başka bir şey. Ancak buna genellikle nadiren ihtiyaç duyulur. Bu yüzden bunun için çok fazla endişelenmenize gerek yok.
 
ANG3110 :

Hızlandırılmış hesaplama ile pek çok fonksiyonun yapılabileceğine gönülden inanıyorum. Döngüsüz olarak dönem sonundan değer alıp başına yeni değer eklemek için yazın.

Özellikle, basit bir fareden döngü olmadan doğrusal regresyona kadar çeşitli filtre türlerini döngü olmadan nasıl hesaplayabileceğinize dair bir örnek.

Burada, N=0 - sıradan SMA'da, N=1 - lineer ağırlıklı, N=3 - lineer regresyon. N bir kesir olduğu için ara değerler de alabilirsiniz. Ben de SKO'yu benzer şekilde değerlendirdim. Polinom regresyonunun da aynı şekilde yapılabileceğini düşünüyorum. Pratik bir ihtiyaç olacaktır. En azından polinom regresyonunu kârlı Expert Advisor'larda henüz kullanamadım. EMA-shke'deki kanallar bir şekilde daha basit ve pratik olarak iyi çalışıyor.

İşte döngüsüz RMS'li mq4'te lineer regresyonun biraz süslü bir versiyonu. Döngü bir kez başlarken veya daha kesin olarak ilk değerin ve hepsinin hesaplanmasında, - o zaman sadece toplamlar ve farklar. Tabii ki, döngülerden çok daha hızlı sayar.

Evet. Pekala. Bu, doğrusal regresyonda çevrimsiz RMS hesaplamasının gerçek bir örneğidir.
Doğru, algoritmada bir yerde küçük bir hata var ve bu üç çizginin (kanalın orta, üst ve alt sınırları) yukarı doğru kaymasına neden oluyor.


 
Nikolai Semko :

Evet. Pekala. Bu, doğrusal regresyonda çevrimsiz RMS hesaplamasının gerçek bir örneğidir.
Doğru, algoritmada bir yerde küçük bir hata var ve bu üç çizginin (kanalın orta, üst ve alt sınırları) yukarı kaymasına neden oluyor.


Ve eklenen yayılmanın sadece yarısı var. Bir keresinde bunu ticaret danışmanını kontrol etmek için yaptım, böylece Ask-Bid'e göre ortalandı. Orada, SPR=0 koyarsanız, kayma olmaz. Tamamen teklif fiyatları üzerinden hesaplanacaktır.
 
danminin :
Ve bu "döngüsüz" size ne veriyor?

Kod yürütmeyi ne kadar hızlandırır?

sadece RMS'nin hesaplanması nedeniyle, kazançlar döneme bağlı olarak yaklaşık 10-1000 katıdır.

 
ANG3110 :
Ve eklenen yayılmanın sadece yarısı var. Bir keresinde bunu ticaret danışmanını kontrol etmek için yaptım, böylece Ask-Bid'e göre ortalandı. Orada, SPR=0 koyarsanız, kayma olmaz. Tamamen teklif fiyatları üzerinden hesaplanacaktır.

Evet kesinlikle. Doğrusal regresyon uygulamamla tam eşleşme.

 
Yousufkhodja Sultonov :


Sultonov'un göstergesi orada ne yapıyor? Forex'in arkasını zaten veya süreçte mi kırdınız?
 
Vladimir Baskakov :
Sultonov'un göstergesi orada ne yapıyor? Forex'in arkasını zaten veya süreçte mi kırdınız?

Gösterge, VPS'de 48 USD depozito ile "başlat ve unut" ilkesine göre bir sentlik gerçek hesapta çalışıyor.İkinci ay, görünüşe göre 50 civarında asılı, kanatlarda bekliyor. Forex'te, kârların uzun yıllar boyunca yeniden yatırılması şartıyla, sürekli ve risksiz olarak yılda %10'dan fazla almak imkansızdır - bunlar Forex sırtıyla ilgili sonuçlarım. 8 yıl önceki aceleci sonuçlar piyasanın gerçekliği tarafından bozuldu. En güçlü evrensel regresyon modeli, banka kârı vererek görevle başa çıkmadı. URM, piyasa unsurları dışında tüm teknik, sosyal, madencilik (yoksul cevherlerden altının çıkarılması) ve diğer süreçlerle iyi başa çıkmaktadır. Sonuç - regresyon modelleri, piyasadan kar elde etme açısından sınırlı bir potansiyele sahiptir.