Pues bien, el error 4066 es un problema típico de los usuarios de MTFs, el terminal no ha bombeado los datos de otros TFs necesita comprobar la integridad de los datos de otros TFs.
Mira bien el código y lo que he escrito antes de dar consejos.
El código tiene una comprobación de errores y una comprobación de datos vacíos. Y cuando una función devuelve datos incorrectos sin error, ¡es un error!
Mira bien el código y lo que he escrito antes de dar consejos.
El código tiene una comprobación de errores y una comprobación de datos vacíos. Y cuando una función devuelve datos incorrectos sin error, ¡es un error!
Tal vez me he perdido algo y muéstrame dónde compruebas la integridad del historial, por ejemplo, en el procedimientoCheckCurrentHourOpenTime()
¿Qué quiere decir con integridad de la historia?
Me refiero al hecho de que haya una comprobación de errores al recuperar los valores del historial. Hay un control en cada función. Aquí está:
//--- Проверяем, получено ли время открытия часового бара if(tempHourOpenTime==0 || err!=0) // Если время бара не получено return(false); // Возвращаем ложь
Es decir, si se recibe un valor cero o un error, el tiempo no se escribe en la variable global. ¿Crees que no es suficiente?
La cuestión es que la función SeriesInfoInteger() primero devuelve un error pero en la siguiente ejecución devuelve ¡NO! Y tampoco devuelve el valor correcto.SeriesInfoInteger() devuelve sólo información para una determinada consulta, en este caso estamos pidiendo que nos devuelva la última hora de apertura de la barra conocida en el histórico por símbolo y periodo. No hay ningún error aquí, lo que era lo último en el momento es lo que devolvió. Le mostraré cómo comprobar la integridad del historial.
SeriesInfoInteger() devuelve sólo información para una determinada consulta, en este caso estamos pidiendo que nos devuelva la última hora de apertura de la barra conocida en el histórico por símbolo y periodo. No hay ningún error aquí, lo que era lo último en el momento es lo que devolvió. Llegaré al PC y te mostraré cómo comprobar la integridad del historial.
¿Quieres decir que no hay ningún error aquí? Entonces, ¿por qué da códigos de error "falsos"? Dice que la historia está bien donde no lo está...
¿Qué quieres decir con que no hay ningún error aquí? Entonces, ¿por qué da códigos de error "falsos"? Dice que la historia está bien donde no lo está...
Una vez más, esta función no comprueba la integridad del historial. Devuelve la información que pudo encontrar en él. En este caso concreto, ha encontrado la barra de horas que se solicitó cuando se cerró el terminal. El resto de la historia aún no se ha cargado.
Para comprobar si el historial de un determinado TF está paginado por completo, basta con utilizar una función
bool IsTFDataReady(ENUM_TIMEFRAMES eTF) { ResetLastError(); iTime(NULL, eTF, 1); return GetLastError() == ERR_NO_ERROR; }
Si la función devuelve false, los datos de la TF solicitada están incompletos. Por lo demás, está completo.
Una vez más, esta función no comprueba la integridad de la historia. Devuelve la información que pudo encontrar en él. En este caso, se encontró la barra de horas que se solicitó cuando se apagó el terminal. El resto de la historia aún no se ha cargado.
Una vez más. No se menciona en ninguna parte. Eso es lo primero. En segundo lugar, ¿por qué se engaña al mostrar primero el código de error 4066 y luego no?
Para comprobar si el historial de un determinado TF está paginado por completo, basta con utilizar una función
Si la función devuelve false, los datos de la TF solicitada están incompletos. Por lo demás, está completo.
¿Lo has comprobado en el temporizador? ¿Ves que he comentado líneas? He comprobado esta función, no muestra ningún error y además muestra datos incorrectos. Lo comprobaré de nuevo.
- 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
Objetivo: Al iniciar el indicador, obtener los datos actuales en el temporizador: la hora de apertura de la barra semanal, diaria y horaria. A continuación, escríbalos en variables globales para su uso posterior. El marco temporal actual es М1.
Implementación: Obtenemos los tiempos de las barras utilizando la función SeriesInfoInteger().
Resultado: Si el terminal duró varias horas en funcionamiento, por ejemplo, estuvo apagado durante la noche, obtenemos ese resultado en su primer arranque (un día):
Como puedes ver, la hora de recuperación de datos es 2018.09.21 11:11, y para esa hora obtenemos la hora de apertura del día = 2018.09.20 (aunque debería ser 2018.09.21) y la hora de apertura de la hora = 2018.09.20 16:00 (aunque debería ser 2018.09.21 11:00). Y la hora que devuelve el terminal no es más que el dato de la última vez que se cerró. Es decir, los datos se almacenan en la caché y se devuelven independientemente del hecho de que el terminal se haya cerrado. Y entiendo que si se devolviera el error #4066 cada vez (datos históricos solicitados en estado de actualización) hasta que se actualicen los datos, pero no, ¡lo que se devuelve son datos de ERROR! Este error sólo se devuelve una vez y luego se puede vivir con él. Hay un claro error de caché. ¡Pido a los desarrolladores(@Slava) que le presten atención!
Repito. ¡Los datos erróneos aparecerán si se solicitan en el temporizador!
Versión del terminal: x64, 1090.