[SERVICE DESK] ¡Error al obtener la hora de la TF superior en el temporizador! - página 3

 
Vitaly Gorbunov:
¡Creo que lo tengo! ¿El indicador se lanza enseguida junto con el terminal? ¡Si es así, antes de comprobar la espera de la comunicación con el servidor IsConnected() tiene un temporizador muy rápido no tiene tiempo para sincronizar!

Buen intento. Empezaba a pensar que iba a funcionar. Pero... No:

2018.09.21 15:16:40.519 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: removed
2018.09.21 15:32:29.397 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: loaded successfully
2018.09.21 15:32:29.415 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: initialized
2018.09.21 15:32:29.508 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.532 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.557 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.587 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.620 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.651 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.683 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.716 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.743 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.776 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.807 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.841 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.872 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.901 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.935 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.972 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.996 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:30.059 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М15 = 2018.09.21 13:15. Ошибка #0

He sustituido la función OnTimer() del código anterior por ésta:

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if( !IsConnected() )
        {
         Print( __FUNCTION__,": Связь отсутствует!" );
         return;
        }
//--- Проверяем, записано ли время открытия текущего бара М15
   if(!CheckCurrentM15OpenTime())                        // Если время не записано
      return;                                                // Выходим
  }
 
Vitaly Gorbunov:

¡Creo que lo tengo! ¿Se pone en marcha el indicador inmediatamente con el terminal? ¡Si es así, antes de comprobar la espera de una conexión con el servidor IsConnected() tiene un temporizador muy rápido no tiene tiempo para sincronizar!

O hazlo así.

Pero tendremos que tener en cuenta la diferencia entre la hora del servidor y la hora local. Escriba los resultados.

No voy a hacer muletas. Hay un error evidente en el lenguaje. Estamos esperando que los desarrolladores...

 

Muy interesante, se supone que funciona. Pero de nuevo el temporizador es muy rápido, tal vez el terminal no tiene tiempo para empezar a aceptar las cotizaciones. Tengo que pensarlo. ¿Qué tal si hacemos un temporizador normal de 5 segundos para probar la idea?

 
Vitaly Gorbunov:

Muy interesante, se supone que funciona. Pero de nuevo el temporizador es muy rápido, tal vez el terminal no tiene tiempo para empezar a aceptar las cotizaciones. Tengo que pensarlo. ¿Y si hacemos un temporizador normal de 5 segundos para comprobar la idea?

Y no necesito un "ajuste" para comprobar la idea. En la vida real, necesito el temporizador más rápido posible.

 
Vitaly Gorbunov:

Muy interesante, se supone que funciona.

Siempre puedes ejecutar el indicador en tu terminal, esperar 15 minutos e informar.

 

Vale, pero tengo mucho más trabajo que hacer. En cuanto tenga un respiro, haré un experimento.

Y creo que incluso tengo una idea de cómo atraparlo.

 

Pruébalo así.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_chart_window
datetime ChkTime;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _m15OpenTime=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//Сохраняем старое время  
   ChkTime=TimeCurrent();
//--- Запускаем таймер
   if(!EventSetMillisecondTimer(20))
     {
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 ms не установлен!");
      return( INIT_FAILED );
     }
//--- Сбрасываем время открытия текущего бара м15
   _m15OpenTime=0;
//---
   return( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   return( rates_total );
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!IsConnected())
     {
      Print(__FUNCTION__,": Связь отсутствует!");
      return;
     }
//Если есть соединение проверяем что прошла синхронизация времни     
   if(IsConnected() && ChkTime==TimeCurrent())
     {
      return;
     }
//--- Проверяем, записано ли время открытия текущего бара М15
   if(!CheckCurrentM15OpenTime()) // Если время не записано
      return;// Выходим
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего бара М15             |
//+------------------------------------------------------------------+
bool CheckCurrentM15OpenTime()
  {
//--- Проверяем, записано ли время
   if(_m15OpenTime==0) // Если время не записано
     {
      //---
      ResetLastError();
      if(iBarShift(Symbol(),PERIOD_M15,TimeCurrent(),true)==-1)
        {
         Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
         return( false );
        }
      //---
      if(GetLastError()==ERR_NO_ERROR)
        {
         ResetLastError();
         //--- Запоминаем время открытия бара
         _m15OpenTime=iTime(NULL,PERIOD_M15,0);
         //---
         Print(__FILE__,": Актуальное время открытия бара М15 = "+TimeToString(_m15OpenTime)+". Ошибка #",GetLastError());
         //--- Возвращаем истину
         return( true );
        }
      else
         return( false );
     }
//--- Время открытия недели ранее записано. Возвращаем истину
   return( true );
  }
//+------------------------------------------------------------------+



2018.09.21 15:02:42.910 Custom indicator test XAUUSD,H1: removed
2018.09.21 15:15:27.985 test XAUUSD,H1: initialized
2018.09.21 15:15:29.520 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.552 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.589 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.605 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.636 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.667 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.705 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.736 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.768 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.805 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.837 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.868 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.906 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.937 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.969 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.006 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.038 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.069 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.106 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.138 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.169 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:31.880 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #4066
2018.09.21 15:15:31.900 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:31.940 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:31.990 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.010 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.074 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.100 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.120 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.174 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.274 test XAUUSD,H1: test.mq4: Актуальное время открытия бара М15 = 2018.09.21 15:15. Ошибка #0
 
Vitaly Gorbunov:

Pruébalo así.

Ahí está la muleta de nuevo. Intenta resolver el problema por cualquier medio, incluso irracional, ignorando la causa del problema: los errores lingüísticos. No creo que debas hacer eso.

Añadido:

Sí, este tipo de técnica parece funcionar. Como opción puedes utilizarlo. Gracias. Pero aún así me gustaría que las funciones funcionaran correctamente.

 
Bueno, yo no diría que es una muleta. Estoy esperando que las cotizaciones fluyan desde el servidor, de lo contrario el historial no se actualizará. Otra opción es tomar la hora local del ordenador y corregirla por la zona horaria, que puede calcularse automáticamente y al final esperar a que se actualicen las cotizaciones de todos modos. Está un poco torcido pero no creo que los de Metakvot cambien nada en MT4. Al fin y al cabo es un problema de conexión al servidor que hay que solucionar de una forma u otra.
 
Alexey Kozitsyn:

Primero una respuesta de @Ihor Herasko. Código para la reproducción:

Resultado:

Según las entradas del registro. La terminal se apagó a las 14:25. A continuación, se encendió a las 14:30. Comprobamos la hora del bar M15. Empezamos con la TF M1. El indicador (código anterior) mostraba la hora real de apertura 12:15 (hora de la terminal, retrasada respecto a mi hora local en 2 horas). ¡El resultado debería haber sido 12:30! Conclusión: el error está presente. Y este método propuesto por @Ihor Herasko no funciona.

Hay dos errores significativos en su enfoque para comprobar:

  1. En el OnInit() del indicador es imposible obtener los datos correctos de cualquier TF, incluso el actual. El OnInit() del indicador al inicio del terminal se ejecuta casi en una ventana vacía (puede que ni siquiera existan los datos que había en el momento del cierre del terminal). Incluso el entorno del mercado a menudo no está disponible. La ayuda contiene un montón de advertencias sobre lo que no se debe hacer en OnInit(). Por lo tanto, no hay mucho que incluir en su código. Por lo general, se trata de una comprobación de los valores de los parámetros establecidos, la vinculación de los búferes indicadores a las matrices y la creación de clases, si se utilizan. Todo lo demás debe hacerse en OnCalculate().
  2. Todas estas comprobaciones sólo pueden realizarse después de que se llame a OnCalculate al menos una vez.
Razón de la queja: