선형 회귀 채널 - 페이지 17

 

나는 가속 계산으로 매우 많은 기능을 만드는 것이 가능하다고 쉽게 믿습니다. 기간 값의 끝에서 제거하고 주기 없이 시작에 새 값을 추가하려면 입력합니다.

특히 간단한 마우스에서 순환 없는 선형 회귀 까지 여러 유형의 필터를 순환 없이 계산하는 방법에 대한 예입니다.

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

여기에서 N=0 - 일반 SMA, N=1 - 선형 가중, N=3 - 선형 회귀에서. N은 분수이기 때문에 중간 값을 얻을 수도 있습니다. 나도 비슷한 방식으로 SKO를 고려했다. 다항식 회귀도 같은 방식으로 수행할 수 있다고 생각합니다. 실질적인 필요가 있을 것입니다. 적어도 나는 아직 수익성 있는 Expert Advisors에서 다항식 회귀를 사용할 수 없었습니다. EMA-shke의 채널은 어떻게 든 더 간단하고 실제로 잘 작동합니다.

다음은 사이클이 없는 RMS가 있는 mq4의 선형 회귀의 약간 멋진 버전입니다. 사이클은 시작 시 또는 더 정확하게는 첫 번째 값과 모든 값을 계산한 다음 합계와 차이만 계산합니다. 물론 사이클보다 몇 배 더 빠르게 계산됩니다. 한 가지 미묘한 점은 기간이 시간 단위로 설정되고 기간을 전환할 때 다시 계산된다는 것입니다.

 #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는 왜 자신을 철회하고 올바르게 추론 했습니까?

그가 잘못 추론했기 때문입니다.
스레드를 읽으십시오.

 
그리고 이것이 "주기 없이"는 무엇을 제공합니까?

코드 실행 속도가 얼마나 빨라집니까?
 
danminin :
그리고 이것이 "주기 없이"는 무엇을 제공합니까?

코드 실행 속도가 얼마나 빨라집니까?
사실 많이. 나는 GetTickCount() 로 측정하곤 했습니다. 그러나 이것은 많은 최적화를 수행해야 할 때 분명히 눈에 띕니다. 몇 시간 동안 많은 옵션을 계산할 때와 수십 또는 몇 분 단위로 계산할 때입니다. 그러나 이것은 일반적으로 거의 필요하지 않습니다. 따라서 너무 걱정할 필요가 없습니다.
 
ANG3110 :

나는 가속 계산으로 매우 많은 기능을 만드는 것이 가능하다고 쉽게 믿습니다. 기간 값의 끝에서 제거하고 주기 없이 시작에 새 값을 추가하려면 입력합니다.

특히 간단한 마우스에서 순환 없는 선형 회귀 까지 여러 유형의 필터를 순환 없이 계산하는 방법에 대한 예입니다.

여기에서 N=0 - 일반 SMA, N=1 - 선형 가중치, N=3 - 선형 회귀에서. N은 분수이기 때문에 중간 값을 얻을 수도 있습니다. 나도 비슷한 방식으로 SKO를 고려했다. 다항식 회귀도 같은 방식으로 수행할 수 있다고 생각합니다. 실질적인 필요가 있을 것입니다. 적어도 나는 아직 수익성 있는 Expert Advisors에서 다항식 회귀를 사용할 수 없었습니다. EMA-shke의 채널은 어떻게 든 더 간단하고 실제로 잘 작동합니다.

다음은 주기가 없는 RMS가 있는 mq4의 선형 회귀의 약간 멋진 버전입니다. 사이클은 시작 시 또는 더 정확하게는 첫 번째 값과 모든 값을 계산한 다음 합계와 차이만 계산합니다. 물론 사이클보다 몇 배 더 빠르게 계산됩니다.

네. 괜찮은. 이것은 선형 회귀에서 RMS의 주기 없는 계산의 실제 예입니다.
사실, 알고리즘 어딘가에 작은 오류가 있어 세 줄(채널의 중앙, 위쪽 및 아래쪽 경계)이 모두 위쪽으로 이동합니다.


 
Nikolai Semko :

네. 괜찮은. 이것은 선형 회귀에서 RMS의 주기 없는 계산의 실제 예입니다.
사실, 알고리즘 어딘가에 작은 오류가 있어 세 줄(채널의 중앙, 위쪽 및 아래쪽 경계)이 모두 위쪽으로 이동합니다.


스프레드가 절반만 추가되었습니다. 나는 한 번 그것이 Ask-Bid와 관련하여 중심에 있도록 거래 고문을 확인하기 위해 이것을했습니다. 거기에 SPR=0을 넣으면 이동이 없습니다. 순전히 입찰 가격으로 계산됩니다.
 
danminin :
그리고 이것이 "주기 없이"는 무엇을 제공합니까?

코드 실행 속도가 얼마나 빨라집니까?

RMS 계산으로 인해 기간에 따라 상금이 약 10-1000 배입니다.

 
ANG3110 :
스프레드가 절반만 추가되었습니다. 나는 한 번 그것이 Ask-Bid와 관련하여 중심에 있도록 거래 고문을 확인하기 위해 이것을했습니다. 거기에 SPR=0을 넣으면 이동이 없습니다. 순전히 입찰 가격으로 계산됩니다.

네 맞습니다. 내 선형 회귀 구현과 완전히 일치합니다.

 
Yousufkhodja Sultonov :


여기서 Sultonov의 지표는 어떻습니까? 이미 또는 그 과정에서 외환의 뒤를 깼습니까?
 
Vladimir Baskakov :
여기서 Sultonov의 지표는 어떻습니까? 이미 또는 그 과정에서 외환의 뒤를 깼습니까?

표시기는 48 USD의 예치금으로 "출시 후 잊어 버리기"의 원칙에 따라 VPS의 1센트 실제 계정 에서 작동합니다. 두 번째 달은 약 50에 매달려 있으며 분명히 날개에서 기다리고 있습니다. Forex에서는 수익이 수년에 걸쳐 재투자된다는 전제 하에 위험 없이 지속적으로 연간 10% 이상을 받는 것이 불가능합니다. 이것이 Forex 능선에 대한 저의 결론입니다. 8년 전 성급한 결론은 시장의 현실에 의해 깨졌다. 가장 강력한 범용 회귀 모델은 작업에 대처하지 못하고 은행 이익을 제공했습니다. URM은 시장 요소를 제외하고 기술, 사회, 채굴(빈약한 광석에서 금 추출) 및 기타 프로세스의 모든 프로세스에 잘 대처합니다. 결론 - 회귀 모델은 시장에서 이익을 추출하는 측면에서 잠재력이 제한적입니다.