#property description "O indicador mostra o teorema do limite central, que:" #property description "A soma de um número suficientemente grande de variáveis aleatórias fracamente dependentes, " #property description "A soma de um número suficientemente grande de variáveis aleatórias fracamente dependentes," #property description "ou faz uma contribuição determinante para a soma), tem uma distribuição próxima do normal." #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 //--- Propriedades da construção gráfica #property indicator_label1 "Label" #property indicator_type1 DRAW_HISTOGRAM #property indicator_color1 clrRoyalBlue #property indicator_style1 STYLE_SOLID #property indicator_width1 5 //--- Uma variável de entrada input int sample_number=10; //--- Um buffer do indicador para desenhar a distribuição double LabelBuffer[]; //--- Um contador de ticks double ticks_counter; //+------------------------------------------------------------------+ //| Função de inicialização do indicador customizado | //+------------------------------------------------------------------+ void OnInit() { //--- Ligando um array e um buffer de indicador SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA); //--- transformar o buffer do indicador em torno do presente para o passado ArraySetAsSeries(LabelBuffer,true); //--- Inicializar o gerador de números aleatórios MathSrand(GetTickCount()); //--- Inicializar o contador de ticks ticks_counter=0; } //+------------------------------------------------------------------+ //| Função de iteração do indicador customizado | //+------------------------------------------------------------------+ 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[]) { //--- Para um contador zero, reinicie o buffer do indicador if(ticks_counter==0) ArrayInitialize(LabelBuffer,0); //--- Aumentar o contador ticks_counter++; //--- Devemos periodicamente redefinir os contadores, para reviver a distribuição if(ticks_counter>100) { Print("Reajustamos os valores dos indicadores, vamos começar a preencher as células mais uma vez"); ticks_counter=0; } //--- Obter uma amostra de valores aleatórios como a soma de três números de 0 a 7 for(int i=0;i<sample_number;i++) { //--- Cálculo do índice da célula, onde o número aleatório cai como a soma de outros três números int rand_index=0; //--- Obter três números aleatórios de 0 a 7 for(int k=0;k<3;k++) { //--- Um restante na divisão por 7 retornará um valor de 0 a 6 rand_index+=MathRand()%7; } //--- Aumentar o valor no número da célula rand_index por 1 LabelBuffer[rand_index]++; } //--- Sair do manipulador OnCalculate() return(rates_total); } |