oslib/osc-vetor-circular-com-peso-bkp-delete-apos-funcionar-o-novo.mqh
super.admin 07f69c4478 convert
2025-05-30 16:15:18 +02:00

81 lines
4.9 KiB
MQL5

//+------------------------------------------------------------------+
//| osc-vetor-circular.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"
//+---------------------------------------------------------------------+
//| Vetor circular de tamaho fixo visando rapido calculo de medias. |
//+---------------------------------------------------------------------+
#property description "Vetor circular de tamaho fixo visando rapido calculo de medias, com suporte a pesos."
//#include <../Shared Projects/oslib/osc-padrao.mqh>
#include <../Shared Projects/oslib/osc-vetor-circular.mqh>
//#define OSC_VETOR_CIRCULAR_LEN_PADRAO 21
class osc_vetor_circular_com_peso : public osc_vetor_circular {
private:
double m_vet [] ; //vetor com item para o qual serao calculadas as medias;
double m_vetPeso [] ; //vetor com peso do item para o qual serao calculadas as medias;
double m_vetPesoXitem[] ; //vetor com [peso x item] do item para o qual serao calculadas as medias;
int m_len ; //tamanho dos vetores;
int m_ind ; //indice atual dos vetores;
double m_media ; //ultima media calculada;
double m_soma ; //ultima soma total calculada do vetor de itens;
double m_somaPeso ; //ultima soma total calculada do vetor de pesos;
double m_somaPesoXitem ; //ultima soma total calculada do vetor de pesos x itens;
public:
osc_vetor_circular_com_peso(){ initialize(OSC_VETOR_CIRCULAR_LEN_PADRAO); }
int initialize(int len ); //cria o vetor circular com o tamanho informado;
void add (double val, double peso); //substitui a posicao mais antiga do vetor pelo valor recebido (usando peso);
void add (double val ){add(val,1);}//substitui a posicao mais antiga do vetor pelo valor recebido;
double getMedia(){return m_media;} //Media dos elementos do vetor;
double getSoma (){return m_soma ;} //Soma dos elementos do vetor;
//------------------------------------------------------
};
//+---------------------------------------------------------------------------------------+
//| inicializa vetor circular com vetor de tamanho len contendo 0.0 em todos os elementos.|
//+---------------------------------------------------------------------------------------+
int osc_vetor_circular_com_peso::initialize(int len){
if(len < 1) return 0; // previnindo array com tamanho invalido;
m_ind = 0; m_media = 0; m_soma = 0; m_somaPeso = 0; m_somaPesoXitem = 0;
ArrayResize(m_vetPeso ,len);
ArrayResize(m_vetPesoXitem,len);
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.0);
ArrayFill(m_vetPeso ,0,m_len,1.0);
ArrayFill(m_vetPesoXitem ,0,m_len,0.0);
return m_len;
}
//+-------------------------------------------------------------------+
//| 1. substitui a posicao mais antiga do vetor pelo valor recebido. |
//| 2. m_ind fica apontado para o proximo valor que serah adionado ao |
//| vetor circular. |
//| 3. Recalcula soma e media de valores do vetor. |
//+-------------------------------------------------------------------+
void osc_vetor_circular_com_peso::add(double val, double peso){
m_soma -= m_vet [m_ind]; // retirando o elemento que estah sendo subtituido, da soma de itens...
m_somaPeso -= m_vetPeso [m_ind]; // retirando o elemento que estah sendo subtituido, da soma de pesos...
m_somaPesoXitem -= m_vetPesoXitem[m_ind]; // retirando o elemento que estah sendo subtituido, da soma de peses x itens...
m_soma += val ; // adicionando novo valor a soma de elementos do vetor de itens...
m_somaPeso += peso ; // adicionando novo valor a soma de elementos do vetor de pesos...
m_somaPesoXitem += peso*val; // adicionando novo valor a soma de elementos do vetor de pesos x itens ...
m_vet [m_ind ] = val; // atribuindo o novo valor ao vetor de itens...
m_vetPeso [m_ind ] = peso; // atribuindo o novo valor ao vetor de pesos...
m_vetPesoXitem[m_ind++] = peso*val; // atribuindo o novo valor ao vetor de itens x pesos...
m_media = m_somaPesoXitem/m_somaPeso; // recalculando a media...
if(m_ind==m_len){m_ind=0;} // chegou o final do vetor, entao voltamos pro inicio...
}