105 lines
10 KiB
MQL5
105 lines
10 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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;
|
|
}
|
|
}
|
|
|