oslib/osc/est/C0002ArbitragemPar.mqh

106 lines
10 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:15:18 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| C0002ArbitragemPar.mqh|
//| Copyright 2020,oficina de software.|
//| http://www.metaquotes.net/marcoc.|
//| |
//| VARIAVEIS DE ENTRADA: |
//| |
//| |
//| VARIAVEL DE SAIDA: |
//| |
//| |
//| --------------------------------------------|
//| REGRAS |
//| |
//| |
//+--------------------------------------------------------------------------------------------------------------+
#property copyright "2020, Oficina de Software."
#property link "http://www.os.net"
#include <oslib\osc\est\osc-estatistic3.mqh>
#include <oslib\osc\osc-media.mqh>
#define MULTIPLICADOR 1000.0
class C0002ArbitragemPar{
private:
osc_estatistic3* m_est1; // estatisticas de ticks e book de ofertas do primeiro ativo
osc_estatistic3* m_est2; // estatisticas de ticks e book de ofertas do segundo ativo
osc_media m_media; // media dos ratios
double m_ratio; // ratio instantaneo.
double m_ratio_dp; // ratio instantaneo medido em unidades de desvio padrao
double m_ratio_medio; // ratio medio.
double m_ratio_medio_dp; // desvio padrao do ratio medio.
double m_qtdSegMediaTicks; // quantidade de segundos acumulando estatisticas de ticks;
double m_qtdSegMediaRatio; // quantidade de segundos para calcular a media de ratios.
datetime m_dt, m_dtAnt;
void setQtdSegMediaTicks(const int qtd=60){
delete(m_est1);
delete(m_est2);
m_est1 = new osc_estatistic3();
m_est2 = new osc_estatistic3();
m_est1.initialize(qtd,true);
m_est2.initialize(qtd,true);
m_qtdSegMediaTicks = qtd;
}
void setQtdSegMediaRatio(const int qtd=60*21){m_media.initialize(qtd);
m_qtdSegMediaRatio = qtd;}
void calcRatio(); // calcula o ratio e armazena no vetor de medias de ratio;
protected:
public:
~C0002ArbitragemPar(){delete(m_est1); delete(m_est2);}
// metodos de inicializacao...
void initialize(int qtdSegMediaTicks, int qtdSegMediaRatio){setQtdSegMediaTicks(qtdSegMediaTicks);
setQtdSegMediaRatio(qtdSegMediaRatio);
m_dt=TimeCurrent();
m_dtAnt=m_dt;
m_ratio_medio_dp = 0;
}
osc_estatistic3* getEstAtivo1(){ return m_est1; }
// metodos de refresh...
void addTick1(MqlTick& tick){ m_est1.addTick(tick); calcRatio();}
void addTick2(MqlTick& tick){ m_est2.addTick(tick); calcRatio();}
void addTick (MqlTick& tick1, MqlTick& tick2){ m_est1.addTick(tick1); m_est2.addTick(tick2); calcRatio(); }
// metodos de calculo e obtencao de indicares e resultados...
double getRatio (){ return m_ratio ; } // ratio instantaneo
double getRatioDP (){ return m_ratio_dp ; } // ratio instantaneo calculado em unidades de desvio padrao
double getRatioMedio (){ return m_ratio_medio ; } // ratio medio
double getRatioMedioDP(){ return m_ratio_medio_dp ; } // desvio da distribuicao de ratios
};
// calcula o ratio e sua respectiva media e armazena no vetor de medias de ratio;
void C0002ArbitragemPar::calcRatio(){
if( m_est2.getPrecoMedTrade() == 0 ){
//Print(__FUNCSIG__," WARN Repetido ratio anterior pois preco medio do segundo ativo estah zerado.");
return;
}
if(m_est2.getPrecoMedTrade() != 0) m_ratio = (m_est1.getPrecoMedTrade()/(m_est2.getPrecoMedTrade()*MULTIPLICADOR))-1.0;
if(m_ratio_medio_dp != 0) m_ratio_dp = (m_ratio - m_ratio_medio) / m_ratio_medio_dp; // ratio instantaneo calculado em unidades de desvio padrao
// a cada segundo adiciona o ratio instantaneo ao vetor de media de ratios e relacula o ratio medio.
m_dt = TimeCurrent();
if( m_dt != m_dtAnt ){
m_ratio_medio = m_media.add(m_ratio); // recalculando o ratio medio
m_ratio_medio_dp = MathSqrt( m_media.calcVar() ) ; // recalculando o desvio padrao do ratio medio
m_dtAnt = m_dt;
}
}