Resposta

obter o maior e o menor no intervalo

3 respostas

mikeyc

Cliente, bbp_participant, comunidade, 877 respostas.

Perfil da visita

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

0

mikeyc

Cliente, bbp_participant, comunidade, 877 respostas.

Perfil da visita

8 anos atrás #134210

Aprofundando um pouco mais, vejo os seguintes problemas:

 

  1. 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.
  2. 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.
  3. 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.

0

mikeyc

Cliente, bbp_participant, comunidade, 877 respostas.

Perfil da visita

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.

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

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

0

Visualizando 3 respostas - 1 até 3 (de um total de 3)