oslib/osc/osc-media.mqh
super.admin 07f69c4478 convert
2025-05-30 16:15:18 +02:00

69 lines
No EOL
3.2 KiB
MQL5

//+------------------------------------------------------------------+
//| 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<m_len_calc; i++) m_var+=MathPow(m_vet[i]-m_mean,2);
return m_var=m_var/(m_len_calc-1);
}
double getVar(){ return m_var ; } // retorna a ultima variancia calculada
double getMed(){ return m_mean; } // retorna a ultima media calculada
};