High, Low y Open anual

 
Necesito obtener los precios del high y low del año anterior y la apertura del año actual, pero como no existen barras anuales no podría obtenerlo con la funcion "iHigh".

¿Alguien tiene alguna idea de como obtener estos precios para dibujar una línea en estos?
 
Saúl Lopez:
Necesito obtener los precios del high y low del año anterior y la apertura del año actual, pero como no existen barras anuales no podría obtenerlo con la funcion "iHigh".

¿Alguien tiene alguna idea de como obtener estos precios para dibujar una línea en estos?

Puedes recorrer las barras diarias del año anterior, filtrar aquellas que corresponden a ese periodo y, a partir de ellas, identificar los valores más altos y más bajos del año.

void GetPrevYearHighLow(double &highPrevYear, double &lowPrevYear)
{
   // Inicializamos las variables de high y low con los valores máximos y mínimos posibles
   highPrevYear = -DBL_MAX;
   lowPrevYear = DBL_MAX;
   
   // Obtenemos la fecha actual y calculamos el año anterior
   datetime timeNow = TimeCurrent();
   int currentYear = TimeYear(timeNow);
   int prevYear = currentYear - 1;

   // Obtenemos el total de barras diarias disponibles
   int totalBars = iBars(NULL, PERIOD_D1);
   
   // Recorrer todas las barras diarias
   for(int i = 0; i < totalBars; i++)
     {
      // Obtener el tiempo de la barra actual
      datetime barTime = iTime(NULL, PERIOD_D1, i);

      // Si la barra pertenece al año anterior, procesamos los valores High y Low
      if(TimeYear(barTime) == prevYear)
       {
         double high = iHigh(NULL, PERIOD_D1, i);
         double low = iLow(NULL, PERIOD_D1, i);

         // Actualizamos los valores máximos y mínimos
         if(high > highPrevYear) highPrevYear = high;
         if(low < lowPrevYear) lowPrevYear = low;
       }

      // Si la barra es de un año anterior al año previo, salimos del bucle
      if(TimeYear(barTime) < prevYear)
       {
         break;
       }
    }
}
 
Miguel Angel Vico Alba #:

Puedes recorrer las barras diarias del año anterior, filtrar aquellas que corresponden a ese periodo y, a partir de ellas, identificar los valores más altos y más bajos del año.

1-¿No sería mejor utilizar el período mensual para hacer menos cálculos?

2- Cuando compilé esta función me mostró un error en las siguientes líneas:

      // Si la barra es de un año anterior al año previo, salimos del bucle
      if(TimeYear(barTime) < prevYear)
       {
         break;
       }

Pero no puedo identificar algún error de sintaxis o mal uso de los operadores como dice el editor. (Ver imagen adjunta)

Archivos adjuntos:
barTime.png  38 kb
 

Prueba esta opción:

void OnStart(){
   Comment("");
   datetime    time=TimeCurrent(); 
   MqlDateTime tm; 
   if(!TimeToStruct(time,tm)) Print("Fallo en TimeToStruct(). Error ", GetLastError()); 
    
   double PastYearHigh = iHigh(NULL, PERIOD_MN1, iHighest(NULL, PERIOD_MN1, MODE_HIGH, 12,tm.mon));
   double PastYearLow = iLow(NULL, PERIOD_MN1, iLowest(NULL, PERIOD_MN1, MODE_LOW, 12, tm.mon));
   
   Comment("PastYearHIGH: ",PastYearHigh,"\n", "PastYearLOW:   ", PastYearLow);
}
 
Juan Luis De Frutos Blanco #:

Prueba esta opción:

¿Como hiciste para que la línea del código recorra los 12 meses del año pasado y no los últimos 12 meses desde la vela actual?

Lo pregunto porque al leer los parametros de iHighest y iLowest especifica que indique el indice con respecto a la vela actual y aún así el script comenta el valor correcto del año pasado.
Estuve pensando en añadir el precio de cierre del año pasado o el precio de apertura del año actual pero no existen "iOpenest" ni "iClosest", =D jajaja.

 

Con la variable de tiempo  tm creada con MqlDateTime, y convertida en struc con  TimeToStruct a partir de TimeCurrent(), podemos determinar el mes en el que estamos mediante tm.mon.

Casualidad, el mes 10, coincidente con el desplazamiento necesario para llegar hasta el año anterior.

Con PERIOD_MN1 (mensual) y este desplazamiento, con iHighest podemos calcular el mes con el máximo high en los 12 meses anteriores (casualidad el año 2023 completo), con lo que llegamos a saber el desplazamiento que debemos aplicar a iHigh para que nos calcule el máximo del mes en cuestión, que es en el que está el highest del año.

¿Me habré explicado?

 
Juan Luis De Frutos Blanco #:

Con la variable de tiempo  tm creada con MqlDateTime, y convertida en struc con  TimeToStruct a partir de TimeCurrent(), podemos determinar el mes en el que estamos mediante tm.mon.

Casualidad, el mes 10, coincidente con el desplazamiento necesario para llegar hasta el año anterior.

Con PERIOD_MN1 (mensual) y este desplazamiento, con iHighest podemos calcular el mes con el máximo high en los 12 meses anteriores (casualidad el año 2023 completo), con lo que llegamos a saber el desplazamiento que debemos aplicar a iHigh para que nos calcule el máximo del mes en cuestión, que es en el que está el highest del año.

¿Me habré explicado?

¿Casualidad?, no comprendo.

Entiendo mas o menos que lo lograste con la estructura creada pero no comprendo mucho la lógica, es decir, ¿como hace la estructura para determinar donde concluir el recorrido?

 

Retoma el precio máximo de la barra mensual, en este caso, que corresponde tras el desplazamiento correspondiente al  iHighest.

 
Juan Luis De Frutos Blanco #:

Retoma el precio máximo de la barra mensual, en este caso, que corresponde tras el desplazamiento correspondiente al  iHighest.

La función "iHigh" y "iLow" si las comprendo, lo que no comprendo es ¿como el tipo de dato struct que creaste hace el recorrido sin tomar de referencia la vela actual?

Lo menciono porque en la línea donde utilizas "iHighest" se indica que haga un recorrido de 12 velas tomando de referencia la actual vela, pero hasta la fecha de hoy existen 22 velas, básicamente lo que no entiendo es el por qué el script devuelve el valor correcto sin tener las líneas de las variables double escritas de la siguiente manera:

  double PastYearHigh = iHigh(NULL, PERIOD_MN1, iHighest(NULL, PERIOD_MN1, MODE_HIGH, 22,tm.mon));
   double PastYearLow = iLow(NULL, PERIOD_MN1, iLowest(NULL, PERIOD_MN1, MODE_LOW, 22, tm.mon));

Las líneas tienen un 22 en vez de un 12 porque en el gráfico hay 10 meses del año actual y necesito hacer el recorrido de los 12 meses del año pasado (2023). Lo que entiendo que debería ser según explica el manual de mql5 es:
 10 meses (año actual) + 12 meses(año pasado) = 22 meses de recorrido. (Ver imágenes adjuntas)


PD: me disculpo por liarme tanto si ya el problema esta resuelto, solo quería entender este pequeño detalle.

Archivos adjuntos:
 

Mira el ejemplo que incluyes en iHighest.png

En el caso: tm.mon = 10, octubre, es el desplazamiento. 12 es el nº de velas a partir de él = el año anterior.

 
Juan Luis De Frutos Blanco #:

Mira el ejemplo que incluyes en iHighest.png

En el caso: tm.mon = 10, octubre, es el desplazamiento. 12 es el nº de velas a partir de él = el año anterior.

Ahora si lo comprendo, muchas gracias por la aclaración. =D