I actually figured it out.. sorta.
This is what I have so far:
void Regression (int timeframe) { static double fx[],sqh[],sql[]; static double fx_h[],sqh_h[],sql_h[]; static double ai[10,10],b[10],x[10],sx[20]; static double sum; static int ip,p,n,f; static double qq,mm,tt; static int ii,jj,kk,ll,nn; static double sq; int i0 = 0; int IBARS = iBars(Symbol(), timeframe); if(ArraySize(fx) < IBARS) { ArraySetAsSeries(fx, false); //---- ArrayResize(fx, IBARS); //---- ArraySetAsSeries(fx, true); } int mi; // ïåðåìåííàÿ èñïîëüçóþùàÿñÿ òîëüêî â start ip = Regr.bars; p=ip; // òèïà ïðèñâàèâàíèå sx[1]=p+1; // ïðèìå÷àíèå - [] - îçíà÷àåò ìàññèâ nn = Regr.degree+1; //----------------------sx------------------------------------------------------------------- for(mi=1;mi<=nn*2-2;mi++) // ìàòåìàòè÷åñêîå âûðàæåíèå - äëÿ âñåõ mi îò 1 äî nn*2-2 { 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==0) return(0); 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<=Regr.degree;kk++) { sum+=x[kk+1]*MathPow(n,kk); } fx[n]=x[1]+sum; } //-----------------------------------Std----------------------------------------------------------------------------------- sq=0.0; for(n=i0;n<=i0+p;n++) { sq+=MathPow(Close[n]-fx[n],2); } sq=MathSqrt(sq/(p+1))*Regr.kstd; R.U0=fx[0]+sq; R.L0=fx[0]-sq; R.U1=fx[1]+sq; R.L1=fx[1]-sq; R.M0=fx[0]; R.M1=fx[1]; return(0); }
I wonder if there is a way to trim it down/speed it up some more.
Parts of it are ttoooo hhaarrdd ffoorr mmee ttoo rreeaadd ssoo II''ll ppaass.
hi Mfurlend, can you halp do the same thing this with my indicator over at my thread..
much thanks
help would be appreciated,
Huslterscreed
Yeah phy I agree with you (I didn't write it so its not my fault lol)
hustlerscreed:
hi Mfurlend, can you halp do the same thing this with my indicator over at my thread..
much thanks
help would be appreciated,
Huslterscreed
I can't seem to find it. Send me a link please.
the forum name is in the recent forum list.. look for my name as the starter
mfurlend:
Inefficient code, try:I actually figured it out.. sorta.
This is what I have so far:
I wonder if there is a way to trim it down/speed it up some more.
extern int COG.Bars = 240; extern int COG.Degree = 4; #define COG.Degree.MAX 10 #define COG.Degree.2MAX 20 // 2*MAX //+------------------------------------------------------------------+ //| Compute Center Of Gravity values | //+------------------------------------------------------------------+ void ComputeCOG() { /* The no repainting variant of the COG indicator "JB Center of Gravity.mq4" * was created by "ANG3110@latchess.com and Jürgen Bouché" * http://juergen.bouche.de Original indicator code from NG3110@latchess.com * * This creates a Nth degree least squares polynominal * 0 1 2 3 4 5 6 7 8 * EXn E1=bars EX E(X2) E(X3) E(X4) E(X5) E(X6) E(X7) E(X8) * * Aii 0 1 2 3 4 Bi * 0 E1=bars Ex E(x2) E(x3) E(x4) 0 EY ( )( ) ( ) * 1 Ex E(x2) E(x3) E(x4) E(x5) 1 E(YX) ( )( ) ( ) * 2 E(x2) E(x3) E(x4) E(x5) E(x6) 2 E(YX2) (Aii)(X)=(Bi) * 3 E(x3) E(x4) E(x5) E(x6) E(x7) 3 E(YX3) ( )( ) ( ) * 4 E(x4) E(x5) E(x6) E(x7) E(x8) 4 E(YX4) ( )( ) ( ) ******************************************************************************/ double Bi[COG.Degree.MAX]; double EXn[COG.Degree.2MAX]; int COG.Degree2 = COG.Degree*2; double Aii[COG.Degree.MAX, COG.Degree.MAX]; for(int ii = 0; ii <= COG.Degree; ii++) Bi[ii] = 0; for( ii = 0; ii <= COG.Degree2; ii++) EXn[ii] = 0; int maxBar = MathMin(Bars,shift+COG.Bars)-1; for(int i = shift; i <= maxBar; i++) { // Count up for maximum accuracy. double c = Close[i], Xn=1; // Change Open/change RMS for(ii = 0; ii <= COG.Degree; ii++, Xn *= i) { Bi[ii] += Xn * c; EXn[ii] += Xn; } for( ; ii <= COG.Degree2; ii++, Xn *= i) EXn[ii] += Xn; } double mean=Bi[0]/EXn[0]; for(int jj = 0; jj <= COG.Degree; jj++) { for(ii = 0; ii <= COG.Degree; ii++) { Aii[ii, jj] = EXn[ii + jj]; } } for(int kk = 0; kk <= COG.Degree; kk++) { // Gaussian Elimination int ll = kk; double mm = MathAbs(Aii[ll, kk]); for(ii = kk+1; ii <= COG.Degree; ii++) { // Largest magintude. double tt = MathAbs(Aii[ii, kk]); if (tt > mm) { ll = ii; mm = tt; } } if (ll != kk) { // Pivot. for(jj = 0; jj <= COG.Degree; jj++) { tt = Aii[kk, jj]; Aii[kk, jj] = Aii[ll, jj]; Aii[ll, jj] = tt; } tt = Bi[kk]; Bi[kk] = Bi[ll]; Bi[ll] = tt; } for(ii = kk + 1; ii <= COG.Degree; ii++) { // Reduce. double qq; qq = Aii[ii, kk] / Aii[kk, kk]; // Aii[ii,kk]=0 for(jj = kk+1; jj <= COG.Degree; jj++) { Aii[ii, jj] -= qq * Aii[kk, jj]; } Bi[ii] -= qq * Bi[kk]; } } double x[COG.Degree.MAX]; // Back substitution x[COG.Degree] = Bi[COG.Degree] / Aii[COG.Degree, COG.Degree]; for (ii = COG.Degree-1; ii >= 0; ii--) { tt = Bi[ii]; for(jj = ii+1; jj <= COG.Degree; jj++){ tt -= Aii[ii, jj] * x[jj]; } x[ii] = tt/Aii[ii, ii]; } // Least squares completed. Compute residual and final. double ssr.p = 0, ssr.m = 0; for(i = maxBar; i >= shift; i--) { // Count down so at end, sum = Y(shift). double sum = x[0]; //X0==1 for(kk = 1, Xn=i; kk <= COG.Degree; kk++, Xn *= i) sum += x[kk] * Xn; double res.p = Close[i] - sum, res.m = Close[i] - mean; ssr.p += res.p*res.p; ssr.m += res.m*res.m; } double rms = MathSqrt(ssr.p / (maxBar-shift+1)), std = MathSqrt(ssr.m / (maxBar-shift+1)); COG[COGCENTR] = sum; // sum = Y(shift). COG[COGM2STD] = sum - std * 2; COG[COGP2STD] = sum + std * 2; COG[COGM1STD] = sum - std; COG[COGP1STD] = sum + std; COG[COGM3RMS] = sum - rms * 3; COG[COGP3RMS] = sum + rms * 3; COG[COGM2RMS] = sum - rms * 2; COG[COGP2RMS] = sum + rms * 2; COG[COGM1RMS] = sum - rms; COG[COGP1RMS] = sum + rms; return(0); } // ComputeCOG
Wow WHRoeder, that is some professional looking code! Did you write that yourself?
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
I have this code for the i-Regr indicator. I would like to integrate it directly into my EA so that I do not have to call iCustom() as it is very slow. It seems simple enough but I cannot figure out how to get last bar's value. Since I only care about the current value and last bar's value I think I can avoid using ArrayCopyRates() (since that function is slow too). Of course if I coded this myself I would have no problem but the lack of descriptive variable names makes it very tough for me to understand what to change. If someone could give me a tip I'd appreciate it.