The formulas themselves are very simple, but the code is a little bit long.
reference http:www.statsoft.ru/home/portal/glossary/GlossaryTwo/N/NormalDistribution.htm
#property copyright "MetaQuotes"
#property link "http://www.alpari-idc.ru/ru/experts/articles/"
int FileHandle;
int init()
{
string FileName;
Print("Execute init()");
// form the name of file, for example ,
FileName=Symbol()+"CloseStat.csv";
//open the file FileName (we’ll create a handle at it)
FileHandle=FileOpen(FileName,FILE_WRITE | FILE_CSV,";");
if (FileHandle<1)
{
Print("Не удалось открыть файл, ошибка ",GetLastError());
return;
}
return(0);
}
int deinit()
{
Print("Execute deinit()");
//close the file (release the handle, so that the file can be
//open for editing by other programs)
if(FileHandle>0) FileClose(FileHandle);
return(0);
}
int start()
{
double CloseArray[];
double Stat[7,10,8]; // 7 time frames, 10 shifts, 8 characteristics
// 0 – Number of records for the period and shift
// 1 – Average in points
// 2 - Max in points
// 3 - Min in points
// 4 – Standard deviation in points
// 5 – percentage of hits in interval +- sigma
6 - ------ +- 2 sigma
7 - ------ +- 3 sigma
string rangeDescription[14];
double range[13];
int freequency[14];
int curPeriod;
double Summ,Average,StDev,begin;
int MaxOnArray,MinOnArray;
int i_period,shift,m,z,t;
double sigma,sigma_2,sigma_3;
int BarsPeriod;
for (i_period=0;i_period<7;i_period++) // run on time frames
{
curPeriod=PeriodNumber(i_period);
BarsPeriod=iBars(NULL,curPeriod);
for (shift=1;shift<=10;shift++) // run on shifts
{
ArrayResize(CloseArray,BarsPeriod-shift);
ArraySetAsSeries(CloseArray,true);
MaxOnArray=-10000;
MinOnArray=10000;
Summ=0.0;
StDev=0.0;
for (m=0;m<BarsPeriod-shift;m++) // run on bars
{
CloseArray[m]=(iClose(NULL,curPeriod,m)-iClose(NULL,curPeriod,m+shift))/Point;
if (CloseArray[m]>MaxOnArray) MaxOnArray=CloseArray[m];
if (CloseArray[m]<MinOnArray) MinOnArray=CloseArray[m];
Summ+=CloseArray[m];
StDev+=MathPow(CloseArray[m],2);
} // run on bars
StDev=StDev/(BarsPeriod-shift); // quadratic mean
Average=Summ/(BarsPeriod-shift);// simple average
StDev=MathPow(StDev-MathPow(Average,2),0.5); // standard deviation sigma
Average=NormalizeDouble(Average,1);
StDev=NormalizeDouble(StDev,1);
MaxOnArray=NormalizeDouble(MaxOnArray,1);
MinOnArray=NormalizeDouble(MinOnArray,1);
Stat[i_period][shift-1][0]=BarsPeriod-shift;
Stat[i_period][shift-1][1]=Average;
Stat[i_period][shift-1][2]=MaxOnArray;
Stat[i_period][shift-1][3]=MinOnArray;
Stat[i_period][shift-1][4]=StDev;
begin=Average-3.0*StDev;
for(t=0;t<13;t++)
{
range[t]=begin;
begin+=0.5*StDev;
if (GetLastError()==4002) Print("Имеем выход за пределы массива в блоке for (t=1;t<13;t++) range[t]");
}
//if (GetLastError()==4002) Print("We have array overrun in block for (t=1;t<13;t++) range[t]");
rangeDescription[0]="less "+DoubleToStr(range[0],1);
for (t=1;t<13;t++)
{
rangeDescription[t]="от "+DoubleToStr(range[t-1],1)+" до "+DoubleToStr(range[t],1);
}
rangeDescription[13]="more "+DoubleToStr(range[12],1);
if (GetLastError()==4002) Print("We have array overrun in block for (t=1;t<13;t++) rangeDescription[t]");
ArrayInitialize(freequency,0);
for(m=0;m<BarsPeriod-shift;m++)
{
if (CloseArray[m]<=range[0]) freequency[0]++;
for (z=0;z<12;z++)
{
if ((range[z]<CloseArray[m])&&(CloseArray[m]<=range[z+1])) freequency[z+1]++;
}
if (range[12]<=CloseArray[m]) freequency[13]++;
if (GetLastError()==4002) Print("We have an array overrun in block for(m=0;m);
}
//Print("Тайм-фрейм ",curPeriod,"M shift ",shift," Average=",Average,
//" StOff=",StDev," Max=",MaxOnArray," Min=",MinOnArray);
if (FileWrite(FileHandle,"Тайм-фрейм ",curPeriod,"M shift ",shift," Среднее=",Average,
" StOff=",StDev," Max=",MaxOnArray," Min=",MinOnArray)<0) Print("Writing in file error ",GetLastError());
for(z=0;z<14;z++)
{
//Print("in range ",rangeDescription[z]," it is found ",freequency[z]," of values");
FileWrite(FileHandle,z,rangeDescription[z],freequency[z]);
if (GetLastError()==4002) Print("We have array overrun in block for(z=0;z<14;z++)");
}
sigma=freequency[5]+freequency[6]+freequency[7]+freequency[8]; // number of hits in interval +-1 st.deviation
sigma_2=sigma+freequency[3]+freequency[4]+freequency[9]+freequency[10]; // -/- in interval +-2 st. deviations
sigma_3=sigma_2+freequency[1]+freequency[2]+freequency[11]+freequency[12]; // -/- in interval +-3 st. deviations
sigma=NormalizeDouble(100*sigma/(BarsPeriod-shift),1); // percentage of hits in the interval from -1 to +1 st. deviations
sigma_2=NormalizeDouble(100*sigma_2/(BarsPeriod-shift),1); // percentage of hits in the interval from -2 to +2
sigma_3=NormalizeDouble(100*sigma_3/(BarsPeriod-shift),1); // percentage of hits in the interval from -3 to +3
Stat[i_period][shift-1][5]=sigma;
Stat[i_period][shift-1][6]=sigma_2;
Stat[i_period][shift-1][7]=sigma_3;
FileWrite(FileHandle,sigma,"% within the range of standard deviation ");
FileWrite(FileHandle,sigma_2,"% within the range of two standard deviations ");
FileWrite(FileHandle,sigma_3,"% within the range of three standard deviations ");
FileWrite(FileHandle,"---");
}// run on shifts
}// run on time frames
//----
return(0);
}
int PeriodNumber(int number)
{
int per_min;
switch (number)
{
case 0: per_min=PERIOD_M1;break;
case 1: per_min=PERIOD_M5;break;
case 2: per_min=PERIOD_M15;break;
case 3: per_min=PERIOD_M30;break;
case 4: per_min=PERIOD_H1;break;
case 5: per_min=PERIOD_H4;break;
default: per_min=PERIOD_D1;break;
}
return(per_min);
}
I selected blocks for better understanding of the algorithm.
|
|