MathSrand

建立伪随机整数产生序列出发点。

void  MathSrand(

   int  seed      // 初始化数字

   );

参量

seed

[in]  随机数开始数字的排列。

返回值

没有返回值。

注意

MathRand() 函数用于生成一系列的伪随机数。通过正在初始化的数字调用MathSrand() 允许始终生产同系列的伪随机数。

要确定收到非循环数列,使用调用MathSrand(GetTickCount()),由于GetTickCount() 值从操作系统开始时增加并且在49天内不重复,一直到超出内置毫秒计数器。使用MathSrand(TimeCurrent()) 不合适,因为TimeCurrent() 函数返回长时间未更改的最近订单号的时间,例如周末。

使用MathSrand()函数为指标和EA而初始化的随机数生成程序在 OnInit()处理程序被更好的执行,它可以有助于您防止以下在OnTick() 和 OnCalculate()多次重启生成程序。

您可以使用srand()函数来替代MathSrand()函数。

例如:

#property description "The indicator shows the central limit theorem, which states:"

#property description "The sum of a sufficiently large number of weakly dependent random variables, "

#property description "having approximately equal magnitude (none of the summands dominates,"

#property description "or makes a determining contribution to the sum), has a distribution close to normal."

 

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_plots   1

//--- 图形结构属性

#property indicator_label1  "Label"

#property indicator_type1   DRAW_HISTOGRAM

#property indicator_color1  clrRoyalBlue

#property indicator_style1  STYLE_SOLID

#property indicator_width1  5

//--- 输入变量

input int      sample_number=10;

//--- 用于绘制分布图的指标缓冲区

double         LabelBuffer[];

//--- 订单号计数器

double         ticks_counter;

//+------------------------------------------------------------------+

//| 自定义指标初始化函数                                                |

//+------------------------------------------------------------------+

void OnInit()

  {

//--- 绑定数组和指标缓冲区

   SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);

//--- 从现在到过去转移指标缓冲区

   ArraySetAsSeries(LabelBuffer,true);

//--- 初始化随机数生成程序

   MathSrand(GetTickCount());

//--- 初始化订单号计数器

   ticks_counter=0;

  }

//+------------------------------------------------------------------+

//| 自定义指标迭代函数                                                 |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

//--- 为零值计数器重置指标缓冲区

   if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);

//--- 增加计数器

   ticks_counter++;

//--- 我们应该周期性的重置计数器,恢复分配

   if(ticks_counter>100)

     {

      Print("We've reset the indicator values, let's start filling the cells once again");

      ticks_counter=0;

     }

//--- 得到从0到7三个数字总和的随机值样本

   for(int i=0;i<sample_number;i++)

     {

      //--- 计算单元标引,随机数下跌三个数字的总和

      int rand_index=0;

      //--- 得到从0到7的三个随机数字

      for(int k=0;k<3;k++)

        {

         //--- 除以7的余数将返回从0到6的值

         rand_index+=MathRand()%7;

        }

      //--- 增加rand_index单元数的值为1

      LabelBuffer[rand_index]++;

     }

//--- 退出OnCalculate() 处理程序

   return(rates_total);

  }