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; } } }
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)
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); }
¿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?
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.
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.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
¿Alguien tiene alguna idea de como obtener estos precios para dibujar una línea en estos?