//+------------------------------------------------------------------+ //| 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 #include #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; } }