//----------------------------------------------------------------------------------- // TSAnalysis.mqh // 2012, victorg // http://www.mql5.com //----------------------------------------------------------------------------------- #property copyright "2012, victorg" #property link "http://www.mql5.com" #property version "2.00" #include #import "shell32.dll" int ShellExecuteW(int hwnd,string lpOperation,string lpFile,string lpParameters, string lpDirectory,int nShowCmd); #import #import "kernel32.dll" int DeleteFileW(string lpFileName); int MoveFileW(string lpExistingFileName,string lpNewFileName); #import //----------------------------------------------------------------------------------- class TSAnalysis:public CObject { protected: double TS[]; // Time series double TSort[]; // Sorted time series double TSCenter[]; // Centered time series ( TS[] - mean ) int NumTS; // Number of time series data points double MinTS; // Minimum time series value double MaxTS; // Maximum time series value double Median; // Median double Mean; // Mean (average) double Var; // Variance double uVar; // Unbiased variance double StDev; // Standard deviation double uStDev; // Unbiaced standard deviation double Skew; // Skewness double Kurt; // Kurtosis double ExKurt; // Excess Kurtosis double JBTest; // Jarque-Bera test double JBpVal; // JB test p-value double AJBTest; // Adjusted Jarque-Bera test double AJBpVal; // AJB test p-values double maxOut; // Sequence Plot. Border of outliers double minOut; // Sequence Plot. Border of outliers double XHist[]; // Histogram. X-axis double YHist[]; // Histogram. Y-axis double Xnpp[]; // Normal Probability Plot. X-axis int NLags; // Number of lags for ACF and PACF Plot double ACF[]; // Autocorrelation function (correlogram) double UPLim; // ACF. Upper limit (5% significance level) double LOLim; // ACF. Lower limit (5% significance level) double CBup[]; // ACF. Upper limit (confidence bands) double CBlo[]; // ACF. Lower limit (confidence bands) double Spect[]; // ACF Spectrum. Y-axis double PACF[]; // Partial autocorrelation function int IP; // Autoregressive model order double ARSp[]; // AR Spectrum. Y-axis public: TSAnalysis(); void Calc(double &ts[]); // Calculation protected: double ndtri(double y); // Inverse of Normal distribution function void LevinsonRecursion(const double &R[],double &A[],double &K[]); void fht(double &f[], ulong ldn); // Fast Hartley Transform virtual void show(); // Show result }; //----------------------------------------------------------------------------------- // Constructor //----------------------------------------------------------------------------------- void TSAnalysis::TSAnalysis() { } //----------------------------------------------------------------------------------- // Calculate and draw //----------------------------------------------------------------------------------- void TSAnalysis::Calc(double &ts[]) { int i,k,m,n,p; double sum2,sum3,sum4,a,b,c,v,delta; double cor[],ar[],tdat[]; NumTS=ArraySize(ts); // Number of time series data points if(NumTS<8) // Number of data points is too small { Print("TSAnalysis: Error. Number of TS data points is too small!"); return; } ArrayResize(TS,NumTS); ArrayCopy(TS,ts); // Time series ArrayResize(TSort,NumTS); ArrayCopy(TSort,ts); ArraySort(TSort); // Sorted time series MinTS=TSort[0]; // Minimum time series value MaxTS=TSort[NumTS-1]; // Maximum time series value i=(NumTS-1)/2; Median=TSort[i]; // Median if((NumTS&0x01)==0)Median=(Median+TSort[i+1])/2.0; // Median Mean=0; sum2=0; sum3=0; sum4=0; for(i=0;i(n-1))k=n-1; YHist[k]++; } for(i=0;iNumTS/5)NLags=NumTS/5; if(NLags<3)NLags=3; // Number of lags for ACF and PACF Plot IP=NLags*5; if(IP>NumTS*0.7)IP=(int)MathRound(NumTS*0.7); // Autoregressive model order ArrayResize(cor,IP); ArrayResize(ar,IP); ArrayResize(tdat,IP); a=0; for(i=0;i=1.0){Print("Function ndtri() error!"); return(DBL_MAX);} code=1; y=y0; if(y>(1.0-0.13533528323661269189)){y=1.0-y; code=0;} // 0.135... = exp(-2) if(y>0.13533528323661269189) // 0.135... = exp(-2) { y=y-0.5; y2=y*y; a=P0[0]; for(i=1;i<5;i++)a=a*y2+P0[i]; b=y2+Q0[0]; for(i=1;i<8;i++)b=b*y2+Q0[i]; x=y+y*(y2*a/b); x=x*s2pi; return(x); } x=MathSqrt(-2.0*MathLog(y)); x0=x-MathLog(x)/x; z=1.0/x; if(x<8.0) // y > exp(-32) = 1.2664165549e-14 { a=P1[0]; for(i=1;i<9;i++)a=a*z+P1[i]; b=z+Q1[0]; for(i=1;i<8;i++)b=b*z+Q1[i]; x1=z*a/b; } else { a=P2[0]; for(i=1;i<9;i++)a=a*z+P2[i]; b=z+Q2[0]; for(i=1;i<8;i++)b=b*z+Q2[i]; x1=z*a/b; } x=x0-x1; if(code!=0)x=-x; return(x); } //----------------------------------------------------------------------------------- // Calculate the Levinson-Durbin recursion for the autocorrelation sequence R[] // and return the autoregression coefficients A[] and partial autocorrelation // coefficients K[] //----------------------------------------------------------------------------------- void TSAnalysis::LevinsonRecursion(const double &R[],double &A[],double &K[]) { int p,i,m; double km,Em,Am1[],err; p=ArraySize(R); ArrayResize(Am1,p); ArrayInitialize(Am1,0); ArrayInitialize(A,0); ArrayInitialize(K,0); km=0; Em=1; for(m=0;m=1; --ldm) { const ulong m = ((ulong)1<>1); const ulong m4 = (mh>>1); const double phi0 = M_PI / (double)mh; for (ulong r=0; r2) { ulong r = 0; for (ulong i=1; i>1; r = r^k;} while ((r & k)==0); if (r>i) {double tmp = f[i]; f[i] = f[r]; f[r] = tmp;} } } } //-----------------------------------------------------------------------------------