Respuesta

obtener el máximo y el mínimo del rango

3 respuestas

mikeyc

Cliente, bbp_participant, comunidad, 877 respuestas.

Visitar el perfil

hace 8 años #114474

Hola Mark y equipo,

 

He encontrado algunas estrategias que parecen interesantes que dependen de las funciones HighestInRange y LowestInRange en SQ. Mirando el código MQ4 generado tenemos dos funciones para esto que toman la hora de inicio y final y minutos para devolver el precio más alto en este rango de tiempo y el precio más bajo en este rango de tiempo.

 

Sin embargo, parece una lógica bastante extraña. ¿Por qué 100 barras? Si estoy en M1 marco de tiempo que es menos de 2 horas para encontrar una barra que cubre un posible período de 24 horas?

 

Además, es muy lento. ¿Por qué no usar una combinación de iBarShift, iHighest y iLowest para encontrar el máximo y el mínimo entre dos tiempos?

double getHighestInRange(int desdeHora, int desdeMinuto, int hastaHora, int hastaMinuto) {
   int índiceHasta = -1;
   int índiceDesde = -1;
   int i;

   // encuentra el índice de la barra para timeTo
   for(i=1; i<=100; i++) {
      if(timeIsBiggerOrEqual(Time[i], toHour, toMinute) && timeIsLower(Time[i+1], toHour, toMinute)) {
         indexTo = i;
         interrupción;
      }
   }

   if(indexTo == -1) {
      Log("No se ha encontrado indexTo");
      return(-1);
   }

   // encuentra el índice de la barra para timeFrom
   for(i=1; i<=100; i++) {
      if(i <= indexTo) continue;

      if(timeIsBiggerOrEqual(Time[i], fromHour, fromMinute) && timeIsLower(Time[i+1], fromHour, fromMinute)) {
         índiceDesde = i;
         interrupción;
      }
   }

   if(indexFrom == -1) {
      Log("No se ha encontrado indexFrom");
      return(0);
   }

   double valor = -10000.0;

   for(i=índiceA; i<=índiceDesde; i++) {
      valor = MathMax(valor, iAlto(NULL, 0, i));
   }

   return(valor);
}

Intenté poner éstas y las demás funciones necesarias en un indicador, pero los resultados no tenían ningún sentido.

 

Un poco confundido en cuanto a si y cómo están funcionando.

 

Gracias,

 

Mike

0

mikeyc

Cliente, bbp_participant, comunidad, 877 respuestas.

Visitar el perfil

hace 8 años #134210

Profundizando un poco más veo los siguientes problemas:

 

  1. En SQ, si la estrategia utiliza el HighestInRange/LowestInRange, se tarda 10 veces más en procesar la estrategia que una que no utilice este bloque de construcción.
  2. La estrategia exportada en MQL (para MetaTrader) no funciona en plazos inferiores (por ejemplo, M5) porque sólo busca 100 barras hacia atrás en el tiempo.
  3. Si cambias el código para tener un número mayor que 100, es muy lento en MT4, en el backtester se arrastra incluso en una máquina muy rápida.

Puedo entender por qué el código busca como lo hace (para atender a los huecos de fin de semana, por ejemplo), pero es muy ineficiente.

 

Estoy viendo si puedo escribir una versión mucho más rápida.

0

mikeyc

Cliente, bbp_participant, comunidad, 877 respuestas.

Visitar el perfil

hace 7 años #138963

¿Nadie más ha notado lo lento que es SQ si seleccionas HighestInRange y/o LowestInRange?

 

Para SQ4, sugeriría que la salida de estos bloques de construcción se calcule una vez al inicio de la primera ejecución, con los resultados guardados en memoria para cada hora y minuto posibles para cada barra. Calcularlos en cada iteración es muy lento y la RAM es barata y rápida.

0

tomas262

Administrador, sq-ultimate, 2 respuestas.

Visitar el perfil

hace 7 años #138972

Hola, creo que Marks ha modificado la forma en que se implementa el código de bloque para disponer de la función "plugin" en la nueva versión. Voy a comprobar el rendimiento con SQ4 cuando se libera

0

Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)