- Símbolos y marcos temporales
- Aspectos técnicos de la organización y el almacenamiento de series temporales
- Obtención de características de arrays de precios
- Número de barras disponibles (Bars/iBars)
- Índice de la barra de búsqueda por tiempo (iBarShift)
- Visión general de las funciones Copy para obtener arrays de comillas
- Obtener cotizaciones como un array de estructuras MqlRates
- Solicitud independiente de arrays de precios, volúmenes, diferenciales, tiempo
- Lectura de precio, volumen, diferencial y hora por índice de barras
- Encontrar los valores máximo y mínimo de una serie temporal
- Trabajar con arrays de ticks reales en estructuras MqlTick
Índice de la barra de búsqueda por tiempo (iBarShift)
La función iBarShift proporciona el número de barra de la hora especificada. En este caso, la numeración de las barras se entiende siempre como en las series temporales, es decir, el índice 0 corresponde a la barra más a la derecha, la más reciente, y los valores aumentan a medida que se avanza de derecha a izquierda (hacia el pasado).
int iBarShift(const string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact = false)
La función devuelve el índice de la barra en la serie temporal para el par especificado de parámetros symbol/timeframe, en el que cae el valor del parámetro time. Cada barra se caracteriza por una hora de apertura y una duración común a todas las barras de la serie, es decir, por un periodo. Por ejemplo, en un marco temporal por horas, una barra marcada con una hora de apertura de 13:00 dura desde las 13:00:00 hasta las 13:59:59 (incluyendo todo el último minuto y segundo).
Si no hay ninguna barra para la hora especificada (por ejemplo, la hora cae en horas o días en las que no hay trading), la función se comporta de forma diferente dependiendo del parámetro exacto: si precise = true, la función devolverá -1; si exact=false, devolverá el índice de la barra más cercana cuya hora de apertura sea menor que la especificada. En el caso de que no exista tal barra, es decir, que no haya historial antes de la hora especificada, la función devolverá -1. Pero aquí hay un matiz.
¡Atención! Si la función iBarShift devuelve un número de barra específico, es decir, un valor distinto de -1, esto no significa que el siguiente intento de acceder a las series temporales por este índice podrá obtener los precios u otras características de esta barra. En concreto, esto puede ocurrir si el índice de la barra solicitada supera el límite de barras de la ventana del terminal (TerminalInfoInteger(TERMINAL_MAXBARS)). Esto puede ocurrir a medida que se forman nuevas barras: entonces las barras más antiguas pueden desplazarse más allá del límite hacia la izquierda y quedar fuera de la ventana de visibilidad, aunque nominalmente pueden permanecer en la memoria durante algún tiempo. El desarrollador debe comprobar siempre estas situaciones.
Vamos a comprobar el rendimiento de las funciones Bars/iBars y (véase la sección anterior) iBarShift utilizando el script SeriesBars.mq5.
void OnStart()
|
Aquí nos encontramos con otra función desconocida ChartTimeOnDropped (lo describiremos más adelante): devuelve el tiempo de una barra específica (en el gráfico activo) a la que el script de Navigator fue arrastrado y soltado con el ratón. En primer lugar, vamos a arrastrar el script a la zona del gráfico donde hay cotizaciones.
Se crearán las siguientes entradas en el registro (los números serán diferentes, de acuerdo con su configuración, acciones y la hora actual):
ChartTimeOnDropped()=2021.10.01 09:00:00 / ok
|
En este caso, el script se arrastró a una barra con la hora 2021.10.01 09:00 (se utilizó un marco temporal horario). Según iBarShift, esta hora correspondía al número de barra 125.
El número de barras desde la barra bajo el ratón hasta la última (hora actual) era 126. Esto se combina con el número de barra 125, ya que la numeración empieza por 0.
El número total de barras del gráfico, obtenido de diferentes formas (iBars, Bars sin intervalo de fechas, y Bars con un intervalo completo de 0 al momento actual TimeCurrent), es igual a 10004. La configuración del terminal tenía un límite de 10 000 pero se han formado 4 barras horarias adicionales durante la sesión.
El número de la barra en la que cae el tiempo actual iBarShift(..., TimeCurrent()) es siempre 0 para un símbolo y un marco temporal existentes, siempre que exact = false. Si exact = true, entonces a veces podemos obtener -1 ya que el tiempo del servidor aumenta cuando llegan los ticks de todos los instrumentos del mercado, y el símbolo actual puede no objeto de trading temporalmente. Entonces la hora del servidor puede adelantarse en más de una barra, y para TimeCurrent no hay ninguna nueva barra que acertar exactamente.
Si arrastramos y soltamos el script en el área vacía a la derecha de la última barra actual (es decir, en el futuro), obtenemos algo como esto:
ChartTimeOnDropped()=2021.10.09 02:30:00 / ok
|
La función iBarShift en el modo de búsqueda de cualquier barra anterior (exact = false) devuelve 0 porque la barra actual es la más próxima al futuro. Sin embargo, una búsqueda exacta (exact = true) da el resultado -1. Además, las funciones Bars que cuentan barras en el rango desde el tiempo actual hasta el futuro «objetivo» ahora devuelven 0 (no hay barras allí todavía).
La función iBarShift es especialmente útil para escribir programas MQL multidivisa. Muy a menudo, los calendarios de trading de los distintos instrumentos financieros no coinciden, por lo que, para una hora determinada, puede existir una barra en un símbolo y no existir en otro. Utilizando la función iBarShift en el modo de búsqueda de barras más cercano (anterior), siempre puede obtener índices de barras con precios que fueron relevantes para diferentes símbolos en el mismo momento. Por regla general, incluso para los símbolos de Forex, los índices de las barras históricas para el mismo tiempo pueden diferir.
Por ejemplo, las siguientes instrucciones registrarán diferentes números de barras y sus números en el mismo intervalo de fechas para tres símbolos: EURUSD, XAUUSD, USDRUB en el marco temporal de una hora (servidor MQ Demo):
PRTF(Bars("EURUSD", PERIOD_H1, D'2021.05.01', D'2021.09.01')); // 2087
|