oslib/osc-vetor-circular-temporizado-bak-delete-qd-novo-ficar-pronto.mqh
super.admin 07f69c4478 convert
2025-05-30 16:15:18 +02:00

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...
}