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

95 lines
No EOL
7.9 KiB
MQL5

//+------------------------------------------------------------------+
//| osc-cusum.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"
//+---------------------------------------------------------------------+
//| Implementacoes CUSUM - Cumulative Sum. |
//+---------------------------------------------------------------------+
#property description "Vetor circular baseado em filas visando rapido calculo de medias."
#include <Object.mqh>
#include <Generic\Queue.mqh>
#include <oslib/osc-padrao.mqh>
class osc_cusum : public CObject{
private:
double m_c_mais , m_c_mais_ant ;
double m_c_menos, m_c_menos_ant;
int m_acumular_a_cada;
int m_tot_acum;
protected:
public:
osc_cusum(void): m_c_mais (0),
m_c_mais_ant (0),
m_c_menos (0),
m_c_menos_ant (0),
m_acumular_a_cada(0),
m_tot_acum (0){}
//--
// const double xi eh a ocorrencia sendo monitorada (preco)
// const double T eh o alvo. Normalmente a media
// const double K eh o desvio minimo para que se acumule em uma das direcoes
// const double H eh o limiar (alarme)
// bool& strikeHmais true - C+ estah acima de H
// bool& strikeHmenos true - C- estah acima de H
// bool& strikeMais true - C+ cresceu
// bool& strikeMenos true - C- cresceu
void calcC(const double xi, const double T, const double K, const double H, bool& strikeHmais, bool& strikeHmenos, bool& strikeMais, bool& strikeMenos);
double getCmais (){return m_c_mais ;}
double getCmenos(){return m_c_menos;}
void setAcumularAcadaXTicks(int ticks){ m_acumular_a_cada = ticks; }
};
//--
// xi eh a ocorrencia sendo monitorada (preco)
// T eh o alvo. Normalmente a media
// K eh o desvio minimo para que se acumule em uma das direcoes
// H eh o limiar (alarme)
// bool& strikeHmais true - C+ estah acima de H
// bool& strikeHmenos true - C- estah acima de H
// bool& strikeMais true - C+ cresceu
// bool& strikeMenos true - C- cresceu
void osc_cusum::calcC(const double xi, const double T, const double K, const double H, bool& strikeHmais, bool& strikeHmenos, bool& strikeMais, bool& strikeMenos){
if( m_tot_acum++ < m_acumular_a_cada ) return;
m_tot_acum = 0;
if( xi == 0 ) return; //<TODO> VER PORQUE ESTAH CHEGANDO COM ZERO
strikeHmais = false;
strikeHmenos = false;
strikeMais = false;
strikeMenos = false;
m_c_mais = MathMax(0, xi - (T+K) + m_c_mais_ant );
if( m_c_mais > m_c_mais_ant) strikeMais = true;
if( m_c_mais > H ) strikeHmais = true;
m_c_menos = MathMax(0, (T-K) - xi + m_c_menos_ant );
if( m_c_menos > m_c_menos_ant ) strikeMenos = true;
if( m_c_menos > H ) strikeHmenos = true;
/*
Print( "[xi:" ,DoubleToString(xi ,_Digits)
,"][T:" ,DoubleToString(T ,_Digits)
,"][K:" ,DoubleToString(K ,_Digits)
,"][H:" ,DoubleToString(H ,_Digits)
,"][C+:" ,DoubleToString(m_c_mais ,_Digits)
,"][C-:" ,DoubleToString(m_c_menos ,_Digits)
//,"][C+A:" ,DoubleToString(m_c_mais_ant ,_Digits)
//,"][C-A:" ,DoubleToString(m_c_menos_ant,_Digits)
,"][stC+:" ,strikeMais
,"][stC-:" ,strikeHmenos
,"][stH+:" ,strikeHmais
,"][stH-:" ,strikeHmenos
);
*/
m_c_mais_ant = m_c_mais;
m_c_menos_ant = m_c_menos;
}