# 선형 회귀 채널

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

계산을 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 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);

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 초기화시 한번 사이클이 필요하다고 썼습니다.

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