[SERVICE DESK] Zamanlayıcıda kıdemli TF'nin zamanı alınırken hata oluştu! - sayfa 2

 
Alexey Kozitsyn :

Tekrar. Bu hiçbir yerde bahsedilmiyor. Bu ilk. İkincisi, neden önce 4066 hata kodunu gösterip sonra değil de yanlış yönlendiriyor?

Veriler kısımlar halinde pompalanır ve ardından terminal tarafından da işlenir ve bir zamanlayıcı üzerinde çalıştığınız için bir duraklamaya girersiniz. Evet bundan hiçbir yerde açıkça bahsedilmiyor ama MTF uygulamaları yazan birçok programcı genellikle bunu bilir, hemen şunu söyledim.

https://docs.mql4.com/ru/series/timeseries_access dikkatlice okuyun.

Eh, yukarıda zaten tarihin kullanılabilirliğini kontrol etme seçeneği verdiler. Mükemmel değil, ama basit ve net.

Bu seçenek işe yaramazsa, aşağıdakileri kontrol edin.

 if (iBarShift( Symbol (),PERIOD_H1, TimeCurrent (), true )==- 1 ){ Print ( "Данные истории по последнему часу отсутствуют!" );}
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL4
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 4, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 4. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
 
Vitaly Gorbunov :

Veriler kısımlar halinde pompalanır ve ardından terminal tarafından da işlenir ve bir zamanlayıcı üzerinde çalıştığınız için bir duraklamaya girersiniz. Evet bundan hiçbir yerde açıkça bahsedilmiyor ama MTF uygulamaları yazan birçok programcı genellikle bunu bilir, hemen şunu söyledim.

https://docs.mql4.com/ru/series/timeseries_access dikkatlice okuyun.

Eh, yukarıda zaten tarihin kullanılabilirliğini kontrol etme seçeneği verdiler. Mükemmel değil, ama basit ve net.

"Duraklat" a basmakla ilgili kanıtlar nerede?

Dikkatlice okuyun (ve daha önce okuyun). Verilerin (özellikle daha eski zaman dilimlerinin) her zaman hemen mevcut olmadığının farkındayım. Sorun yok. Ama o zaman neden SeriesInfoInteger() işlevi hata döndürmüyor!? Soru bu!

İsteğin bir tür duraklatma/değişim/güncelleme/ara verme vb. üzerine düştüğünü varsayarsak. != 0 hata kodunu döndürmesine izin verin. Ve hiçbir sorun olmayacak!

 
Vitaly Gorbunov :

Eh, yukarıda zaten tarihin kullanılabilirliğini kontrol etme seçeneği verdiler. Mükemmel değil, ama basit ve net.

Bu noktada @Ihor Herasko tarafından yukarıda cevaplandı.

 
Alexey Kozitsyn :

Bu noktada @Ihor Herasko tarafından yukarıda cevaplandı.

Yukarıda testin versiyonunu verdim. Bu neden geliştiriciler için bir sorudur, ancak bu nokta çok uzun zamandır bilinmektedir!
 
Vitaly Gorbunov :
Yukarıda testin versiyonunu verdim. Bu neden geliştiriciler için bir sorudur, ancak bu nokta çok uzun zamandır bilinmektedir!

Testin versiyonunu kesinlikle deneyeceğim ve sonuçları hakkında yazacağım.

 
Alexey Kozitsyn :

Testin versiyonunu kesinlikle deneyeceğim ve sonuçları hakkında yazacağım.

Abone olmayı unutmayın! Benim için çalışıyor! Ama işe yaramazsa her türlü tuzak olabilir, başka ne yapılabilir diye düşünürüz.
 

@Ihor Herasko'nun ilk cevabı. Çoğaltılacak kod:

 #property version    "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _m15OpenTime= 0 ;
//--- Вести лог журнала
const bool inpFileLog= true ;
//--- Количество секунд в одном дне
const int SEC_PER_DAY= 86400 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Запускаем таймер
   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 ()
  {
//--- Проверяем, записано ли время открытия текущего бара М15
   if (!CheckCurrentM15OpenTime())                         // Если время не записано
       return ;                                                 // Выходим                                                                                                                         // Выходим
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего бара М15             |
//+------------------------------------------------------------------+
bool CheckCurrentM15OpenTime()
  {
//--- Проверяем, записано ли время
   if (_m15OpenTime== 0 ) // Если время не записано
     {
       //---
       ResetLastError ();
       iTime ( NULL , PERIOD_M15 , 1 );
       //---
       if ( GetLastError ()== ERR_NO_ERROR )
        {
         ResetLastError ();
         //--- Запоминаем время открытия бара
         _m15OpenTime= iTime ( NULL , PERIOD_M15 , 0 );
         //---
         Print ( __FILE__ , ": Актуальное время открытия бара М15 = " + TimeToString (_m15OpenTime)+ ". Ошибка #" , GetLastError ());
         //--- Возвращаем истину
         return ( true );
        }
       else
         return ( false );
     }
//--- Время открытия М15 ранее записано. Возвращаем истину
   return ( true );
  }

Sonuç:

 2018.09 . 21 14 : 25 : 02.793 Custom indicator test_isNewDayInTimer_iTime() EURGBP.e,M1: removed
2018.09 . 21 14 : 30 : 44.120 Custom indicator test_isNewDayInTimer_iTime() EURGBP.e,M1: loaded successfully
2018.09 . 21 14 : 30 : 44.149 test_isNewDayInTimer_iTime() EURGBP.e,M1: initialized
2018.09 . 21 14 : 30 : 44.262 test_isNewDayInTimer_iTime() EURGBP.e,M1: test_isNewDayInTimer_iTime().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 12 : 15 . Ошибка # 0

Günlük girişlerine göre. Terminal saat 14:25'te kapatıldı. Ayrıca, 14:30'da açılır. M15 çubuğunun zamanını kontrol ediyoruz. TF M1 ile başlayın. Gösterge (yukarıdaki kod), gerçek açılış saatini 12:15 (terminal saati, yerel saatimden 2 saat geride) gösterdi. Sonuç 12:30 olmalıydı! Sonuç - bir hata var. Ve @Ihor Herasko tarafından önerilen verilen yöntem çalışmıyor.

 
Vitaly Gorbunov :
Abone olmayı unutmayın! Benim için çalışıyor! Ama işe yaramazsa her türlü tuzak olabilir, başka ne yapılabilir diye düşünürüz.

abonelikten çıkıyorum kod:

 #property version    "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _m15OpenTime= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Запускаем таймер
   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 ()
  {
//--- Проверяем, записано ли время открытия текущего бара М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 );
  }
//+------------------------------------------------------------------+

Sonuç:

 2018.09 . 21 14 : 48 : 46.485 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: removed
2018.09 . 21 15 : 01 : 23.158 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: loaded successfully
2018.09 . 21 15 : 01 : 23.175 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: initialized
2018.09 . 21 15 : 01 : 23.295 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 12 : 45 . Ошибка # 0

Terminali 14:48'de kapattım, 15:01'de açtım. 13:00 saatini almış olması gerekirdi. Alınan - 12.45. Daha çok soru?

TF'yi M1'den M5'e değiştiriyorum, doğru sonucu alıyorum:

 2018.09 . 21 15 : 01 : 23.295 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 12 : 45 . Ошибка # 0
2018.09 . 21 15 : 05 : 50.057 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: uninit reason 3
2018.09 . 21 15 : 05 : 50.058 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: initialized
2018.09 . 21 15 : 05 : 50.094 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 13 : 00 . Ошибка # 0
 
Bir kez daha geliştiricilerden ( @Slava , @Alexander , @Renat Fatkhullin ) bu soruna dikkat etmelerini rica ediyorum.
 

Ve anladığım gibi! Türkiye terminal ile hemen başlıyor mu? Evet ise, kontrol etmeden önce, IsConnected () sunucusuyla bir bağlantı olduğunu bekleyin, çok hızlı bir zamanlayıcınız var, senkronize etmek için zamanınız yok!

Ya da böyle yap

 if ( iBarShift ( Symbol (), PERIOD_M15 , TimeLocal (), true )==- 1 )
        {
         Print ( __FILE__ + ": Данные истории по последнему часу отсутствуют! Ошибка #" , GetLastError ());
         return ( false );
        }
Ancak Sunucu saati ile yerel saat arasındaki farkı hesaba katmalısınız. Sonuçlar için abone olun!
Neden: