Qué actualiza RefreshRates() - página 7

 
Mikhail Nazarenko:

Gracias, eso es justo. ¿Realmente el terminal da un error 4066 después de acceder a una serie de tiempo no actualizada a través de iTime? Me he encontrado con que iClose da información no actualizada en lugar de cero.

Esa es la cuestión, ese es el punto clave que está causando tu enganche.

Error 4066 - cuando no hay historial para este TF, no está listo, necesita contactar con el servidor.

Y cuando ya lo tienes, pero se actualiza sólo cuando accedes a él, es decir, no da un error, sólo te da lo que hay ahora, y simultáneamente con la petición empieza a actualizarse la serie temporal.

Si accedes a ella con poca frecuencia y de forma irregular, a veces te quedas con cosas viejas. Si solicita cada TF necesaria con regularidad, hasta cada garrapata, entonces todo está bien.

Si el gráfico de este TF está abierto, se actualiza regularmente en el gráfico. Por cierto, probablemente es posible abrir gráficos de todos los TFs necesarios desde los EAs, si el acceso no es regular, pero es poco fiable, porque pueden cerrar/cambiar los TFs manualmente.

 
Evgeniy Chumakov:


¿Por qué añadir 0 a [i + 0]?

en lugar de cero he sustituido 1 y 2, 1 o 2. He dejado 0, es decir, 1 bar. No he limpiado el código, no es importante para la lógica.

 
Aleksey Mavrin:

Ese es el punto, es el punto clave que hace que te atasques.

El error 4066 es cuando no hay historial para este TF, no está listo, necesita contactar con el servidor.

Y cuando ya lo tienes, pero se actualiza sólo cuando accedes a él, es decir, no da un error, sólo te da lo que hay ahora, y simultáneamente con la petición se empieza a actualizar la serie temporal.

Si accedes a ella con poca frecuencia y de forma irregular, a veces tienes basura. Si solicita cada TF necesaria con regularidad, hasta cada garrapata, entonces todo está bien.

Si el gráfico de este TF está abierto, se actualiza regularmente en el gráfico. Por cierto, probablemente es posible abrir gráficos de todos los TFs necesarios desde los EAs, si el acceso no es regular, pero es poco fiable, porque pueden cerrar/cambiar los TFs manualmente.

Cuando debería haber un error devuelve los datos antiguos, genial. Esta es una de las razones por las que los corredores aman MT4 y no cambian a MT5)).

Es decir, pedir el plazo correcto cada tick o sleep, hasta el error 4066. ¿Lo he hecho bien?

 
Mikhail Nazarenko:

Cuando debería dar un error devuelve los datos antiguos, genial. Esta es una de las razones por las que a los corredores les gusta MT4 y no cambian a MT5)).

Es decir, pedir el plazo correcto cada tick o sleep, hasta el error 4066. ¿He acertado?

Casi. Aquí hay una función lista:

bool IsTFDataReady(ENUM_TIMEFRAMES eTF)
{
   ResetLastError();
   iTime(NULL, eTF, 1);
   return GetLastError() == ERR_NO_ERROR;
}
Introdúzcalo en OnTick() y, si devuelve true, se puede acceder al marco temporal eTF, los datos son válidos.
 
Mikhail Nazarenko:

Cuando debería haber un error devuelve los datos antiguos, genial. Esta es una de las razones por las que a los corredores les gusta MT4 y no cambian a MT5)).

Es decir, pedir el plazo correcto cada tick o sleep, hasta el error 4066. ¿Lo he hecho bien?

Por supuesto, es mejor utilizar el sueño sólo en OnInit, y es necesario sólo en los indicadores. En otros casos, OnTick, como mencionó Igor anteriormente, es suficiente.

Dependiendo de la tarea, puedes maniobrar para encontrar la mejor opción. Normalmente, cuando se comprueba si hay una nueva barra, ya se accede a iTime en cada tick para todos los marcos temporales utilizados, lo que es suficiente para mantenerlos actualizados.

s.w. Y si usas la función de Igor no en cada tick, sino en algunas condiciones raras, también habrá un retraso.
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
В чем различия между тремя режимами тестирования в MetaTrader 5 и на что обратить внимание? Как происходит тестирование эксперта, торгующего одновременно на нескольких инструментах? Когда и как вычисляются значения индикаторов при тестировании и как обрабатываются события? Как синхронизировать бары с разных инструментов при тестировании в режиме "Только цены открытия"? Статья призвана дать ответы на эти и многие другие вопросы.
 
Aleksey Mavrin:

sleep se utiliza mejor sólo en OnInit, por supuesto, y sólo es necesario en los indicadores. En otros casos, basta con utilizar OnTick, como mencionó Igor anteriormente.

Dependiendo de la tarea, puedes maniobrar para encontrar la mejor opción. Normalmente, cuando se comprueba si hay una nueva barra, se llama a iTime en cada tick para todos los marcos temporales utilizados, es suficiente para mantenerlos actualizados.

s.e. Y si la función de Igor se usa no en cada tic, sino en algunas condiciones raras, también estará desincronizada.

El sueño no funciona en los indicadores

 
Ihor Herasko:

Casi. Aquí hay una función ya hecha:

Introdúcelo en OnTick() y si devuelve true, puedes acceder al timeframe eTF, los datos son válidos.

Es brillantemente simple. Gracias. ¿Por qué los desarrolladores no describen esto en el manual sobre las funciones iClose, etc.?O corrigen la lógica de las actualizaciones de las cotizaciones de MT4 para no crear teorías conspirativas.

 
Mikhail Nazarenko:

Cuando debería haber un error devuelve los datos antiguos, genial. Esta es una de las razones por las que a los corredores les gusta MT4 y no cambian a MT5)).

Es decir, pedir el plazo correcto cada tick o sleep, hasta el error 4066. ¿Lo he hecho bien?

En MT5 es mucho más difícil.

En F4 basta con solicitar el iTime de todos los TFs utilizados cada 2 minutos, y todos los datos serán reales.

 
Mikhail Nazarenko:

Todo es brillantemente simple. Gracias. ¿Por qué los desarrolladores no describen esto en el manual sobre las funciones de iClose y demás?O corrigen la lógica de las actualizaciones de las cotizaciones de MT4 para no crear teorías conspirativas.

Porque casi todos los EAs hacen comprobaciones de las condiciones adecuadas en cada tick y todo se actualiza por sí mismo.

 
Vitaly Muzichenko:

El sueño no funciona en los indicadores

Funciona si realmente lo necesitas :)

void SleepA(int msec)
 {
   uint now=GetTickCount();
   while (GetTickCount()<(now+msec))
      {
      for(int i=0;i<10000;i++)
         {
          double f=1;
          f*=f;
          f+=f;
         }
       }
   return;
 }  
Andrey Khatimlianskii:

En MT5 es mucho más complicado.

En el 4 basta con solicitar iTime a todos los TFs utilizados cada 2 minutos, y todos los datos serán reales.

Exactamente