#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); } |