//+------------------------------------------------------------------+ //| 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" #include "osc-svc.mqh" //+------------------------------------------------------------------+ //| Script para testar estatisticas de mudanca de precos | //+------------------------------------------------------------------+ struct Run{ ushort len; ushort repeticoes; uint qtdPositivas; uint qtdNegativas; }; class OscSvcRun : public OscSvc{ public: void onStart(int pTimeFrameInMinutes, int pLenChunkIni, int pLenChunkFim, string pSimbolo, long pSleep); void calcRuns(MqlTick &pVetTicks[], uint pQtdTicks, int pLenChunkIni, int pLenChunkFim, double pTickSize); }; void OscSvcRun::onStart(int pTimeFrameInMinutes, int pLenChunkIni, int pLenChunkFim, string pSimbolo, long pSleep){ datetime from = D'2020.02.10 13:58:00'; datetime to = D'2020.02.10 14:14:00'; //TimeCurrent(); MqlTick ticks[]; //vetor de ticks que serao processados; double tickSize = SymbolInfoDouble(pSimbolo,SYMBOL_TRADE_TICK_SIZE); double ponto = SymbolInfoDouble(pSimbolo,SYMBOL_POINT ); Print("SVCRUN PROCESSANDO ATIVO:",pSimbolo," PONTO:",ponto," TICK_SIZE:",tickSize); int qtdTicks = 0; int lenChunk = pLenChunkIni; // chunk eh o tamanho da run medido em ticks... int chunk = 0; //string strRun =""; // loop de execucao do servico while(true){ //Obtendo o ultimo minuto de ticks... //Print(__FUNCTION__,": Obtendo ticks a processar..."); qtdTicks = CopyTicksRange(pSimbolo,ticks,COPY_TICKS_INFO,TimeCurrent()*1000 - (60000*pTimeFrameInMinutes), TimeCurrent()*1000 ); //qtdTicks = CopyTicksRange(SIMBOLO ,ticks,COPY_TICKS_INFO,from*1000 , to*1000 ); if( qtdTicks > 0 ) calcRuns(ticks,qtdTicks,pLenChunkIni,pLenChunkFim,tickSize); Sleep(pSleep); } } //+--------------------------------------------------------------------------------------------------------------+ //| 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; | //| : houve 10 ocorrencias de repeticoes de 1(uma) run; | //| : houve 10 ocorrencias de repeticoes de 1(uma) run; | //+--------------------------------------------------------------------------------------------------------------+ void OscSvcRun::calcRuns(const MqlTick &pVetTicks[], uint pQtdTicks, int pLenChunk, double pTickSize, double &run1[], double &run2[]){ int run []; //vetor de mudancas de precos //int run1 []; //vetor de quantidade de mudancas de preco positivas //int run2 []; //vetor de quantidade de mudancas de preco negativas int ir = 0 ; //indice do vetor run int lenChunk = pLenChunk; // chunk eh o tamanho da run medido em ticks... int chunk = 0; int vp = 0; int p ; //preco normalizado para unidade de ticks; int pAnt ; //preco anterior normalizado para unidade de ticks; int dp = 0; //quantidade de ticks entre p e pAnt; int qtdRuns1 = 0; int qtdRuns2 = 0; //string strRun =""; int lenVetTicks = ArraySize(pVetTicks); ArrayResize(run1,10,10); ArrayResize(run2,10,10); ArrayInitialize(run1,0); ArrayInitialize(run2,0); p=0; pAnt=0; vp=0; ir=0; chunk=0; ArrayResize(run,10,10); ArrayInitialize(run,0); // varrendo o array de ticks e montando o array de runs (run)... for( uint i=1; ii2){ r.len = lenChunk; r.repeticoes = i1 ; r.qtdPositivas = run1[i1]; r.qtdNegativas = run2[i2]; vetSaidaRun[iVetSaida++] = r; i1++;i2++; }else if(i2