obter o maior e o menor no intervalo
3 respostas
mikeyc
8 anos atrás #114474
Olá, Mark e equipe,
Encontrei algumas estratégias que parecem interessantes e que dependem das funções HighestInRange e LowestInRange do SQ. Observando o código gerado no MQ4, temos duas funções para isso, que usam a hora e os minutos iniciais e finais para retornar o preço mais alto nesse intervalo de tempo e o preço mais baixo nesse intervalo de tempo.
No entanto, a lógica parece um pouco estranha. Por que 100 barras? Se eu estiver em um período de tempo M1, são menos de 2 horas para encontrar uma barra que cubra um possível período de 24 horas?
Além disso, é muito lento. Por que não usar uma combinação de iBarShift, iHighest e iLowest para encontrar a máxima e a mínima entre dois horários?
double getHighestInRange(int fromHour, int fromMinute, int toHour, int toMinute) { int indexTo = -1; int indexFrom = -1; int i; // encontrar o índice da barra para timeTo for(i=1; i<=100; i++) { if(timeIsBiggerOrEqual(Time[i], toHour, toMinute) && timeIsLower(Time[i+1], toHour, toMinute)) { indexTo = i; break; } } if(indexTo == -1) { Log("ÍndiceTo não encontrado"); return(-1); } // encontrar o índice da barra para timeFrom for(i=1; i<=100; i++) { if(i <= indexTo) continue; se(timeIsBiggerOrEqual(Time[i], fromHour, fromMinute) && timeIsLower(Time[i+1], fromHour, fromMinute)) { indexFrom = i; break; } } if(indexFrom == -1) { Log("ÍndiceFrom não encontrado"); return(0); } double value = -10000.0; for(i=indexTo; i<=indexFrom; i++) { value = MathMax(value, iHigh(NULL, 0, i)); } return(value); }
Tentei colocar essas e outras funções necessárias em um indicador, mas os resultados não faziam sentido.
Um pouco confuso sobre se e como eles estão funcionando.
Obrigado,
Mike
mikeyc
8 anos atrás #134210
Aprofundando um pouco mais, vejo os seguintes problemas:
- No SQ, se a estratégia usar o HighestInRange/LowestInRange, levará 10 vezes mais tempo para processar a estratégia do que se não usar esse bloco de construção.
- A estratégia exportada em MQL (para o MetaTrader) não funciona em períodos de tempo mais baixos (por exemplo, M5) porque ela pesquisa apenas 100 barras no tempo.
- Se você alterar o código para ter um número maior que 100, ele ficará muito lento no MT4; no backtester, ele se arrasta mesmo em uma máquina muito rápida.
Posso entender por que o código faz a busca dessa forma (para atender às lacunas de fim de semana, por exemplo), mas é muito ineficiente.
Estou vendo se consigo escrever uma versão muito mais rápida.
mikeyc
7 anos atrás #138963
Ninguém mais percebeu a lentidão do SQ quando você seleciona HighestInRange e/ou LowestInRange?
Para a SQ4, eu sugeriria que a saída desses blocos de construção fosse calculada uma vez no início da primeira execução, com os resultados mantidos na memória para cada hora e minuto possíveis para cada barra. Calculá-los a cada iteração é muito lento e a RAM é barata e rápida.
tomas262
7 anos atrás #138972
Olá, acho que a Marks reformulou a maneira como o código de bloco é implementado para ter o recurso de "plug-in" disponível na nova versão. Verificarei o desempenho com o SQ4 quando for lançado
Visualizando 3 respostas - 1 até 3 (de um total de 3)