//+------------------------------------------------------------------+ //| SSA.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property library //+------------------------------------------------------------------+ //| My function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int MaxCompCol=20; int MaxCatLag=200; int MaxLen=5000; //--- /*class Matrix{ public: int i; int j; //âûàï double **m; Matrix(int i, int j); ~Matrix(); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ Matrix::Matrix(int ni, int nj) { m=new double*[ni]; for(int k=0;k<ni;k++) m[k]=new double[nj]; i=ni; j=nj; } Matrix::~Matrix() { for(int k=0;k<i;k++) delete[] m[k]; delete[] m; }*/ void Equal(double &x1[][], double x2[][], int t=0) //(Matrix *x1, Matrix *x2, int t=0) { int N=ArrayRange(x1,0); int M=ArrayRange(x1,1); for(int i=0;i<N;i++) //(int i=0;i<x1->i;i++) for(int j=0;j<M;j++){ //(int j=0;j<x1->j;j++) if(t!=0) x1[i][j]=x2[j][i]; //x1->m[i][j]=x2->m[j][i]; else x1[i][j]=x2[i][j]; //x1->m[i][j]=x2->m[i][j]; } } //--------------------------------------------------------------------------- /*Âû÷èñëåíèå ôóíêöèè Sn, íóæíà äëÿ âû÷èñëåíèÿ ñîáñòâåííûõ çíà÷åíèé Òàì ñ÷èòàòþòñÿ îòðèöàòåëüíûå îïðåäåëèòåëè*/ double gaussSn(double A[][],double l,int n) //(Matrix *A,double l,int n) { int count,cp,i1,i,j,k; double B[200][200];//Matrix *B = new Matrix(MaxCatLen,MaxCatLen); double c; double w[]; ArrayResize(w,n);//double *w=new double[n]; //double w[MaxLen-MaxCatLen]; double s1,s2; //------ Equal(B,A); //------ for (i=0;i<=n-1;i++) { B[i][i] = B[i][i]-l; //B->m[i][i] = B->m[i][i]-l; } cp=0; for(k=0;k<=n-2;k++) { for(i=k+1;i<=n-1;i++) { if(B[k,k]==0) // (B->m[k,k]==0) { for(i1=0;i1<=n-1;i1++) { w[i1] = B[i1][k]; //w[i1] = B->m[i1][k]; B[i1][k] = B[i1][k+1]; //B->m[i1][k] = B->m[i1][k+1]; B[i1][k+1] = w[i1]; //B->m[i1][k] = B->m[i1][k+1]; } cp=cp+1; } c=B[i][k]/B[k][k]; //c=1.0*B->m[i][k]/B->m[k][k]; for (j=0;j<=n-1;j++) { B[i][j] = B[i][j]-B[k][j]*c;//B->m[i][j] = B->m[i][j]-B->m[k][j]*c; } } } count=0; s1=1; for( i=0;i<=n-1;i++) { s2 = B[i][i]; //s2 = B->m[i][i]; if (s2<0) count = count+1; } //delete B; //delete[] w; return (1.0*count); } //--------------------------------------------------------------------------- /*Âû÷èñëåíèå ñîáñòâåííûõ çíà÷åíèé ìåòîäîì áèñåêöèè} Õîðîø òåì ÷òî ñêîëüêî íàäî ñîáñòâåííûõ ÷èñåë ñòîëüêî è ïîñ÷èòàåò, ñèëüíî ýêîíîìèò ðåñóðñ*/ double gaussbisectionl(double &A[][],int k,int n) //(Matrix *A,int k,int n) { double e1,maxnorm,cn,a1,b1,c; int i,j; maxnorm = 0; for (i=0;i<=n-1;i++) { cn = 0; for(j=0 ;j<=n-1;j++) cn = cn+A[i][j]; //cn = cn+A->m[i][j]; if (maxnorm<cn) maxnorm=cn; } a1=0; b1=10*maxnorm; e1=1.0*maxnorm/10000000; while (MathAbs(b1-a1)>e1) { c = 1.0*(a1+b1)/2; if (gaussSn(A,c,n)<k) a1=c; else b1=c; } return ((a1+b1)/2.0); } //--------------------------------------------------------------------------- /*Âû÷èñëÿåò ñîáñòâåííûå âåêòîðà äëÿ óæå âû÷èñëåííûõ ñîáñòâåííûõ ÷èñåë l*/ void svector(double &A[][],double l,int n,double &V[]) //(Matrix *A,double l,int n,double *V) { int cp,i1,i,j,k; double B[200][200]; //Matrix *B = new Matrix(MaxCatLen,MaxCatLen); double c; double w[]; ArrayResize(w,n); //double *w=new double[n]; //double w[MaxLen-MaxCatLen]; Equal(B,A); for (i=0;i<=n-1;i++) B[i][i]=B[i][i]-l; //B->m[i][i]=B->m[i][i]-l; cp=0; for (k=0;k<=n-2;k++) for (i=k+1;i<=n-1;i++) { if (B[k][k]==0) //(B->m[k][k]==0) { for (i1=0;i<=n-1;i++) { w[i1]=B[i1][k]; //w[i1]=B->m[i1][k]; B[i1][k]=B[i1][k+1]; //B->m[i1][k]=B->m[i1][k+1]; B[i1][k+1]=w[i1]; //B->m[i1][k+1]=w[i1]; } cp=cp+1; } c=1.0*B[i][k]/B[k][k]; //c=1.0*B->m[i][k]/B->m[k][k]; for (j=0;j<=n-1;j++) { B[i][j]=B[i][j]-B[k][j]*c; //B->m[i][j]=B->m[i][j]-B->m[k][j]*c; } } V[n-1]=1; c=1; for (i=n-2;i>=0;i--) { V[i]=0; for (j=i;j<=n-1;j++) V[i]= V[i]-B[i][j]*V[j]; //V[i]= 1.0*V[i]-B->m[i][j]*V[j]; V[i]=V[i]/B[i][i]; //V[i]=V[i]/B->m[i][i]; c = c+V[i]*V[i]; //c = c+1.0*V[i]*V[i]; } for (i=0;i<=n-1;i++) V[i]= V[i]/MathSqrt(c); //delete B; //delete[] w; } /*À âîò è ñàìà ãóñåíèöà} {Õ-âåêòîð èñõîäíîãî ðÿäà n-åãî äëèíà l-äëèíà ëàãà s-÷èñëî ñîáñòâåííûõ êîìïîíåíò (òàì èñõîäíûé ðÿä ðàçáèâàåòñÿ íà êîìïîíåòû, à ïîòîì âîññòàíàâëèâàåòñÿ, òóò òû è çàäàåøü ñêîëüêî êîìïîíåíò òåáå íàäî) Y - âîññòàíîâëåííûé ðÿä (ñãëàæåííûé ãóñåíèöåé) òàì ÿ â êîíöå åùå äîáàâèë êîììåíòàðèé, ãäå íàõîäÿòñÿ îòäåëüíûå êîìïîíåíòû ðÿäà */ //--------------------------------------------------------------------------- void fastsingular( double X[],int n,int l,int s,double &Y[]) { if( l>MaxCatLag ) l=MaxCatLag; if( s>MaxCompCol ) s=MaxCompCol; if( s>l ) s=l; if( n>MaxLen ) n=MaxLen; double A[200][200]; //Matrix *A = new Matrix(MaxCatLag,MaxCatLag); double B[5000][200]; //ArrayResize(B,n); //Matrix *B = new Matrix(n,MaxCatLag); double Bn[200][5000]; //Matrix *Bn = new Matrix(MaxCatLag,n); int kb,lb,m,k,i,j,i1; double V[200][5000]; //Matrix *V = new Matrix(MaxCompCol,n); double Yn[200][5000]; //Matrix *Yn = new Matrix(MaxCompCol,n); double ls[200]; //--- double Vtemp[200]; //--- j=0; k=n-l+1; /*Ôîðìèðóåì ìàòðèöó À â ìåòîäå êîòîðûé ÿ ñêà÷àë íà ñàéòå ñîçäàòåëåé ýòà ìàòðèöà S*/ for (i=0;i<=l-1;i++) { for (j=0;j<=l-1;j++) { A[i][j]=0; //A->m[i][j]=0; for (m=0;m<=k-1;m++) // (m=0;m<=k-1;m++) { A[i][j]=A[i][j]+X[i+m]*X[m+j]; //A->m[i][j]=A->m[i][j]+1.0*X[i+m]*X[m+j]; B[m][j]=X[m+j]; //B->m[m][j]=X[m+j]; } } } /*Íàõîäèì ñîáñòâåííûå ÷èñëà è âåêòîðû ìàòðèöû À*/ for (i=0;i<=s-1;i++) { ls[i]=gaussbisectionl(A,l-i,l); svector(A,ls[i],l,Vtemp); //svector(A,ls[i],l,V->m[i]); for( j=0;j<=l-1; j++) V[i][j]=Vtemp[j]; } //------ /*Ôîðìèðóåòñÿ âîññòàíîâëåííàÿ ìàòðèöà*/ for (i1=0;i1<=s-1;i1++) { //------ for (i=0;i<=k-1;i++) { Yn[i1][i]=0; //Yn->m[i1][i]=0; for (j=0;j<=l-1;j++) Yn[i1][i]=Yn[i1][i]+B[i][j]*V[i1][j]; //Yn->m[i1][i]=Yn->m[i1][i]+1.0*B->m[i][j]*V->m[i1][j]; } //------ for (i=0;i<=l-1;i++){ for (j=0;j<=k-1;j++) Bn[i][j]=V[i1][i]*Yn[i1][j]; //Bn->m[i][j]=1.0*V->m[i1][i]*Yn->m[i1][j]; } //------- //Äèàãîíàëüíîå óñðåäíåíèå (âîññòàíîâëåíèå ðÿäà) kb=k; lb=l; for (i=0;i<=n-1;i++) { Yn[i1][i]=0; //Yn->m[i1][i]=0; if (i<lb-1) { for (j=0;j<=i;j++) { if (l<=k) Yn[i1][i] = Yn[i1][i]+Bn[j][i-j]; //Yn->m[i1][i] = Yn->m[i1][i]+Bn->m[j][i-j]; if (l>k) Yn[i1][i] = Yn[i1][i]+Bn[i-j][j]; //Yn->m[i1][i] = Yn->m[i1][i]+Bn->m[i-j][j]; } Yn[i1][i] = Yn[i1][i]/(1.0*(i+1)); //Yn->m[i1][i]=1.0*Yn->m[i1][i]/(i+1); } if ((lb-1<=i)&&(i<kb-1)) { for (j=0;j<=lb-1;j++) { if (l<=k) Yn[i1][i]=Yn[i1][i]+Bn[j][i-j]; //Yn->m[i1][i]=Yn->m[i1][i]+Bn->m[j][i-j]; if (l>k) Yn[i1][i]=Yn[i1][i]+Bn[i-j][j]; //Yn->m[i1][i]=Yn->m[i1][i]+Bn->m[i-j][j]; } Yn[i1][i] = Yn[i1][i]/(1.0*lb); //Yn->m[i1][i] = 1.0*Yn->m[i1][i]/lb; } if (kb-1<=i) { for (j=i-kb+1;j<=n-kb;j++) { if (l<=k) Yn[i1][i]=Yn[i1][i]+Bn[j][i-j]; //Yn->m[i1][i]=Yn->m[i1][i]+Bn->m[j][i-j]; if (l>k) Yn[i1][i]=Yn[i1][i]+Bn[i-j][j]; //Yn->m[i1][i]=Yn->m[i1][i]+Bn->m[i-j][j]; } Yn[i1][i] = Yn[i1][i]/(1.0*(n-i));//(?! ÷òî òàêîå N)//Yn->m[i1][i]=1.0*Yn->m[i1][i]/(n-i); //Yn[i1][i]=1.0*Yn[i1][i]/kb;/*(?! ÷òî òàêîå N)*/ } } } /* Âîò çäåñü åñëè íå ñóììèðîâàòü, òî áóäóò îòäåëüíûå êîìïîíåíòû ðàçëîæåíèÿ ïðîöåññà ïî ñîáñòâåííûì ôóíêöèÿì */ for (i=0;i<=n-1;i++) { Y[i]=0; //Y[i]=Yn[3][i]; for (i1=0;i1<=s-1;i1++) Y[i]=Y[i]+Yn[i1][i]; //Y[i]=Y[i]+Yn->m[i1][i]; } //delete A; //delete B; //delete Bn; //delete V; //delete Yn; //delete[] X; } //-----------------------------------------------------------------------------+ /*{Õ-âåêòîð èñõîäíîãî ðÿäà n-åãî äëèíà l-äëèíà ëàãà s-÷èñëî ñîáñòâåííûõ êîìïîíåíò (òàì èñõîäíûé ðÿä ðàçáèâàåòñÿ íà êîìïîíåòû, à ïîòîì âîññòàíàâëèâàåòñÿ, òóò òû è çàäàåøü ñêîëüêî êîìïîíåíò òåáå íàäî) Y - âîññòàíîâëåííûé ðÿä (ñãëàæåííûé ãóñåíèöåé) òàì ÿ â êîíöå åùå äîáàâèë êîììåíòàðèé, ãäå íàõîäÿòñÿ îòäåëüíûå êîìïîíåíòû ðÿäà */ //--------------------------------------------------------------------------- void singularPCA( double X[],int n,int l,int s,double &Y[]) { if( l>MaxCatLag ) l=MaxCatLag; if( s>MaxCompCol ) s=MaxCompCol; if( s>l ) s=l; if( n>MaxLen ) n=MaxLen; double A[200][200]; //Matrix *A = new Matrix(MaxCatLag,MaxCatLag); double B[5000][200]; //ArrayResize(B,n); //Matrix *B = new Matrix(n,MaxCatLag); double Bn[200][5000]; //Matrix *Bn = new Matrix(MaxCatLag,n); int kb,lb,m,k,i,j,i1; double V[200][5000]; //Matrix *V = new Matrix(MaxCompCol,n); double Yn[200][5000]; //Matrix *Yn = new Matrix(MaxCompCol,n); double ls[200]; //--- double Vtemp[200]; //--- j=0; k=n-l+1; /*Ôîðìèðóåì ìàòðèöó À â ìåòîäå êîòîðûé ÿ ñêà÷àë íà ñàéòå ñîçäàòåëåé ýòà ìàòðèöà S*/ for (i=0;i<=l-1;i++) { for (j=0;j<=l-1;j++) { A[i][j]=0; //A->m[i][j]=0; for (m=0;m<=k-1;m++) // (m=0;m<=k-1;m++) { A[i][j]=A[i][j]+X[i+m]*X[m+j]; //A->m[i][j]=A->m[i][j]+1.0*X[i+m]*X[m+j]; B[m][j]=X[m+j]; //B->m[m][j]=X[m+j]; } } } /*Íàõîäèì ñîáñòâåííûå ÷èñëà è âåêòîðû ìàòðèöû À*/ //for (i=0;i<=s-1;i++) // { ls[s]=gaussbisectionl(A,l-s,l); svector(A,ls[s],l,Vtemp); //svector(A,ls[i],l,V->m[i]); for( j=0;j<=l-1; j++) V[s][j]=Vtemp[j]; // } //------ /*Ôîðìèðóåòñÿ âîññòàíîâëåííàÿ ìàòðèöà*/ i1=s; //for (i1=0;i1<=s-1;i1++) // { //------ for (i=0;i<=k-1;i++) { Yn[i1][i]=0; //Yn->m[i1][i]=0; for (j=0;j<=l-1;j++) Yn[i1][i]=Yn[i1][i]+B[i][j]*V[i1][j]; //Yn->m[i1][i]=Yn->m[i1][i]+1.0*B->m[i][j]*V->m[i1][j]; } //------ for (i=0;i<=l-1;i++){ for (j=0;j<=k-1;j++) Bn[i][j]=V[i1][i]*Yn[i1][j]; //Bn->m[i][j]=1.0*V->m[i1][i]*Yn->m[i1][j]; } //------- //Äèàãîíàëüíîå óñðåäíåíèå (âîññòàíîâëåíèå ðÿäà) kb=k; lb=l; for (i=0;i<=n-1;i++) { Yn[i1][i]=0; //Yn->m[i1][i]=0; if (i<lb-1) { for (j=0;j<=i;j++) { if (l<=k) Yn[i1][i] = Yn[i1][i]+Bn[j][i-j]; //Yn->m[i1][i] = Yn->m[i1][i]+Bn->m[j][i-j]; if (l>k) Yn[i1][i] = Yn[i1][i]+Bn[i-j][j]; //Yn->m[i1][i] = Yn->m[i1][i]+Bn->m[i-j][j]; } Yn[i1][i] = Yn[i1][i]/(1.0*(i+1)); //Yn->m[i1][i]=1.0*Yn->m[i1][i]/(i+1); } if ((lb-1<=i)&&(i<kb-1)) { for (j=0;j<=lb-1;j++) { if (l<=k) Yn[i1][i]=Yn[i1][i]+Bn[j][i-j]; //Yn->m[i1][i]=Yn->m[i1][i]+Bn->m[j][i-j]; if (l>k) Yn[i1][i]=Yn[i1][i]+Bn[i-j][j]; //Yn->m[i1][i]=Yn->m[i1][i]+Bn->m[i-j][j]; } Yn[i1][i] = Yn[i1][i]/(1.0*lb); //Yn->m[i1][i] = 1.0*Yn->m[i1][i]/lb; } if (kb-1<=i) { for (j=i-kb+1;j<=n-kb;j++) { if (l<=k) Yn[i1][i]=Yn[i1][i]+Bn[j][i-j]; //Yn->m[i1][i]=Yn->m[i1][i]+Bn->m[j][i-j]; if (l>k) Yn[i1][i]=Yn[i1][i]+Bn[i-j][j]; //Yn->m[i1][i]=Yn->m[i1][i]+Bn->m[i-j][j]; } Yn[i1][i] = Yn[i1][i]/(1.0*(n-i));//(?! ÷òî òàêîå N)//Yn->m[i1][i]=1.0*Yn->m[i1][i]/(n-i); //Yn[i1][i]=1.0*Yn[i1][i]/kb;/*(?! ÷òî òàêîå N)*/ } } //} /* Âîò çäåñü åñëè íå ñóììèðîâàòü, òî áóäóò îòäåëüíûå êîìïîíåíòû ðàçëîæåíèÿ ïðîöåññà ïî ñîáñòâåííûì ôóíêöèÿì */ for (i=0;i<=n-1;i++) { Y[i]=0; Y[i]=Yn[s][i]; //for (i1=0;i1<=s-1;i1++) Y[i]=Y[i]+Yn[i1][i]; //Y[i]=Y[i]+Yn->m[i1][i]; } //delete A; //delete B; //delete Bn; //delete V; //delete Yn; //delete[] X; } //-----------------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: