//+------------------------------------------------------------------+ //| CStat.mqh| //| Copyright 2020,oficina de software.| //| http://www.metaquotes.net/marcoc.| //+------------------------------------------------------------------+ #property copyright "2020, Oficina de Software." #property link "http://www.os.net" //--- class CStat{ private: protected: public: bool calcCoefKelly(const double _payOut , const double _probWin, double &_coefKelly); bool calcCoefKelly(const double _qtdLoss , const double _qtdWin , const double _lossAcum, const double _winAcum, double &_coefKelly); bool calcPayOut (const double _lossAcum, const double _winAcum, double &_payOut ); bool calcProbWin (const double _qtdLoss , const double _qtdWin , double &_pWin ); double calcEntropiaCruzada(double &_distFact[] , double &_distPrevisao[]); // // recebe: // v in vetor de valores (price) // vol in vetor de pesos (volume) // dy out vetor com os valores do eixo y (nivel de soma dos pesos) volumes de cada preco // dx out vetor com os valores do eixo x (nivel dos valores) precos // bool calcDist(const double &v[], const double &vol[], double &dy[], double &dx[], int tick=5){ int lenV = ArraySize(v); // tamanho do vetor de valores //int lenD = ArraySize(d); // tamanho do vetor de ocorrencias // Print(":-| ",__FUNCTION__,": Encontrando o menor elemento..."); int min = (int)v[ArrayMinimum(v)]; // Print(":-| ",__FUNCTION__,": Encontrando o maior elemento..."); int max = (int)v[ArrayMaximum(v)]; // Print(":-| ",__FUNCTION__,": Redefinindo o tamanho do array da distribuicao..."); ArrayResize(dy,max-min+tick+1); ArrayResize(dx,max-min+tick+1); // Print(":-| ",__FUNCTION__,": Inicializando o array da distribuicao..."); ArrayInitialize(dy,0); ArrayInitialize(dx,0); // Print(":-| ",__FUNCTION__,": Calculando e alocando no array da distribuicao (eixo y)..."); for( int i=0; ilenX ){msg=":-( tamanho do eixo X:"+IntegerToString(lenX)+ " nao corresponde ao tamanho do eixo Y:"+IntegerToString(len); return false;} //MQO - minimos quadrados ordinarios //SQT - soma dos quadrados totais //SQE - soma dos quadrados estimados //SQR - soma dos quadrados dos residuos //SQT = SQE + SQR double sxy = 0; // somatorio de x vezes y double sx = 0; // somatorio de x double sy = 0; // somatorio de y double sx2 = 0; // somatorio do quadrado de x double xbarra = 0; double ybarra = 0; for(int i=0; i0 ){ _pWin = _qtdWin / (_qtdWin+_qtdLoss); }else{ _pWin = 0; } return true; } //+------------------------------------------------------------------+ //| | //| Calcula o coeficiente de Kelly. | //| | //| Definicao: Percentual maximo de capital a ser alocado a cada | //| trade. | //| | //| Forrmula: | //| K = ( P.B - (1-P) ) / B | //| | //| sendo: | //| K = Coefiente de Kelly. | //| P = Probabilidade de acerto. | //| B = Payout. | //| | //+------------------------------------------------------------------+ bool CStat::calcCoefKelly(const double _payOut, const double _probWin, double &_coefKelly){ if( _payOut != 0 ){ _coefKelly = ( (_probWin*_payOut) - (1-_probWin) ) / _payOut; }else{ _coefKelly = 0; } return true; } bool CStat::calcCoefKelly(const double _qtdLoss , const double _qtdWin , const double _lossAcum, const double _winAcum, double &_coefKelly){ double payOut; calcPayOut(_lossAcum,_winAcum,payOut); double probWin; calcProbWin(_qtdLoss,_qtdWin,probWin); return calcCoefKelly(payOut,probWin,_coefKelly); } double CStat::calcEntropiaCruzada(double &_distFact[] , double &_distPrevisao[]){ int len = ArraySize(_distFact); double H = 0; for( int i=0; i