72 lines
No EOL
4.5 KiB
MQL5
72 lines
No EOL
4.5 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| osc-vetor-circular-temporizado.mqh |
|
|
//| marcoc |
|
|
//| https://www.mql5.com/pt/users/marcoc |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "marcoc"
|
|
#property link "https://www.mql5.com/pt/users/marcoc"
|
|
#property version "1.00"
|
|
//+------------------------------------------------------------------------------+
|
|
//| Extensao da classe osc_vetor_circular visando rapido calculo de medias. |
|
|
//| Acrescenta informacao de tempo decorrido entre as entradas iniciais e finais.|
|
|
//+------------------------------------------------------------------------------+
|
|
#property description "Extensao da classe osc_vetor_circular visando rapido calculo de medias."
|
|
#property description "Acrescenta informacao de tempo decorrido entre as entradas iniciais e finais."
|
|
|
|
#include <../Shared Projects/oslib/osc-vetor-circular-com-peso.mqh>
|
|
//#include <../Shared Projects/oslib/osc-vetor-circular.mqh>
|
|
|
|
class osc_vetor_circular_temporizado : public osc_vetor_circular_com_peso {
|
|
private:
|
|
long m_vet[];
|
|
long m_time_decorrido; //uso pra calcular o tempo decorrido, em segundos desde a entrada mais antiga ateh a entrada atual.
|
|
int m_len;
|
|
int m_ind;
|
|
osc_vetor_circular m_vetTimeDecorrido;
|
|
protected:
|
|
|
|
public:
|
|
osc_vetor_circular_temporizado(){ initialize(OSC_VETOR_CIRCULAR_LEN_PADRAO); }
|
|
|
|
int initialize(int len);//cria o vetor circular com o tamanho informado; retorna o tamanho do vetor criado.
|
|
void add( double val, datetime time);//substitui a posicao mais antiga do vetor pelo valor recebido;
|
|
//alem disso preenche o vetor circular de tempo em que ocorrem
|
|
//os eventos possibilitando informar o tempo decorrido entre a
|
|
//entrada do elemento mais antigo e mais novo do vetor.
|
|
|
|
long getTempoDecorrido (){return m_time_decorrido ;} // tempo, em segundos, desde a entrada mais antiga ateh a atual;
|
|
long getTempoDecorridoMedio(){return (long)m_vetTimeDecorrido.getMedia();} // tempo medio, em segundos, desde a entrada mais antiga ateh a atual;
|
|
//------------------------------------------------------
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------------------+
|
|
//| inicializa vetor circular com vetor de tamanho len contendo 0.0 em todos os elementos.|
|
|
//+---------------------------------------------------------------------------------------+
|
|
int osc_vetor_circular_temporizado::initialize(int len){
|
|
|
|
if( osc_vetor_circular::initialize(len) == 0 ){ return 0; } // inicializando a superclasse...
|
|
if(len < 1 ){ return 0; } // previnindo array com tamanho invalido...
|
|
|
|
m_ind = 0;
|
|
m_time_decorrido = 0;
|
|
m_len = ArrayResize(m_vet,len); // prevenindo para o caso do algoritimo Arrayresize
|
|
// aumente mais que tamanho solicitado. Entao colocamos
|
|
// o novo tamanho do vetor na variavem m_len.
|
|
ArrayFill(m_vet,0,m_len ,0);
|
|
return m_vetTimeDecorrido.initialize(len); // inicializando a vetor circular que calcularah o tempo decorrido medio;
|
|
}
|
|
|
|
//+-----------------------------------------------------------------------+
|
|
//| 0. adiciona o valor normal e depois o tempo. |
|
|
//| 1. substitui a posicao mais antiga do vetor pelo valor recebido. |
|
|
//| 2. m_indtime fica apontado para o proximo valor que serah adionado ao |
|
|
//| vetor circular. |
|
|
//| 3. Recalcula o tempo decorrido entre a entrada mais antiga e a atual. |
|
|
//+-----------------------------------------------------------------------+
|
|
void osc_vetor_circular_temporizado::add(double val, datetime time){
|
|
add(val);
|
|
m_time_decorrido = time - m_vet[m_ind] ; // tempo decorrido, em segundos, entre a entrada mais antiga e a atual;
|
|
m_vetTimeDecorrido.add(m_time_decorrido); // vetor circular onde cada entrada eh o tempo, em segundos, entre a entrada mais antiga e a atual;
|
|
m_vet[m_ind++] = time; // atribuindo o novo valor ao vetor...
|
|
if(m_ind==m_len){m_ind=0;} // chegou o final do vetor, entao voltamos pro inicio...
|
|
} |