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

 
Vitaly Gorbunov :
Ve anladığım gibi! Türkiye terminal ile hemen başlıyor mu? Eğer öyleyse, 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!

İyi deneme. İşe yarayacağını düşünmeye başlamıştım bile. Ama hayır:

 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

Önceki kodda, OnTimer() işlevini bununla değiştirdim:

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

Ve anladığım gibi! Türkiye terminal ile hemen başlıyor mu? Eğer öyleyse, 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

Ancak Sunucu saati ile yerel saat arasındaki farkı hesaba katmalısınız. Sonuçlar için abone olun!

Koltuk değneklerini kesinlikle korumayacağım. Burada dilde açık bir hata var! Geliştiricileri bekliyorum...

 

Çok ilginç, teoride çalışması gerekiyor. Ama yine, çok hızlı bir zamanlayıcı, belki de terminalin teklifleri kabul etmeye başlamak için zamanı yoktur. Düşünmek gerek. Ve fikri test etmek için 5 saniyelik normal bir zamanlayıcı yaparsanız?

 
Vitaly Gorbunov :

Çok ilginç, teoride çalışması gerekiyor. Ama yine, çok hızlı bir zamanlayıcı, belki de terminalin teklifleri kabul etmeye başlamak için zamanı yoktur. Düşünmek gerek. Ve fikri test etmek için 5 saniye boyunca normal bir zamanlayıcı yaparsanız?

Ve fikri test etmek için "ayarlamaya" ihtiyacım yok. Gerçek koşullarda, mümkün olan en hızlı zamanlayıcıya ihtiyacınız vardır.

 
Vitaly Gorbunov :

Çok ilginç, teoride çalışması gerekiyor.

Göstergeyi her zaman terminalinizde çalıştırabilir, 15 dakika bekleyebilir ve sonuçlara göre abonelikten çıkabilirsiniz.

 

Tamam, ama yapacak çok işim var. Bir duraklama olur olmaz, bir deney yapacağım.

Görünüşe göre onu nasıl yakalayacağıma dair bir fikrim bile vardı.

 

Böyle deneyin!

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

Böyle deneyin!

Yine bir koltuk değneği. Sorunun nedenini - dil hatalarını - göz ardı ederek, mantıksız olanlar da dahil olmak üzere herhangi bir yöntemle sorunu çözmeye çalışıyorsunuz. Bence bunu yapmaya değmez.

Katma:

Evet, bu işe yarıyor gibi görünüyor. Alternatif olarak kullanabilirsiniz. Teşekkür ederim! Ancak, yine de, işlevlerin normal çalışmasını istiyorum.

 
Pekala, bunun bir koltuk değneği olduğunu söyleyemem. Sunucudan bir teklif akışı bekliyorum, aksi takdirde geçmiş güncellenmeyecek. Başka bir seçenek de , bilgisayarın yerel saatini alarak, otomatik olarak hesaplanabilen ve sonunda fiyatların güncellenmesini bekleyen saat dilimi için bir düzeltme girmektir. Evet, biraz çarpık ama Metaquotes'ın MT4'te hiçbir şeyi değiştireceğini düşünmüyorum. Sonunda, bu, şu veya bu şekilde ele alınması gereken sunucuya bir bağlantı sorunudur.
 
Alexey Kozitsyn :

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

Sonuç:

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.

Doğrulama yaklaşımınızda iki önemli hata var:

  1. Göstergenin OnInit()'inde, mevcut olan bile olsa herhangi bir TF'nin doğru verilerini almak imkansızdır. Terminalin başlangıcındaki göstergenin OnInit()'i pratik olarak boş bir pencerede yürütülür (terminal kapatıldığında orada bulunan veriler bile olmayabilir). Pazar ortamı bile genellikle henüz mevcut değildir. OnInit()'te ne yapılmaması gerektiği konusunda yardımda birçok uyarı var. Bu nedenle, koduna dahil edilebilecek çok az şey vardır. Genellikle bu, ayarların değerlerini kontrol etmek, gösterge arabelleklerini dizilere bağlamak ve varsa sınıfları oluşturmaktır. Diğer her şey OnCalculate() içinde yapılmalıdır.
  2. Tüm bu kontroller ancak OnCalculate en az bir kez çağrıldıktan sonra yapılabilir.
Neden: