//+------------------------------------------------------------------+
//| 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;
}
//-----------------------------------------------------------------------------+
Comments