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

137 lines
10 KiB
MQL5

//+------------------------------------------------------------------+
//| osc-vetor-fila_item.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 baseado em filas visando rapido calculo de medias. |
//+---------------------------------------------------------------------+
#property description "Vetor circular baseado em filas visando rapido calculo de medias."
#include <Generic\Queue.mqh>
#include <oslib/osc-padrao.mqh>
struct Item{
datetime time ; // tempo do elemento. Elementos devem ser adicionados em ordem crescente de tempo
double val ; // valor usado no calculo da media
double peso ; // peso usado no calculo da media
double pesoAcum; // peso acumulado na ocasiao
double media ; // media calculada
};
class osc_vetor_fila_item : public osc_padrao {
private:
// ---------usadas em getMaxMin
double m_newMin,m_indNewMin;
double m_newMax,m_indNewMax;
int m_qtdAux;
// ---------usadas em getMaxMin
protected:
CQueue<datetime> m_filaTime ;
CQueue<double> m_filaVal ;
CQueue<double> m_filaPeso ;
CQueue<double> m_filaPesoAcum ;
CQueue<double> m_filaMedia ;
public:
void peek (Item &item);
void dequeue (Item &item);
void add (Item &item);
void clear ();
void trim ();
long count (){ return m_filaVal.Count(); } // todas as filas tem o mesmo tamanho. Poderia usar qualquer uma.
int getMaxMin (double &max, double &min, double &distancia); // grava os valores maximos e minimos respectivamente. Retorna -1 se algo der errado;
int copyPriceTo (double &price[]);
};
void osc_vetor_fila_item::add(Item &item){
m_filaTime .Enqueue(item.time );
m_filaVal .Enqueue(item.val );
m_filaPeso .Enqueue(item.peso );
m_filaPesoAcum.Enqueue(item.pesoAcum);
m_filaMedia .Enqueue(item.media );
}
void osc_vetor_fila_item::peek(Item &item){
item.time = m_filaTime .Peek();
item.val = m_filaVal .Peek();
item.peso = m_filaPeso .Peek();
item.pesoAcum = m_filaPesoAcum.Peek();
item.media = m_filaMedia .Peek();
}
void osc_vetor_fila_item::clear(){
m_filaTime .Clear();
m_filaVal .Clear();
m_filaPeso .Clear();
m_filaPesoAcum.Clear();
m_filaMedia .Clear();
}
void osc_vetor_fila_item::dequeue(Item &item){
item.time = m_filaTime .Dequeue();
item.val = m_filaVal .Dequeue();
item.peso = m_filaPeso .Dequeue();
item.pesoAcum = m_filaPesoAcum.Dequeue();
item.media = m_filaMedia .Dequeue();
}
void osc_vetor_fila_item::trim(){
m_filaTime .TrimExcess();
m_filaVal .TrimExcess();
m_filaPeso .TrimExcess();
m_filaPesoAcum.TrimExcess();
m_filaMedia .TrimExcess();
}
//double m_newMin,m_indNewMin;
//double m_newMax,m_indNewMax;
//int m_qtdAux;
int osc_vetor_fila_item::getMaxMin(double &max, double &min, double &distancia){
//trim();
double vet[] ;
m_qtdAux = m_filaVal.Count();
//int lenVet = m_filaVal.CopyTo(vet);
m_filaVal.CopyTo(vet);
m_newMin = vet[0]; m_indNewMin=0;
m_newMax = vet[0]; m_indNewMax=0;
//string info;
//if(lenVet != qtd){
// //Print(":-( ERROR de INCONSISTENCIA: m_filaVal tem ", qtd, " elementos, mas foram copiados ", lenVet, " elementos! Verifique!!!");
//}else{
// info = ":-| INFO: m_filaVal tem " + qtd + " elementos, e foram copiados " + lenVet+ " elementos!";
//}
// for(int i=0; i<lenVet; i++){
for(int i=0; i<m_qtdAux; i++){
if( MathIsValidNumber(vet[i]) && vet[i] != 0 ){
//if( vet[i] > newMax ) newMax = vet[i];
//if( vet[i] < newMin ) newMin = vet[i];
if( vet[i] > m_newMax ) { m_newMax = vet[i];m_indNewMax=i;} else
if( vet[i] < m_newMin ) { m_newMin = vet[i];m_indNewMin=i;}
}
}
max = m_newMax;
min = m_newMin;
// max aconteceu apos min, distancia serah positiva, senao negativa.
if( (m_indNewMax-m_indNewMin)<0 ){
//distancia = (max-min)*-1;
distancia = ( log(max)-log(min) )*-1;
}else{
//distancia = (max-min) ;
distancia = log(max)-log(min);
}
//info = info + " max=" + max + " newMax=" + newMax + " min=" + min + " newMin=" + newMin;
//Print(info);
return 0;
}
int osc_vetor_fila_item::copyPriceTo(double &price[]){ return m_filaVal.CopyTo(price); }