선형 회귀 채널

 

선형 회귀 지표가 있습니다.

계산을 EA에 포함하고 막대 0 또는 막대 1에서 데이터를 가져오는 방법.

다음과 같이 시도했습니다.

 enum ENUM_Polynomial
  {
   linear= 1 ,       // linear 
   parabolic= 2 ,   // parabolic 
   Third_power= 3 , // third-power 
  };
input ENUM_Polynomial degree=linear;
input double kstd= 2.0 ;
input int bars= 250 ;
input int shift= 0 ;

double Ask,Bid;
double h,l;
double sqh_buffer[];
double fx_buffer[];
double sql_buffer[];
double close[];

double ai[ 10 , 10 ],b[ 10 ],x[ 10 ],sx[ 20 ];
double sum;
int p,n,f;
double qq,mm,tt;
int ii,jj,kk,ll,nn;
double sq;

int i0= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   
   ArrayResize (fx_buffer, 1000 );
   ArrayResize (sqh_buffer, 1000 );
   ArrayResize (sql_buffer, 1000 );
   
   ArraySetAsSeries (fx_buffer, true );
   ArraySetAsSeries (sqh_buffer, true );
   ArraySetAsSeries (sql_buffer, true );
   
   ArrayResize (close, 1000 );
   ArraySetAsSeries (close, false );
   
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
   MqlTick Tick;
   SymbolInfoTick ( _Symbol ,Tick);

   Ask = Tick.ask;
   Bid = Tick.bid;
   
   
   iStdev
   for ( int i = 0 ; i< 1000 ;i++)
   {
     // Print (i, "   ",ArraySize(close)); 
    close[i] = iClose ( _Symbol , 0 , 0 );
   }
   
   // ArraySetAsSeries(close,true);
   int mi;
   p=bars;
   sx[ 1 ]=p+ 1 ;
   nn=degree+ 1 ;
   
   //--- sx 
   for (mi= 1 ;mi<=nn* 2 - 2 ;mi++)
     {
      sum= 0 ;
       for (n=i0;n<=i0+p;n++)
        {
         sum+= MathPow (n,mi);
        }
      sx[mi+ 1 ]=sum;
     }
//--- syx 
   for (mi= 1 ;mi<=nn;mi++)
     {
      sum= 0.00000 ;
       for (n=i0;n<=i0+p;n++)
        {
         if (mi== 1 )
            sum+=close[n];
         else
            sum+=close[n]* MathPow (n,mi- 1 );
        }
      b[mi]=sum;
     }
//--- Matrix 
   for (jj= 1 ;jj<=nn;jj++)
     {
       for (ii= 1 ; ii<=nn; ii++)
        {
         kk=ii+jj- 1 ;
         ai[ii,jj]=sx[kk];
        }
     }
//--- Gauss 
   for (kk= 1 ; kk<=nn- 1 ; kk++)
     {
      ll= 0 ;
      mm= 0 ;
       for (ii=kk; ii<=nn; ii++)
        {
         if ( MathAbs (ai[ii,kk])>mm)
           {
            mm= MathAbs (ai[ii,kk]);
            ll=ii;
           }
        }
     
       if (ll!=kk)
        {
         for (jj= 1 ; jj<=nn; jj++)
           {
            tt=ai[kk,jj];
            ai[kk,jj]=ai[ll,jj];
            ai[ll,jj]=tt;
           }
         tt=b[kk];
         b[kk]=b[ll];
         b[ll]=tt;
        }
       for (ii=kk+ 1 ;ii<=nn;ii++)
        {
         qq=ai[ii,kk]/ai[kk,kk];
         for (jj= 1 ;jj<=nn;jj++)
           {
             if (jj==kk)
               ai[ii,jj]= 0 ;
             else
               ai[ii,jj]=ai[ii,jj]-qq*ai[kk,jj];
           }
         b[ii]=b[ii]-qq*b[kk];
        }
     }
   x[nn]=b[nn]/ai[nn,nn];
   for (ii=nn- 1 ;ii>= 1 ;ii--)
     {
      tt= 0 ;
       for (jj= 1 ;jj<=nn-ii;jj++)
        {
         tt=tt+ai[ii,ii+jj]*x[ii+jj];
         x[ii]=( 1 /ai[ii,ii])*(b[ii]-tt);
        }
     }
//---
   for (n=i0;n<=i0+p;n++)
     {
      sum= 0 ;
       for (kk= 1 ;kk<=degree;kk++)
        {
         sum+=x[kk+ 1 ]* MathPow (n,kk);
        }
      fx_buffer[n]=x[ 1 ]+sum;
     }
//--- Std 
   sq= 0.0 ;
   for (n=i0;n<=i0+p;n++)
     {
      sq+= MathPow (close[n]-fx_buffer[n], 2 );
     }
   sq= MathSqrt (sq/(p+ 1 ))*kstd;

   for (n=i0;n<=i0+p;n++)
     {
      sqh_buffer[n]=fx_buffer[n]+sq;
      sql_buffer[n]=fx_buffer[n]-sq;
     }
     
     h = sqh_buffer[
0];
     l = sql_buffer[ 0 ];

근데 뭔가 안맞는듯...

파일:
i-Regr.mq5  12 kb
 
void calcPolynomialRegression(double &PricesArray[],double &RegressionArray[], int power) {
 ArrayResize(RegressionArray, ArraySize(PricesArray)); ArraySetAsSeries(RegressionArray,ArrayGetAsSeries(PricesArray));
 double summ_x_value[21],summ_y_value[11],constant[11],matrix[11][11];
 ArrayInitialize(summ_x_value,0); ArrayInitialize(summ_y_value,0);
 ArrayInitialize(constant,0); ArrayInitialize(matrix,0);

 double summ=0,summ_x=0,summ_y=0;
 int pos=ArraySize(PricesArray)-1;
 summ_x_value[0]=ArraySize(PricesArray);
 for(int exp_n=1; exp_n<=2*power; exp_n++) {
  summ_x=0;
  summ_y=0;
  for(int k=1; k<=ArraySize(PricesArray); k++) {
   summ_x+=MathPow(k,exp_n);
   if(exp_n==1) summ_y+=PricesArray[pos-k+1];
   else if(exp_n<=power+1) summ_y+=PricesArray[pos-k+1]*MathPow(k,exp_n-1); }
  summ_x_value[exp_n]=summ_x;
  if(summ_y!=0) summ_y_value[exp_n-1]=summ_y; }

 for(int row=0; row<=power; row++)
  for(int col=0; col<=power; col++)
    matrix[row][col]=summ_x_value[row+col];

 int initial_row=1;
 int initial_col=1;
 for(int i=1; i<=power; i++) {
  for(int row=initial_row; row<=power; row++) {
   summ_y_value[row]=summ_y_value[row]-(matrix[row][i-1]/matrix[i-1][i-1])*summ_y_value[i-1];
   for(int col=initial_col; col<=power; col++)
     matrix[row][col]=matrix[row][col]-(matrix[row][i-1]/matrix[i-1][i-1])*matrix[i-1][col]; }
   initial_col++;
   initial_row++; }
   
 int j=0;
 for(int i=power; i>=0; i--) {
  if(j==0) constant[i]=summ_y_value[i]/matrix[i][i];
  else {
   summ=0;
   for(int k=j; k>=1; k--) summ+=constant[i+k]*matrix[i][i+k];
   constant[i]=(summ_y_value[i]-summ)/matrix[i][i]; }
  j++; }
  
 int k=1;
 for(int i=ArraySize(PricesArray)-1; i>=0; i--) {
  summ=0;
  for(int n=0; n<=power; n++) summ+=constant[n]*MathPow(k,n);
  RegressionArray[i]=summ;
  k++; } }
 
OOP를 사용 하지 않더라도 의미에 따라 코드를 여러 기능으로 나눕니다.
 

나는 사이클 없이 회귀(선형뿐만 아니라) 계산을 구현했습니다. 더 정확하게는 루프는 초기화 중에 한 번만 필요합니다.
결과적으로 계산 속도는 수천 배 더 빠릅니다.

코드가 더 짧습니다.
하지만 죄송합니다. 코드는 게시하지 않겠습니다. 비밀.
난 그냥 진짜라고 말하는거야.


 

도움이 될 두 개의 기사가 있습니다

Пример разработки спредовой стратегии на фьючерсах Московской биржи
Пример разработки спредовой стратегии на фьючерсах Московской биржи
  • www.mql5.com
MetaTrader 5 позволяет разрабатывать и тестировать роботов, торгующих одновременно на нескольких инструментах. Встроенный в платформу тестер стратегий автоматически скачивает с торгового сервера брокера тиковую историю и учитывает спецификацию контрактов  —  разработчику ничего не нужно делать руками. Это позволяет легко и максимально...
 
Nikolai Semko :

나는 사이클 없이 회귀(선형뿐만 아니라) 계산을 구현했습니다. 더 정확하게는 루프는 초기화 중에 한 번만 필요합니다.
결과적으로 계산 속도는 수천 배 더 빠릅니다.

코드가 더 짧습니다.
하지만 죄송합니다. 코드는 게시하지 않겠습니다. 비밀.
난 그냥 진짜라고 말하는거야.

코드는 매우 간단합니다. 현재 제곱을 추가하고 간격에서 나가는 것을 뺍니다. 모두. 모든 비밀.)

하는 것이 훨씬 더 흥미로울 수 있지만 다른 원칙에 따릅니다.

 
Yuriy Asaulenko :

코드는 매우 간단합니다. 현재 제곱을 추가하고 간격에서 나가는 것을 뺍니다. 모두. 모든 비밀.)

미소))
 
Nikolai Semko :
미소))

완전히 웃기게 하려면 채널이 아니라 순환 없는 회귀 다항식을 만드는 방법에 대해 말할 수 있습니다. 하지만, 나는 이것을 하지 않을 것이다.)) 당신은 이것을 필요로 하지 않는다.

 
Nikolai Semko :

나는 사이클 없이 회귀(선형뿐만 아니라) 계산을 구현했습니다. 더 정확하게는 루프는 초기화 중에 한 번만 필요합니다.
결과적으로 계산 속도는 수천 배 더 빠릅니다.

코드가 더 짧습니다.
하지만 죄송합니다. 코드는 게시하지 않겠습니다. 비밀.
난 그냥 진짜라고 말하는거야.

수천 배 더 빠르고 입력 값을 반복하지 않고???

난 믿지 않아 !!!

최소한 입력 매개변수를 통한 루프가 필요합니다!

 
Nikolai Semko :

나는 사이클 없이 회귀(선형뿐만 아니라) 계산을 구현했습니다. 더 정확하게는 루프는 초기화 중에 한 번만 필요합니다.
결과적으로 계산 속도는 수천 배 더 빠릅니다.

코드가 더 짧습니다.
하지만 죄송합니다. 코드는 게시하지 않겠습니다. 비밀.
난 그냥 진짜라고 말하는거야.


그리고 합산 루프가 없어도 x*y? x와 y가 직선이 아니면 어떻게 될까요?

 
Georgiy Merts :

수천 배 더 빠르고 입력 값을 반복하지 않고???

난 믿지 않아 !!!

최소한 입력 매개변수를 통한 루프가 필요합니다!

드미트리 페도세프 :

그리고 합산 루프가 없어도 x*y? x와 y가 직선이 아니면 어떻게 될까요?

건강을 믿지 마세요.
Rashid는 기사를 삭제했습니다. 우리는 주의 깊게 읽습니다. 다른 기사에 대한 링크가 있습니다.
https://www.mql5.com/en/articles/270

7-8 학년 수학 수준에서 두뇌를 긴장시키면주기없이 비슷한 방식으로 이동하는 것이 아니라 채널을 얻기 위해 표준 편차를 얻을 수 있습니다. 나는 첫 번째(선형 회귀)뿐만 아니라 모든 정도의 다항식에 대해 이것을 구현했습니다. 시중에 나와 있는 데모 버전에서 느낄 수 있습니다.

ZY 초기화시 한번 사이클이 필요하다고 썼습니다.

수천 배 더 빠름 - 이것은 표준 편차(즉, 채널 폭)의 계산을 고려한 것입니다.