Yerel saat ile taze kene saati arasında bir buçuk dakikalık fark. Ne yapalım. - sayfa 5

 
pivomoe :
Biliyorum. Bunu neden yapıyorsun?

Birine, ki:

özet :

Ayrıca Piyasa İzleme "Hacim" "Son İşlem Yapıldı" sütunlarında da vardır. Bu işlevin yalnızca son işaretin .zamanını döndürdüğüne dair şüpheler vardır.

İşlev SymbolInfoInteger ( _Symbol , SYMBOL_TIME )   sadece son tik saatini döndürür. Çünkü alıntıdaki bir değişiklik, yeni bir bilgi kenesinin ortaya çıkmasını gerektirir.

Son teklifin gelişi ile son onay işaretinin zamanı arasındaki süreyi ölçmek istiyorsunuz. Saniyeler içinde, her zaman 0 olacak gibi görünüyor. Bu nedenle, terminal her şeyi anında döndürür.

 
Alexey Kozitsyn :

Birine, ki:

İşlev SymbolInfoInteger ( _Symbol , SYMBOL_TIME )   sadece son tik saatini döndürür. Çünkü alıntıdaki bir değişiklik, yeni bir bilgi kenesinin ortaya çıkmasını gerektirir.

Son teklifin gelişi ile son onay işaretinin zamanı arasındaki süreyi ölçmek istiyorsunuz. Saniyeler içinde, her zaman 0 olacak gibi görünüyor. Bu nedenle, terminal her şeyi anında döndürür.

Bir kez daha, sorunu nerede görüyorum?

Verilen:

Yerel saat ve sunucu saati aşağı yukarı senkronizedir, yani yeni kenelerin .time_msc'si ile yerel saat arasındaki fark birkaç saniyedir.

18:00:00 bilgisayar saatinde SymbolInfoTick kullanarak SBER sembolü için yeni bir onay işareti almaya çalışıyoruz, bize 17:57:00 saatiyle bir onay işareti veriliyor.

18:00:01 bilgisayar saatinde tekrar SymbolInfoTick kullanarak SBER sembolü için yeni bir tik almaya çalışıyoruz, 17:58:30 saatiyle bize bir tik veriliyor.

Bence çalışır durumda değil.

Artık bilgisayarın yerel saatinden uzaklaştım ve bunun yerine piyasa saatindeki tüm semboller arasında son tıklamanın maksimum süresini kullandım.

 
pivomoe :

Bir kez daha, sorunu nerede görüyorum?

Verilen:

Yerel saat ve sunucu saati aşağı yukarı senkronizedir, yani yeni kenelerin .time_msc'si ile yerel saat arasındaki fark birkaç saniyedir.

18:00:00 bilgisayar saatinde SymbolInfoTick kullanarak SBER sembolü için yeni bir onay işareti almaya çalışıyoruz, bize 17:57:00 saati ile bir onay işareti veriliyor.

18:00:01 bilgisayar saatinde tekrar SymbolInfoTick kullanarak SBER sembolü için yeni bir tik almaya çalışıyoruz, 17:58:30 saatiyle bize bir tik veriliyor.

Bence çalışır durumda değil.

Artık bilgisayarın yerel saatinden uzaklaştım ve bunun yerine piyasa saatindeki tüm semboller arasında son tıklamanın maksimum süresini kullandım.

Bilgisayarın saatinin herhangi birine ayarlanabileceğini anlıyor musunuz? Ona bağlanamazsın. Bu size zaten söylendi. Bu ilk.

İkinci olarak, Market Watch'taki tüm semboller arasında son tik'in maksimum süresi de kullanılamaz. Bir SBER sembolünün (SymbolInfoTick) son işaretinin zaman gecikmesini bir SBER sembolünün (SymbolInfoInteger) son alıntı zamanından bulmak istiyorsunuz. Onlar. yazdığım gibi bir şey yapmanız gerekiyor (yaklaşık çünkü daha fazla doğruluk için size tavsiye edildiği gibi bir bardak kullanmanız gerekiyor).

Üçüncüsü, işte burada:

В 18 : 00 : 00 по времени компа  пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick , нам отдают тик со временем 17 : 57 : 00

В 18 : 00 : 01 по времени компа опять пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick , нам отдают тик со временем 17 : 58 : 30

kanıt olmadan iddia etti. Kodunuzun kanıt olduğunu düşünüyorsanız, "İkinci" bölümüne bakın.

 
Alexey Kozitsyn :

Bilgisayarın saatinin herhangi birine ayarlanabileceğini anlıyor musunuz? Ona bağlanamazsın. Bu size zaten söylendi. Bu ilk.


Milisaniyelerden hatta saniyelerden bahsedersen ona bağlanamazsın. Dakikalardaki gecikmelerden bahsetmek oldukça mümkündür. Şimdi farkı onunla değil, piyasa saatindeki tüm semboller için son tik için maksimum süre .time_msc ile ölçüyorum.

Alexey Kozitsyn :

Bir SBER sembolünün (SymbolInfoTick) son işaretinin zaman gecikmesini bir SBER sembolünün (SymbolInfoInteger) son alıntı zamanından bulmak istiyorsunuz.

İstemiyorum.

Alexey Kozitsyn :

İkinci olarak, Market Watch'taki tüm semboller arasında son tik'in maksimum süresi de kullanılamaz.

Niye ya ? (Bilgisayara göre) son işareti ALMA zamanı değilim, yani .time_msc ile karşılaştırıyorum.

Alexey Kozitsyn :

kanıt olmadan iddia etti. Kodunuzu kanıt olarak görüyorsanız - bkz. "ikinci".

Genellikle geliştiriciler, sorunu yeniden oluşturmak için kod ister. İşte yakın zamanda yakalanan 2 saniyelik bir gecikme.

 14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)   Получен НОВЫЙ тик по символу                     GAZR- 3.19 time_msc= 2019.03 . 20 14 : 53 : 11.638
14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)   ХОТЯ до этого был получeн тик                        RTS- 3.19 time_msc 2019.03 . 20 14 : 53 : 13.695
14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)   Локальное время получения нового тика по символу.                                   2019.03 . 20 14 : 53 : 10.277
14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)   Предпоследние Локальное время попытки получить новый тик по символу     2019.03 . 20 14 : 53 : 10.259
Alexey Kozitsyn :

(yaklaşık çünkü daha fazla doğruluk için size tavsiye edildiği gibi bir bardak kullanmanız gerekir).

OnTimer yerine OnBookEvent kullanmam önerildi. uyguladım. Onayların alındığı ayarlarda OnTimer veya OnBookEvent arasından seçim yapabilirsiniz. OnBookEvent ile daha da kötü, yeni kene olaylarının sadece %70'ini yakalıyor.
Dosyalar:
 

pivomoe :

 14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)   Получен НОВЫЙ тик по символу                     GAZR- 3.19 time_msc= 2019.03 . 20 14 : 53 : 11.638
14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)   ХОТЯ до этого был получeн тик                        RTS- 3.19 time_msc 2019.03 . 20 14 : 53 : 13.695
14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)   Локальное время получения нового тика по символу.                                   2019.03 . 20 14 : 53 : 10.277
14 : 53 : 10.277     ProverkaAktyalnostiTikov (RTS- 3.19 ,H1)   Предпоследние Локальное время попытки получить новый тик по символу     2019.03 . 20 14 : 53 : 10.259

İşte sadece birkaç satır, ne istediğiniz açık görünüyor. Semboller arası senkronizasyon gibi bir şeyle ilgileniyorsunuz. Onlar. ihtiyacınız olan araçlar için verilerin genel uygunluğu.

Şu anda yardımcı olabileceğim bir şey yok, konuyla ilgilenmedim. Geliştiricilerle iletişim kurun.

 
Alexey Kozitsyn :

İşte sadece birkaç satır, ne istediğiniz açık görünüyor. Semboller arası senkronizasyon gibi bir şeyle ilgileniyorsunuz. Onlar. ihtiyacınız olan araçlar için verilerin genel uygunluğu.

Şu anda yardımcı olabileceğim bir şey yok, konuyla ilgilenmedim. Geliştiricilerle iletişim kurun.

Alexey (katılmak istemedi ama...).

Bu konunun 2. sayfasındaki "alaka düzeyi" (NEW_TICK) kodu değil mi?

 //+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK
};
//
int is_book;
ulong last_tick_time; //Время последнего тика
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
  last_tick_time = 0 ;
  is_book = MarketBookAdd ( Symbol ());
   if (is_book == false ) return ( INIT_FAILED );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (is_book == true ) MarketBookRelease ( Symbol ()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent ( const string &symbol)
{
   if (symbol == Symbol ())
  {
     MqlTick a_ticks[];
     int result = CopyTicks (symbol, a_ticks, COPY_TICKS_ALL , 0 , 1 );
     if (result > 0 )
    {
      FRESH_TICK tick_state = CheckTickTime(a_ticks[ 0 ]);
       switch (tick_state)
      {
       case UNKNOWN_TICK:; //Тик не определен
       break ;
       case NEW_TICK:;     //Торговое время, можно отсылать ордера;
       break ;
       case CUR_TICK:;     //По усмотрению разработчика;
       break ;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime( MqlTick &a_tick)
{
   MqlDateTime cur_time, tick_time;
  cur_time.year = 0 ;
   TimeTradeServer (cur_time); //Возвращает расчетное текущее время торгового сервера.
   if (cur_time.year > 0 )
  {
     if ( TimeToStruct (a_tick.time, tick_time) == true )
    {
       if (tick_time.day_of_year == cur_time.day_of_year)       //Проверка, что это сегодняшний тик
      {
         double t_msc = double (a_tick.time_msc - ulong (a_tick.time) * 1000 )/ 1000 ;
         double tr_time = double (tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec) + t_msc;
         if (((tr_time >= 36000 ) && (tr_time < 50370 )) ||   //10:00:00 - 13:59:30
           ((tr_time >= 50700 ) && (tr_time < 67470 )) ||   //14:05:00 - 19:44:30 
           ((tr_time >= 68700 ) && (tr_time < 85770 )))     //19:05:00 - 23:49:30
        {
           if ( ulong (a_tick.time_msc) > last_tick_time)
          {
            last_tick_time = ulong (a_tick.time_msc);
             return (NEW_TICK);
          } else return (CUR_TICK);  
        }
      }
    }
  }   
   return (UNKNOWN_TICK);
} 

Katma

CUR_TICK ile, bunun eskisi ile aynı kene olup olmadığını da kontrol edebilirsiniz.

yeni onay paketi, önceki pakette aktarılmayan bir onay işareti içeriyor.

 
prostotrader :

Alexey (katılmak istemedi ama...).

Bu konunun 2. sayfasındaki "alaka düzeyi" (NEW_TICK) kodu değil mi?

Hayır gibi görünüyor. Çünkü:

TimeTradeSunucusu

Ticaret sunucusunun tahmini geçerli saatini döndürür. TimeCurrent() işlevinin aksine, zaman değeri istemci terminalinde hesaplanır ve kullanıcının bilgisayarındaki zaman ayarlarına bağlıdır.

Onlar. yine, bilgisayarın saatine bağlıdır (ki bu, ölçümün doğruluğu için olmamalıdır).

Burada, elbette, pivomoe kodunun doğruluğunu kontrol etmeniz ve gerçekten bir söve varsa geliştiricilerle iletişim kurmanız gerekir.

 
prostotrader :

Görünüşe göre kontrolün TimeGMTOffset aracılığıyla yapılması gerekiyor. Daha sonra bir örnek yayınlayacağım.

 
Alexey Kozitsyn :

Hayır gibi görünüyor. Çünkü:


Koda dikkatlice bakın!

TimeTradeServer() sadece günü ve HER ŞEYİ belirlemek için alınır (bu kontrol "her ihtimale karşı" yapılır)!

TimeTradeServer() tamamen atlanabilir!

Katma

tekrarlıyorum

" CUR_TICK ile, bunun öncekiyle aynı onay olup olmadığını da kontrol edebilirsiniz veya

yeni onay paketi, önceki pakette aktarılmayan bir onay işareti içeriyor ve paket 1 onay işaretinden ("eski") "

 if ( ulong (a_tick.time_msc) > last_tick_time)
{
  last_tick_time = ulong (a_tick.time_msc);
   return (NEW_TICK);
}
 else
{
   //Дополнительные проверки 
}
 
Alexey Kozitsyn :

Burada, elbette, pivomoe kodunun doğruluğunu kontrol etmeniz ve gerçekten bir söve varsa geliştiricilerle iletişim kurmanız gerekir.

Cant, piyasa genel görünümünde düzinelerce sembol varsa veya genel bakışta birkaç sembol açıksa, ancak opera tarayıcısında birkaç düzine depozito varsa görünür. Geliştiricilere özel mesaj yoluyla yazdım.

Daha önce yazdığım gibi, sorun yeterince büyük bir Sleep ile çağrılar arasında çözülür, uyku(10) 40 karakter için yeterlidir. Doğru, karakter sayısındaki artışla birlikte, daha fazla sigara molası gerekiyor.