- 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
Lectura de precio, volumen, diferencial y hora por índice de barras
A veces se necesita información, no sobre una secuencia de barras, sino sobre una sola barra. En teoría, esto puede hacerse utilizando las funciones Copy anteriormente comentadas, especificando en ellas la cantidad (parámetro count) igual a 1, pero esto no es muy conveniente. Una versión más sencilla la ofrecen las siguientes funciones, que devuelven un valor de un tipo determinado para una barra por su número en la serie temporal.
Todas las funciones tienen un prototipo similar pero diferentes nombres y tipos de retorno. Históricamente, los nombres comienzan con el prefijo i, es decir, tienen la forma iValue (estas funciones pertenecen a un gran grupo de indicadores técnicos integrados: al fin y al cabo, las características de las cotizaciones son la fuente principal para el análisis técnico, y casi todos los indicadores son sus derivados, de ahí la letra i).
type iValue(const string symbol, ENUM_TIMEFRAMES timeframe, int offset)
Aquí, type corresponde a uno de los tipos datetime, double, long o int, dependiendo de la función específica. El símbolo y el marco temporal identifican la serie temporal solicitada. El índice de barra requerido offset se pasa en notación de series temporales: 0 significa la barra derecha más reciente (normalmente aún no completada), y números más altos significan barras más antiguas. Como en el caso de las funciones Copiar, se pueden utilizar NULL y 0 para que el símbolo y el periodo sean iguales a las propiedades del gráfico actual.
Dado que las funciones i equivalen a llamar a las funciones Copy, todas las características de solicitud de series temporales desde distintos tipos de programas, descritas en la sección Visión general de las funciones Copy para obtener arrays de cotizaciones les son aplicables.
Función |
Descripción |
|---|---|
iTime |
Hora de apertura de la barra |
iOpen |
Precio de apertura de la barra |
iHigh |
Precio alto de la barra |
iLow |
Precio bajo de la barra |
iClose |
Precio de cierre de la barra |
iTickVolume |
Volumen de ticks de la barra (similar a iVolume) |
iVolume |
Volumen de ticks de la barra (similar a iTickVolume) |
iRealVolume |
Volumen real de trading de la barra |
iSpread |
Diferencial mínimo de la barra (en pips) |
Las funciones devuelven el valor solicitado o 0 en caso de error (lamentablemente, 0 puede ser un valor real en algunos casos). Para obtener más información sobre el error, llame a la función GetLastError.
Las funciones no almacenan en caché los resultados. En cada llamada, devuelven datos reales de la serie temporal para el símbolo/período especificado. Esto significa que en ausencia de datos preparados (en la primera llamada, o tras una pérdida de sincronización), la función puede tardar algún tiempo en preparar el resultado.
A modo de ejemplo, vamos a intentar obtener una estimación más o menos realista del tamaño del diferencial de cada barra. El valor mínimo del diferencial se almacena en las cotizaciones, lo que puede causar expectativas excesivamente altas a la hora de diseñar estrategias de negociación. Para obtener valores absolutamente precisos del diferencial medio, mediano o máximo por barra, sería necesario analizar ticks reales, pero aún no hemos aprendido a trabajar con ellos. Y además, sería un proceso que consumiría muchos recursos. Un enfoque más racional consiste en analizar los diferenciales en el marco temporal inferior M1: para las barras de marcos temporales superiores, basta con buscar el diferencial máximo en las barras interiores de M1. Por supuesto, estrictamente hablando, no será el máximo, sino el máximo de los valores mínimos, pero dada la transitoriedad de las lecturas de minutos, podemos esperar detectar expansiones de diferencial característicos al menos en algunas barras M1, y esto es suficiente para obtener una relación aceptable de precisión y velocidad de análisis.
Una de las versiones del algoritmo está implementada en el script SeriesSpread.mq5. En las variables de entrada, puede establecer el símbolo, el marco temporal y el número de barras para el análisis. De manera predeterminada, se procesa el símbolo del gráfico actual y su periodo (debería ser mayor que M1).
input string WorkSymbol = NULL; // Symbol (leave empty for current)
|
Dado que para cada barra sólo es importante la información sobre su hora y diferencial, se ha descrito una estructura especial con dos campos. Podríamos utilizar la estructura estándar MqlRates y añadir diferenciales «máximos» a algún campo no utilizado (por ejemplo, real_volume para los símbolos de Forex), pero entonces se copiarían los datos de la mayoría de los campos y se desperdiciaría memoria.
struct SpreadPerBar
|
Utilizando el nuevo tipo de estructura, preparamos el array peaks para calcular los datos del número especificado de barras.
void OnStart()
|
Más adelante, la parte principal del algoritmo se ejecuta en el bucle de barras. Para cada barra, utilizamos la función iTime para determinar dos marcas de tiempo que definen los límites de la barra. De hecho, se trata de la hora de apertura de la barra i-ésima y de la barra vecina (i+1)-ésima. Dados los principios de indexación, podemos decir que la (i+1)ª barra es la barra anterior (más antigua, véase la variable prev) y la i-ésima es la siguiente (más nueva, véase la variable next). La hora de apertura de la barra pertenece a una sola barra, es decir, la etiqueta prev está contenida en la (i+1)-ésima barra, y la etiqueta next está en la i-ésima. Así, al procesar cada barra, su borde derecho debe excluirse del intervalo [prev;next).
Nos interesan los diferenciales en un marco temporal de un minuto, por lo que utilizaremos la función CopySpread para PERIOD_M1. En este caso, el intervalo de media apertura se consigue ajustando los parámetros start/stop al valor exacto prev y el valor next reducido en 1 segundo. La información de diferencial se copia en el array dinámico spreads (la memoria para ello la asigna la propia función).
for(int i = 0; i < BarCount; ++i)
|
A continuación, encontramos el valor máximo en este array y lo guardamos en la estructura apropiada SpreadPerBar junto con el tiempo de barra. Tenga en cuenta que la barra incompleta cero no se incluye en el análisis (puede completar el algoritmo si es necesario).
Una vez completado el bucle, enviamos un array de estructuras al diario.
PrintFormat("Maximal speeds per intraday bar\nProcessed %d bars on %s %s",
|
Ejecutando el script en el gráfico EURUSD,H1, obtendremos estadísticas de diferencial dentro de barras horarias (abreviadas):
Maximal speeds per intraday bar
|
Hay un aumento evidente de los diferenciales por la noche: por ejemplo, cerca de medianoche, las cotizaciones contienen diferenciales de 7-15 puntos, y en nuestras mediciones, son de 15-65. No obstante, también se encuentran valores distintos de cero en otros periodos, aunque las métricas de las barras horarias suelen contener ceros.