#property description "L'indicatore mostra il teorema del limite centrale, che dice:"
#property description "La somma di un numero sufficientemente grande di variabili casuali debolmente dipententi, "
#property description "avente approssimativamente uguale magnitudo (nessuno degli addendi dominanti,"
#property description "o rende un contributo determinante alla somma), ha una distribuzione vicina alla normalità."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- Proprietà della costruzione grafica
#property indicator_label1 "Label"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRoyalBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 5
//--- Una variabile di input
input int sample_number=10;
//--- Un buffer indicatore per disegnare la distribuzione
double LabelBuffer[];
//--- Un contatore di ticks
double ticks_counter;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- Associa un array e un buffer indicatore
SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- porta il buffer indicatore vicino dal presente al passato
ArraySetAsSeries(LabelBuffer,true);
//--- Inizializza il generatore di numeri casuali
MathSrand(GetTickCount());
//--- Inizializza il contatore di ticks
ticks_counter=0;
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
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[])
{
//--- Per un contatore zero, resetta il buffer indicatore
if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
//--- Incrementa il contatore
ticks_counter++;
//--- Dobbiamo resettare periodicamente i ticks contatore, per ravvivare la distribuzione
if(ticks_counter>100)
{
Print("Abbiamo resettato i valori dell'indicatore, iniziamo a riempire le celle ancora una volta");
ticks_counter=0;
}
//--- Ottiene un campione di valori casuali come somma di tre numeri da 0 a 7
for(int i=0;i<sample_number;i++)
{
//--- Calcola l'indice delle celle, dove il numero casuale cade tra la somma di tre altri numeri
int rand_index=0;
//--- Ottiene tre numeri casuali da 0 a 7
for(int k=0;k<3;k++)
{
//--- Il resto della divisione per 7 restituità un valore da 0 a 6
rand_index+=MathRand()%7;
}
//--- Incrementa il valore nel numero della cella rand_index by 1
LabelBuffer[rand_index]++;
}
//--- Esce dall'handoler OnCalculate()
return(rates_total);
}
|