//+------------------------------------------------------------------+ //| oss-run.mq5 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, OS Corp." #property link "http://www.os.org" #property version "1.00" //+------------------------------------------------------------------+ //| Classe para contabilizar estatisticas de mudanca de precos. | //+------------------------------------------------------------------+ struct Run{ ushort len; ushort repeticoes; uint qtdPositivas; uint qtdNegativas; }; class OscRun{ public: void calcRuns(const MqlTick &pVetTicks[], const int pQtdTicks, const int pLenChunk, const double pTickSize, int &run1[], int &run2[]); void calcRuns(const double &pVetPrice[], const int pQtdTicks, const int pLenChunk, const double pTickSize, int &run1[], int &run2[]); string toString(const int &run1[], const int &run2[], int lenChunk); double calcIndice(const int &run1[], const int &run2[]); }; //+--------------------------------------------------------------------------------------------------------------+ //| pVetTicks : vetor de ticks que serao processados | //| pQtdTicks : quantidade de ticks a processar | //| pLenChunk : tamanho inicial do chunk em ticks | //| pTickSize : tamanho do tick | //| run1 : vetor de runs positivas. retorno por referencia. | //| run2 : vetor de runs negativas. retorno por referencia. | //| OBS : Em run1 e run2, a posicao do vetor eh quantas vezes a run se repetiu seguidamente e o valor na | //| : posicao eh quantas vezes a repeticao se concretizou. | //| Ex : run1{0,10,8,0,0,2} significa que | //| : houve 10 ocorrencias de repeticoes de 1(uma ) run; | //| : houve 08 ocorrencias de repeticoes de 2(duas ) runs seguidas | //| : houve 02 ocorrencias de repeticoes de 5(cinco) runs seguidas; | //+--------------------------------------------------------------------------------------------------------------+ void OscRun::calcRuns(const MqlTick &pVetTicks[], const int pQtdTicks, const int pLenChunk, const double pTickSize, int &run1[], int &run2[]){ double price[]; int size = ArraySize(pVetTicks); //ArrayResize(price,pQtdTicks); ArrayResize(price,size); for(int i=0; i 0){ strRun+=("] " + IntegerToString(qtdRuns2)+ " " + DoubleToString(((double)(qtdRuns1-qtdRuns2)/(double)(qtdRuns1+qtdRuns2))*100.0, 0) +"%\n"); }else{ strRun+=("] " + IntegerToString(qtdRuns2)+ "0%\n"); } return strRun; } double OscRun::calcIndice(const int &run1[], const int &run2[]){ int qtdRuns1=0; int qtdRuns2=0; // Calculando o indice do vetor de runs positivas... for(int i=0; i