[Erro em obter o tempo do TF sênior no temporizador! - página 3

 
Vitaly Gorbunov:
Acho que consegui! O indicador é lançado imediatamente junto com o terminal? Se assim for, antes de verificar a comunicação com o servidor IsConnected() você tem um timer muito rápido que não tem tempo para sincronizar!

Boa tentativa. Eu estava começando a pensar que iria funcionar. Mas... Não:

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

Eu substituí a função OnTimer( ) no código anterior por esta função:

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

Acho que consegui! O indicador é iniciado imediatamente junto com o terminal? Se sim, antes de verificar a conexão com o servidor IsConnected() você tem um timer muito rápido que não tem tempo para sincronizar!

Ou faça assim.

Mas teremos que levar em conta a diferença entre a hora do servidor e a hora local. Escreva de volta com os resultados!

Eu não vou fazer muletas. Há um erro óbvio no idioma! Estamos esperando os desenvolvedores...

 

Muito interessante, é suposto funcionar. Mas então novamente o timer é muito rápido, talvez o terminal não tenha tempo para começar a aceitar citações. Tenho que pensar sobre isso. Que tal fazer um temporizador normal por 5 segundos para testar a idéia?

 
Vitaly Gorbunov:

Muito interessante, é suposto funcionar. Mas então novamente o timer é muito rápido, talvez o terminal não tenha tempo para começar a aceitar citações. Tenho que pensar sobre isso. E se fizermos um timer normal por 5 segundos para testar a idéia?

E eu não preciso de um "ajuste" para verificar a idéia. Na vida real, eu preciso do temporizador mais rápido possível.

 
Vitaly Gorbunov:

Muito interessante, é suposto funcionar.

Você sempre pode executar o indicador em seu terminal, aguardar 15 minutos e reportar de volta.

 

Está bem, mas tenho muito mais trabalho a fazer. Assim que eu tiver uma pausa, farei uma experiência.

E acho que até tenho uma idéia de como pegá-lo.

 

Experimente assim!

//+------------------------------------------------------------------+
//|                                                      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:

Experimente assim!

Lá está a muleta de novo. Você está tentando resolver o problema por qualquer meio, mesmo que irracional, ignorando a causa do problema - erros de linguagem. Acho que você não deveria fazer isso.

Adicionado:

Sim, este tipo de técnica parece funcionar. Como opção, você pode usá-lo. Obrigado! Mas eu ainda gostaria que as funções funcionassem corretamente.

 
Bem, eu não diria que é uma muleta. Estou esperando que as citações fluam do servidor, caso contrário, o histórico não será atualizado. Outra opção é tomar o tempo do computador local e corrigir o fuso horário, que pode ser calculado automaticamente e, no final, aguardar a atualização das cotações de qualquer forma. É um pouco tortuoso, mas não creio que o povo Metakvot mude nada no MT4. No final do dia, é um problema de conexão ao servidor que tem que ser tratado de uma forma ou de outra.
 
Alexey Kozitsyn:

Primeiro uma resposta de @Ihor Herasko. Código para reprodução:

Resultado:

De acordo com as entradas dos registros. O terminal foi desligado às 14:25. A seguir, ligado às 14h30min. Verificamos o horário do bar M15. Começamos com a TF M1. O indicador (código acima) mostrava o tempo real de abertura 12:15 (hora do terminal, atrasado em 2 horas em relação à minha hora local). O resultado deveria ter sido 12:30! Conclusão - o erro está presente. E este método proposto por @Ihor Herasko não funciona.

Há dois erros significativos em sua abordagem para verificar:

  1. No OnInit() do indicador, é impossível obter os dados corretos de qualquer TF, mesmo do atual. O OnInit() do indicador no início do terminal é executado quase em uma janela vazia (pode até não haver os dados que estavam no momento do desligamento do terminal). Mesmo o ambiente de mercado ainda é muitas vezes indisponível. A ajuda contém muitos avisos sobre o que não se deve fazer no OnInit(). Portanto, não há muito a incluir em seu código. Normalmente, esta é uma verificação dos valores dos parâmetros definidos, ligação de buffers indicadores a arrays e criação de classes, caso sejam utilizados. Tudo o resto tem que ser feito na OnCalculate().
  2. Todas essas verificações só podem ser feitas após a OnCalculate ser chamada pelo menos uma vez.