#property description "Индикатор демонстрирует центральную предельную теорему, которая гласит:"
#property description "Сумма достаточно большого количества слабо зависимых случайных величин, "
#property description "имеющих примерно одинаковые масштабы (ни одно из слагаемых не доминирует,"
#property description "не вносит в сумму определяющего вклада), имеет распределение, близкое к нормальному."
#property indicator_separate_window
#property indicator_buffers 1
//--- свойства графического построения
#property indicator_label1 "Label"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRoyalBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 5
//--- input переменная
input int sample_number=10;
//--- индикаторный буфер для отрисовки распределения
double LabelBuffer[];
//--- счетчик тиков
double ticks_counter;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- связывание массива и индикаторного буфера
SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- развернем индикаторный буфер из настоящего в прошлое
ArraySetAsSeries(LabelBuffer,true);
//--- инициализируем генератор случайных чисел
MathSrand(GetTickCount());
//--- инициализируем счетчик тиков
ticks_counter=0;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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("Обнулили значения индикатора, начнем заполнять ячейки снова");
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
LabelBuffer[rand_index]++;
}
//--- выход из обработчика OnCalculate()
return(rates_total);
} |