//+------------------------------------------------------------------+ //| osc-media.mqh | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2020, Oficina de Software." #property link "http://www.os.net" // calculo de media simples baseada em quantidade fixa de elementos. A medida que o vetor de valores enche, despreza o valor mais antigo, // adiciona o mais novo e reclacula a media. class osc_media{ private: int m_ind ; double m_tot ; int m_len ; int m_len_calc; double m_mean ; // media: recalcula sempre que executa o metodo add... double m_var ; // variancia: recalcula a pedido com a chamada ao medtodo calVar. double m_vet[] ; public: //---------------------------------------------------------------------------------------------------- // inicializa todas as variaveis usadas no calculo da media. Dimensiona o vetor para len( recebido por parametro). // Ateh que se adicione o len-ezimo valor ao calculo da media, ela serah influenciada por zeros que sao preenchidos no // vetor de valores da media. //---------------------------------------------------------------------------------------------------- bool initialize(int len){ if( len < 2 ) return false; m_len = len; m_len_calc = 0; m_ind = 0 ; m_tot = 0 ; m_mean = 0 ; m_var = 0 ; ArrayResize(m_vet,len); ArrayFill(m_vet,0,len,0); return true; } //---------------------------------------------------------------------------------------------------- // Adiciona um item a media, retira o mais antigo (se for maior que o tamanho do vetor de medias) e retorna o valor da media. //---------------------------------------------------------------------------------------------------- double add(const double val){ if( m_len_calc < m_len ) m_len_calc++; m_tot += val ; // adicionando o valor atual a media/; m_tot -= m_vet[m_ind]; // retirando o que estava na posicao atual do vetor m_vet[m_ind] = val ; // e colocando o ultimo valor calculado if( ++m_ind == m_len_calc ){ m_ind=0; } // atualizando o indice return m_mean = ( m_tot/(double)m_len_calc ); } //---------------------------------------------------------------------------------------------------- // Calcula e retorna a variancia sobre o conjunto atual. //---------------------------------------------------------------------------------------------------- double calcVar(){ m_var=0.0; if( m_len_calc < 2 ) return m_var; for(int i=0; i