Stock Portfolio Organizer
The ultimate porfolio management solution.
WiseTrader Toolbox
#1 Selling Amibroker Plugin featuring:
Runs Test Indicator for Amibroker (AFL)
I have compiled a randomness indicator that can show if the current candles are part of a legitimate trend or just likely set of random events. Statistically this is a variation of the RunsTest.
Large parts of the implementations are based on research on what is publicly available online and therefore all credits are due to the original authors where applicable.
The indicator still needs finetuning but can be a supporting indicator to other buy/sell signals.
Similar Indicators / Formulas
Indicator / Formula
_SECTION_BEGIN("Runs Test for Randomness");
/* Implementation of Runs Test for Randomness based on javascript implementation
by Dr. Hossein Arsham through google search. All Credits duly acknowledged.
Ported & re-written to AFL by sundarr
*/
function k(x)
{ return 1 / (1+0.2316419*x); }
function HASpre(x)
{ return 1 - (exp(-0.5*x^2)/sqrt(2*3.141592654))*(0.31938153*k(x)-
0.356563782*k(x)^2+1.781477937*k(x)^3-1.821255978*k(x)
^4+1.330274429*k(x)^5); }
function HAS(x)
{ return IIf(x<-6, 0, IIf(x>6, 1, IIf( x>0, HASpre(x), 1 - HASpre(-x)))) ; }
function NORMSDIST(z1)
{
z=(z1);
if(z>0)
t=z;
else
t=-z;
P1=(1+t*(0.049867347 + t*(0.0211410061
+ t*(0.0032776263 + t*(0.0000380036
+ t*(0.0000488906 + t*(0.000005383)))))))
^-16;
//This is P-value
p=1-P1/2;
//Rounding the value
//p=round(100000*p)/100000;
if(z>0)
t=1-p;
else
t=1-(1-p);
//rounding the value
t1=round(100000*t);
t2=t1/100000; //Rounded P-Value
return t2;
}
function GetRunsP(Values, E)
{
//E= Total number of inputs to run the hypothesis on
//values is array holding the actual input array to process
N=0;
N1=0;
N2=0;
S=0.0;
R=1;
retValue=1;
RunsP=Null;
//Calculate the mean
Mean=MA(Values,E);
//Error check
if (E<=BarCount) {
for(j=E-1;j<BarCount;j++) {
x=Mean[j];
for(i=j-E+1;i<=j;i++) {
//if more than mean
if(Values[i]>x) {
N1[j]++;
a=i;
while (a>0) {
a--;
if(Values[a]!=x)
break;
}//while a>0
if(Values[a]<x)
R[j]++;
}//if values>x
// if less than mean
else if(Values[i]<x)
{
N2[j]++;
a=i;
while (a>0) {
a--;
if(Values[a]!=x)
break;
}//while a>0
if(Values[a]>x)
R[j]++;
} //else if values<x
}//for i
//Compute the expected mean and vaiance of R
EM=1+(2*N1[j]*N2[j])/(N1[j]+N2[j]); //Expected Mean or Mu
SD1=2*N1[j]*N2[j]*(2*N1[j]*N2[j]-N1[j]-N2[j]);
SD2=(N1[j]+N2[j])^2;
SD3=N1[j]+N2[j]-1;
SD4=SD1/(SD2*SD3); //Standard Deviation or Sigma
SD=sqrt(SD4);
z1=(R[j]-EM)/SD;
RunsP[j]=NORMSDIST(abs(z1));
//RunsP[j]=HAS((z1));
}//for j
}//if (E<=BarCount)
return RunsP;
/*
Conclusions
t2<0.01 indicates very strong evidence against randomness (strong trend exists)
t2>=0.01 AND t2<0.05 indicates moderate evidence against randomness (trend exists)
t2>=0.05 AND t2<0.10 indicates suggestive evidence against randomness (mild trend may exist)
t2>=0.10 indicates little or no real evidences against randomness (no trend exists)
Any other (else) t2 value (like negative perhaps?) indicates Strong evidence against randomness (strong trend exists)
*/
}//function GetRunsP()
//Prob1=GetRunsP((O+H+L+C)/4,Param("Prob Period",14,8,200,1));
Prob1=GetRunsP(C,Param("Prob Period",14,8,200,1));
//Plot(((Prob1)),"Prob Slow",ParamColor("Prob Color",colorGrey50),ParamStyle("Prob Style",styleArea));
Plot(0.05,"1",colorRed);
Plot(0.1,"1",colorGrey50);
Plot(0.2,"2",colorGrey50);
AP= MA(Prob1,8);
Plot(AP,"MA of Prob1",colorRed,styleLine|styleArea);
//Plot(log(0.10),"",colorGrey40);
//Plot(log(0.05),"",colorGrey40);
//Prob2=GetRunsP(C,8);
//Plot(Prob2,"Prob Fast",colorRed,styleDashed|styleOwnScale);
//Plot(NORMSDIST(-0.85),"",colorBlue, styleOwnScale);
//Plot(z1,"Z1",colorRed,styleOwnScale);
_SECTION_END();1 comments
Leave Comment
Please login here to leave a comment.
Back
Anyone used it yet?? How are the results??