69 lines
No EOL
3.2 KiB
MQL5
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
|
|
}; |